55import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart' ;
66import 'package:analysis_server/src/services/correction/fix.dart' ;
77import 'package:analyzer/dart/ast/ast.dart' ;
8+ import 'package:analyzer/dart/ast/token.dart' ;
89import 'package:analyzer/dart/ast/visitor.dart' ;
910import 'package:analyzer/dart/element/element.dart' ;
1011import 'package:analyzer/source/source_range.dart' ;
@@ -65,6 +66,7 @@ class RemoveUnusedField extends _RemoveUnused {
6566 if (declaration is ! VariableDeclaration ) {
6667 return ;
6768 }
69+
6870 final element = (declaration as VariableDeclaration ).declaredElement;
6971 if (element is ! FieldElement ) {
7072 return ;
@@ -82,32 +84,13 @@ class RemoveUnusedField extends _RemoveUnused {
8284 if (referenceNode == null ) {
8385 return ;
8486 }
85- var sourceRange;
87+ SourceRange sourceRange;
8688 if (referenceNode is VariableDeclaration ) {
87- VariableDeclarationList parent = referenceNode.parent;
88- if (parent.variables.length == 1 ) {
89- sourceRange = utils.getLinesRange (range.node (parent.parent));
90- } else {
91- sourceRange = range.nodeInList (parent.variables, referenceNode);
92- }
89+ sourceRange = _forVariableDeclaration (referenceNode);
9390 } else if (referenceNode is ConstructorFieldInitializer ) {
94- ConstructorDeclaration cons =
95- referenceNode.parent as ConstructorDeclaration ;
96- // A() : _f = 0;
97- if (cons.initializers.length == 1 ) {
98- sourceRange = range.endEnd (cons.parameters, referenceNode);
99- } else {
100- sourceRange = range.nodeInList (cons.initializers, referenceNode);
101- }
91+ sourceRange = _forConstructorFieldInitializer (referenceNode);
10292 } else if (referenceNode is FieldFormalParameter ) {
103- FormalParameterList params =
104- referenceNode.parent as FormalParameterList ;
105- if (params.parameters.length == 1 ) {
106- sourceRange =
107- range.endStart (params.leftParenthesis, params.rightParenthesis);
108- } else {
109- sourceRange = range.nodeInList (params.parameters, referenceNode);
110- }
93+ sourceRange = _forFieldFormalParameter (referenceNode);
11194 } else {
11295 sourceRange = utils.getLinesRange (range.node (referenceNode));
11396 }
@@ -120,6 +103,64 @@ class RemoveUnusedField extends _RemoveUnused {
120103 }
121104 });
122105 }
106+
107+ SourceRange _forConstructorFieldInitializer (
108+ ConstructorFieldInitializer node,
109+ ) {
110+ final constructor = node.parent as ConstructorDeclaration ;
111+ if (constructor.initializers.length == 1 ) {
112+ return range.endEnd (constructor.parameters, node);
113+ } else {
114+ return range.nodeInList (constructor.initializers, node);
115+ }
116+ }
117+
118+ SourceRange _forFieldFormalParameter (FieldFormalParameter node) {
119+ var parameter = node.parent is DefaultFormalParameter ? node.parent : node;
120+ var parameterList = parameter.parent as FormalParameterList ;
121+
122+ // (node) -> ()
123+ if (parameterList.parameters.length == 1 ) {
124+ return range.endStart (
125+ parameterList.leftParenthesis,
126+ parameterList.rightParenthesis,
127+ );
128+ }
129+
130+ var prevToken = parameter.beginToken.previous;
131+ var nextToken = parameter.endToken.next;
132+
133+ // (node, tail) -> (tail)
134+ if (nextToken.type == TokenType .COMMA ) {
135+ nextToken = nextToken.next;
136+ return range.startStart (parameter.beginToken, nextToken);
137+ }
138+
139+ // (head, node) -> (head)
140+ // (head, node, tail) -> (head, tail)
141+ var isFirstOptional = prevToken.type == TokenType .OPEN_CURLY_BRACKET ||
142+ prevToken.type == TokenType .OPEN_SQUARE_BRACKET ;
143+ if (isFirstOptional) {
144+ prevToken = prevToken.previous;
145+ }
146+ if (isFirstOptional) {
147+ var isLastOptional = nextToken.type == TokenType .CLOSE_CURLY_BRACKET ||
148+ nextToken.type == TokenType .CLOSE_SQUARE_BRACKET ;
149+ if (isLastOptional) {
150+ nextToken = nextToken.next;
151+ }
152+ }
153+ return range.endStart (prevToken.previous, nextToken);
154+ }
155+
156+ SourceRange _forVariableDeclaration (VariableDeclaration node) {
157+ VariableDeclarationList parent = node.parent;
158+ if (parent.variables.length == 1 ) {
159+ return utils.getLinesRange (range.node (parent.parent));
160+ } else {
161+ return range.nodeInList (parent.variables, node);
162+ }
163+ }
123164}
124165
125166class _ElementReferenceCollector extends RecursiveAstVisitor <void > {
0 commit comments