@@ -54,79 +54,103 @@ const REFLECT_MUTATION_METHODS: [&str; 4] =
5454 [ "defineProperty" , "deleteProperty" , "set" , "setPrototypeOf" ] ;
5555
5656impl Rule for NoImportAssign {
57- fn run_on_symbol ( & self , symbol_id : SymbolId , ctx : & LintContext < ' _ > ) {
58- let symbol_table = ctx. scoping ( ) ;
59- if symbol_table. symbol_flags ( symbol_id) . is_import ( ) {
60- let kind = ctx. nodes ( ) . kind ( symbol_table. symbol_declaration ( symbol_id) ) ;
61- let is_namespace_specifier = matches ! ( kind, AstKind :: ImportNamespaceSpecifier ( _) ) ;
62- for reference in symbol_table. get_resolved_references ( symbol_id) {
63- if is_namespace_specifier {
64- let parent_node = ctx. nodes ( ) . parent_node ( reference. node_id ( ) ) ;
65- if parent_node. kind ( ) . is_member_expression_kind ( ) {
66- let expr = parent_node. kind ( ) ;
67- let parent_parent_node = ctx. nodes ( ) . parent_node ( parent_node. id ( ) ) ;
68- let is_unary_expression_with_delete_operator = |kind| matches ! ( kind, AstKind :: UnaryExpression ( expr) if expr. operator == UnaryOperator :: Delete ) ;
69- let parent_parent_kind = parent_parent_node. kind ( ) ;
70- if ( matches ! ( parent_parent_kind, AstKind :: IdentifierReference ( _) )
71- || is_unary_expression_with_delete_operator ( parent_parent_kind)
72- || matches ! ( parent_parent_kind, AstKind :: ChainExpression ( _) if is_unary_expression_with_delete_operator( ctx. nodes( ) . parent_kind( parent_parent_node. id( ) ) ) ) )
73- && let Some ( ( span, _) ) = match expr {
74- AstKind :: StaticMemberExpression ( expr) => {
75- Some ( expr. static_property_info ( ) )
57+ fn run < ' a > ( & self , node : & AstNode < ' a > , ctx : & LintContext < ' a > ) {
58+ match node. kind ( ) {
59+ AstKind :: ImportDeclaration ( import_decl) => {
60+ let symbol_table = ctx. scoping ( ) ;
61+ if let Some ( specifiers) = & import_decl. specifiers {
62+ for specifier in specifiers {
63+ let symbol_id = specifier. local ( ) . symbol_id ( ) ;
64+ let is_namespace_specifier = matches ! (
65+ specifier,
66+ oxc_ast:: ast:: ImportDeclarationSpecifier :: ImportNamespaceSpecifier ( _)
67+ ) ;
68+ for reference in symbol_table. get_resolved_references ( symbol_id) {
69+ if is_namespace_specifier {
70+ let parent_node = ctx. nodes ( ) . parent_node ( reference. node_id ( ) ) ;
71+ if parent_node. kind ( ) . is_member_expression_kind ( ) {
72+ let expr = parent_node. kind ( ) ;
73+ let parent_parent_node =
74+ ctx. nodes ( ) . parent_node ( parent_node. id ( ) ) ;
75+ let is_unary_expression_with_delete_operator = |kind| {
76+ matches ! (
77+ kind,
78+ AstKind :: UnaryExpression ( expr)
79+ if expr. operator == UnaryOperator :: Delete
80+ )
81+ } ;
82+ let parent_parent_kind = parent_parent_node. kind ( ) ;
83+ if ( matches ! (
84+ parent_parent_kind,
85+ AstKind :: IdentifierReference ( _)
86+ ) || is_unary_expression_with_delete_operator (
87+ parent_parent_kind,
88+ ) || matches ! ( parent_parent_kind, AstKind :: ChainExpression ( _) if is_unary_expression_with_delete_operator( ctx. nodes( ) . parent_kind( parent_parent_node. id( ) ) ) ) )
89+ && let Some ( ( span, _) ) = match expr {
90+ AstKind :: StaticMemberExpression ( expr) => {
91+ Some ( expr. static_property_info ( ) )
92+ }
93+ AstKind :: ComputedMemberExpression ( expr) => {
94+ expr. static_property_info ( )
95+ }
96+ _ => return ,
97+ }
98+ && span != ctx. semantic ( ) . reference_span ( reference)
99+ {
100+ return ctx
101+ . diagnostic ( no_import_assign_diagnostic ( expr. span ( ) ) ) ;
102+ }
103+ // Check for assignment to namespace property
104+ match expr {
105+ AstKind :: StaticMemberExpression ( member_expr) => {
106+ let condition_met = is_assignment_condition_met (
107+ & parent_parent_kind,
108+ parent_node. span ( ) ,
109+ true , // is_static
110+ ) ;
111+ check_namespace_member_assignment (
112+ & member_expr. object ,
113+ parent_node,
114+ reference,
115+ ctx,
116+ condition_met,
117+ ) ;
118+ }
119+ AstKind :: ComputedMemberExpression ( member_expr) => {
120+ let condition_met = is_assignment_condition_met (
121+ & parent_parent_kind,
122+ parent_node. span ( ) ,
123+ false , // is_static
124+ ) ;
125+ check_namespace_member_assignment (
126+ & member_expr. object ,
127+ parent_node,
128+ reference,
129+ ctx,
130+ condition_met,
131+ ) ;
132+ }
133+ _ => { }
134+ }
76135 }
77- AstKind :: ComputedMemberExpression ( expr) => {
78- expr. static_property_info ( )
79- }
80- _ => return ,
81- }
82- && span != ctx. semantic ( ) . reference_span ( reference)
83- {
84- return ctx. diagnostic ( no_import_assign_diagnostic ( expr. span ( ) ) ) ;
85- }
86- // Check for assignment to namespace property
87- match expr {
88- AstKind :: StaticMemberExpression ( member_expr) => {
89- let condition_met = is_assignment_condition_met (
90- & parent_parent_kind,
91- parent_node. span ( ) ,
92- true , // is_static
93- ) ;
94- check_namespace_member_assignment (
95- & member_expr. object ,
96- parent_node,
97- reference,
98- ctx,
99- condition_met,
100- ) ;
101136 }
102- AstKind :: ComputedMemberExpression ( member_expr) => {
103- let condition_met = is_assignment_condition_met (
104- & parent_parent_kind,
105- parent_node. span ( ) ,
106- false , // is_static
107- ) ;
108- check_namespace_member_assignment (
109- & member_expr. object ,
110- parent_node,
111- reference,
112- ctx,
113- condition_met,
114- ) ;
137+
138+ if reference. is_write ( )
139+ || ( is_namespace_specifier
140+ && is_argument_of_well_known_mutation_function (
141+ reference. node_id ( ) ,
142+ ctx,
143+ ) )
144+ {
145+ ctx. diagnostic ( no_import_assign_diagnostic (
146+ ctx. semantic ( ) . reference_span ( reference) ,
147+ ) ) ;
115148 }
116- _ => { }
117149 }
118150 }
119151 }
120-
121- if reference. is_write ( )
122- || ( is_namespace_specifier
123- && is_argument_of_well_known_mutation_function ( reference. node_id ( ) , ctx) )
124- {
125- ctx. diagnostic ( no_import_assign_diagnostic (
126- ctx. semantic ( ) . reference_span ( reference) ,
127- ) ) ;
128- }
129152 }
153+ _ => { }
130154 }
131155 }
132156}
0 commit comments