Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit b311a00

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Fixes REMOVE_UNUSED_FIELD and optional field formal parameters.
[email protected] Change-Id: I15587001262ed70fb6e4b740fee12542acb6b1a9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138905 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent c83c9b4 commit b311a00

File tree

2 files changed

+208
-69
lines changed

2 files changed

+208
-69
lines changed

pkg/analysis_server/lib/src/services/correction/dart/remove_unused.dart

Lines changed: 64 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:analysis_server/src/services/correction/dart/abstract_producer.dart';
66
import 'package:analysis_server/src/services/correction/fix.dart';
77
import 'package:analyzer/dart/ast/ast.dart';
8+
import 'package:analyzer/dart/ast/token.dart';
89
import 'package:analyzer/dart/ast/visitor.dart';
910
import 'package:analyzer/dart/element/element.dart';
1011
import '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

125166
class _ElementReferenceCollector extends RecursiveAstVisitor<void> {

0 commit comments

Comments
 (0)