4
4
5
5
import 'package:analyzer/dart/ast/ast.dart' ;
6
6
import 'package:analyzer/dart/ast/visitor.dart' ;
7
+ import 'package:analyzer/dart/element/element.dart' ;
7
8
8
9
import '../analyzer.dart' ;
9
10
@@ -125,16 +126,48 @@ class _DeclarationVisitor extends RecursiveAstVisitor {
125
126
{required this .paramIsNotNullByDefault,
126
127
required this .paramDefaultsToNull});
127
128
129
+ Element ? get parameterElement => parameter.declaredElement;
130
+
131
+ void checkPatternElements (DartPattern node) {
132
+ NodeList <PatternField >? fields;
133
+ if (node is RecordPattern ) fields = node.fields;
134
+ if (node is ObjectPattern ) fields = node.fields;
135
+ if (fields != null ) {
136
+ for (var field in fields) {
137
+ if (field.pattern.element == parameterElement) {
138
+ reportLint (node);
139
+ }
140
+ }
141
+ } else {
142
+ List <AstNode >? elements;
143
+ if (node is ListPattern ) elements = node.elements;
144
+ if (node is MapPattern ) elements = node.elements;
145
+ if (elements == null ) return ;
146
+ for (var element in elements) {
147
+ if (element is MapPatternEntry ) {
148
+ element = element.value;
149
+ }
150
+ if (element.element == parameterElement) {
151
+ reportLint (node);
152
+ }
153
+ }
154
+ }
155
+ }
156
+
157
+ void reportLint (AstNode node) {
158
+ rule.reportLint (node, arguments: [parameter.name! .lexeme]);
159
+ }
160
+
128
161
@override
129
162
visitAssignmentExpression (AssignmentExpression node) {
130
163
if (paramIsNotNullByDefault) {
131
164
if (_isFormalParameterReassigned (parameter, node)) {
132
- rule. reportLint (node, arguments : [parameter.name ! .lexeme] );
165
+ reportLint (node);
133
166
}
134
167
} else if (paramDefaultsToNull) {
135
168
if (_isFormalParameterReassigned (parameter, node)) {
136
169
if (hasBeenAssigned) {
137
- rule. reportLint (node, arguments : [parameter.name ! .lexeme] );
170
+ reportLint (node);
138
171
}
139
172
hasBeenAssigned = true ;
140
173
}
@@ -143,13 +176,20 @@ class _DeclarationVisitor extends RecursiveAstVisitor {
143
176
super .visitAssignmentExpression (node);
144
177
}
145
178
179
+ @override
180
+ visitPatternAssignment (PatternAssignment node) {
181
+ checkPatternElements (node.pattern);
182
+
183
+ super .visitPatternAssignment (node);
184
+ }
185
+
146
186
@override
147
187
visitPostfixExpression (PostfixExpression node) {
148
188
if (paramIsNotNullByDefault) {
149
189
var operand = node.operand;
150
190
if (operand is SimpleIdentifier &&
151
- operand.staticElement == parameter.declaredElement ) {
152
- rule. reportLint (node, arguments : [parameter.name ! .lexeme] );
191
+ operand.staticElement == parameterElement ) {
192
+ reportLint (node);
153
193
}
154
194
}
155
195
@@ -161,8 +201,8 @@ class _DeclarationVisitor extends RecursiveAstVisitor {
161
201
if (paramIsNotNullByDefault) {
162
202
var operand = node.operand;
163
203
if (operand is SimpleIdentifier &&
164
- operand.staticElement == parameter.declaredElement ) {
165
- rule. reportLint (node, arguments : [parameter.name ! .lexeme] );
204
+ operand.staticElement == parameterElement ) {
205
+ reportLint (node);
166
206
}
167
207
}
168
208
@@ -206,3 +246,11 @@ class _Visitor extends SimpleAstVisitor<void> {
206
246
}
207
247
}
208
248
}
249
+
250
+ extension on AstNode {
251
+ Element ? get element {
252
+ var self = this ;
253
+ if (self is AssignedVariablePattern ) return self.element;
254
+ return null ;
255
+ }
256
+ }
0 commit comments