Skip to content

Commit a724453

Browse files
scheglovdart-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
AST. Implement DirectAssignment and UnqualifiedNameAssignmentTarget.
Bug: #63882 Change-Id: I70d1826d5158922731dfb2967a81bc6bf1b167ad Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/530260 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Paul Berry <paulberry@google.com>
1 parent 9bafb61 commit a724453

68 files changed

Lines changed: 2958 additions & 411 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -453,8 +453,8 @@ class ConvertToSwitchExpression extends ResolvedCorrectionProducer {
453453
canBeReturn = false;
454454
}
455455

456-
var statement = statements.first;
457-
if (statement is ExpressionStatementImpl) {
456+
Statement statement = statements.first;
457+
if (statement is ExpressionStatement) {
458458
var expression = statement.expression;
459459
// Any type of switch can have a throw expression as a statement.
460460
if (expression is ThrowExpression) {
@@ -470,7 +470,7 @@ class ConvertToSwitchExpression extends ResolvedCorrectionProducer {
470470
// A return switch case's statement can't be a non-throw expression.
471471
canBeReturn = false;
472472

473-
if (canBeArgument && expression is MethodInvocationImpl) {
473+
if (canBeArgument && expression is MethodInvocation) {
474474
// An assignment switch case's statement can't be a method invocation.
475475
canBeAssignment = false;
476476

@@ -482,12 +482,12 @@ class ConvertToSwitchExpression extends ResolvedCorrectionProducer {
482482
// The function invoked in each case must be the same.
483483
return null;
484484
}
485-
} else if (canBeAssignment && expression is AssignmentExpressionImpl) {
485+
} else if (canBeAssignment && expression is AssignmentExpression) {
486486
// An argument switch case's statement can't be an assignment.
487487
canBeArgument = false;
488488

489489
var leftHandSide = expression.leftHandSide;
490-
if (leftHandSide is! SimpleIdentifierImpl) return null;
490+
if (leftHandSide is! SimpleIdentifier) return null;
491491
if (writeElement == null) {
492492
var element = leftHandSide.element;
493493
if (element is! LocalVariableElement) return null;
@@ -508,7 +508,7 @@ class ConvertToSwitchExpression extends ResolvedCorrectionProducer {
508508
// it must be a return statement with a
509509
// non-null expression as part of a return switch.
510510
if (!canBeReturn ||
511-
statement is! ReturnStatementImpl ||
511+
statement is! ReturnStatement ||
512512
statement.expression == null) {
513513
return null;
514514
}

pkg/analyzer/api.txt

Lines changed: 44 additions & 0 deletions
Large diffs are not rendered by default.

pkg/analyzer/lib/analysis_rule/rule_visitor_registry.g.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,9 @@ abstract class RuleVisitorRegistry2 {
616616
AstVisitor2 visitor,
617617
);
618618

619+
@experimental
620+
void addDirectAssignment(AbstractAnalysisRule rule, AstVisitor2 visitor);
621+
619622
void addDoStatement(AbstractAnalysisRule rule, AstVisitor2 visitor);
620623

621624
void addDotShorthandConstructorInvocation(
@@ -1009,6 +1012,12 @@ abstract class RuleVisitorRegistry2 {
10091012
AstVisitor2 visitor,
10101013
);
10111014

1015+
@experimental
1016+
void addUnqualifiedNameAssignmentTarget(
1017+
AbstractAnalysisRule rule,
1018+
AstVisitor2 visitor,
1019+
);
1020+
10121021
void addVariableDeclaration(AbstractAnalysisRule rule, AstVisitor2 visitor);
10131022

10141023
void addVariableDeclarationList(

pkg/analyzer/lib/dart/ast/ast.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ export 'package:analyzer/src/dart/ast/ast.dart'
5353
AssertStatement,
5454
AssignedVariablePattern,
5555
AssignmentExpression,
56+
AssignmentExpression2,
57+
AssignmentTarget,
5658
AstNode,
5759
AstVisitor,
5860
AstVisitor2,
@@ -112,6 +114,7 @@ export 'package:analyzer/src/dart/ast/ast.dart'
112114
DotShorthandPropertyAccess,
113115
DottedName,
114116
DoubleLiteral,
117+
DirectAssignment,
115118
EmptyClassBody,
116119
EmptyEnumBody,
117120
EmptyFunctionBody,
@@ -171,6 +174,7 @@ export 'package:analyzer/src/dart/ast/ast.dart'
171174
InstanceReceiver,
172175
InstanceCreationExpression,
173176
IntegerLiteral,
177+
InvalidNamedWriteResolution,
174178
InterpolationElement,
175179
InterpolationExpression,
176180
InterpolationString,
@@ -199,7 +203,9 @@ export 'package:analyzer/src/dart/ast/ast.dart'
199203
MixinDeclaration,
200204
MixinOnClause,
201205
NamedArgument,
206+
NamedReadResolution,
202207
NamedType,
208+
NamedWriteResolution,
203209
NamespaceDirective,
204210
NameWithTypeParameters,
205211
NativeClause,
@@ -248,6 +254,7 @@ export 'package:analyzer/src/dart/ast/ast.dart'
248254
ReturnStatement,
249255
ScriptTag,
250256
SetOrMapLiteral,
257+
SetterInvocationResolution,
251258
ShowCombinator,
252259
SimpleIdentifier,
253260
SimpleStringLiteral,
@@ -281,10 +288,13 @@ export 'package:analyzer/src/dart/ast/ast.dart'
281288
UriBasedDirective,
282289
UnaryOperator,
283290
UnaryOperatorInvocation,
291+
UnqualifiedNameAssignmentTarget,
284292
VariableDeclaration,
285293
VariableDeclarationList,
286294
VariableDeclarationStatement,
287295
VariablePattern,
296+
VariableWriteResolution,
297+
ValidNamedWriteResolution,
288298
WhenClause,
289299
WhileStatement,
290300
WildcardPattern,

pkg/analyzer/lib/dart/ast/visitor.g.dart

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ class GeneralizingAstVisitor<R> implements AstVisitor<R> {
7777
R? visitAssignmentExpression(AssignmentExpression node) =>
7878
visitExpression(node);
7979

80+
@experimental
81+
R? visitAssignmentExpression2(AssignmentExpression2 node) =>
82+
visitExpression(node);
83+
84+
@experimental
85+
R? visitAssignmentTarget(AssignmentTarget node) => visitNode(node);
86+
8087
@override
8188
R? visitAwaitExpression(AwaitExpression node) => visitExpression(node);
8289

@@ -816,6 +823,13 @@ class GeneralizingAstVisitor2<R> implements AstVisitor2<R> {
816823
R? visitAssignmentExpression(AssignmentExpression node) =>
817824
visitExpression(node);
818825

826+
@experimental
827+
R? visitAssignmentExpression2(AssignmentExpression2 node) =>
828+
visitExpression(node);
829+
830+
@experimental
831+
R? visitAssignmentTarget(AssignmentTarget node) => visitNode(node);
832+
819833
@override
820834
R? visitAwaitExpression(AwaitExpression node) => visitExpression(node);
821835

@@ -953,6 +967,11 @@ class GeneralizingAstVisitor2<R> implements AstVisitor2<R> {
953967
R? visitDelimitedFormalParameters(DelimitedFormalParameters node) =>
954968
visitNode(node);
955969

970+
@experimental
971+
@override
972+
R? visitDirectAssignment(DirectAssignment node) =>
973+
visitAssignmentExpression2(node);
974+
956975
R? visitDirective(Directive node) => visitAnnotatedNode(node);
957976

958977
@override
@@ -1513,6 +1532,12 @@ class GeneralizingAstVisitor2<R> implements AstVisitor2<R> {
15131532
R? visitUnaryOperatorInvocation(UnaryOperatorInvocation node) =>
15141533
visitExpression(node);
15151534

1535+
@experimental
1536+
@override
1537+
R? visitUnqualifiedNameAssignmentTarget(
1538+
UnqualifiedNameAssignmentTarget node,
1539+
) => visitAssignmentTarget(node);
1540+
15161541
R? visitUriBasedDirective(UriBasedDirective node) => visitDirective(node);
15171542

15181543
@override
@@ -2963,6 +2988,13 @@ class RecursiveAstVisitor2<R> implements AstVisitor2<R> {
29632988
return null;
29642989
}
29652990

2991+
@experimental
2992+
@override
2993+
R? visitDirectAssignment(DirectAssignment node) {
2994+
node.visitChildren2(this);
2995+
return null;
2996+
}
2997+
29662998
@override
29672999
R? visitDoStatement(DoStatement node) {
29683000
node.visitChildren2(this);
@@ -3837,6 +3869,15 @@ class RecursiveAstVisitor2<R> implements AstVisitor2<R> {
38373869
return null;
38383870
}
38393871

3872+
@experimental
3873+
@override
3874+
R? visitUnqualifiedNameAssignmentTarget(
3875+
UnqualifiedNameAssignmentTarget node,
3876+
) {
3877+
node.visitChildren2(this);
3878+
return null;
3879+
}
3880+
38403881
@override
38413882
R? visitVariableDeclaration(VariableDeclaration node) {
38423883
node.visitChildren2(this);
@@ -4621,6 +4662,10 @@ class SimpleAstVisitor2<R> implements AstVisitor2<R> {
46214662
@override
46224663
R? visitDelimitedFormalParameters(DelimitedFormalParameters node) => null;
46234664

4665+
@experimental
4666+
@override
4667+
R? visitDirectAssignment(DirectAssignment node) => null;
4668+
46244669
@override
46254670
R? visitDoStatement(DoStatement node) => null;
46264671

@@ -5074,6 +5119,12 @@ class SimpleAstVisitor2<R> implements AstVisitor2<R> {
50745119
@override
50755120
R? visitUnaryOperatorInvocation(UnaryOperatorInvocation node) => null;
50765121

5122+
@experimental
5123+
@override
5124+
R? visitUnqualifiedNameAssignmentTarget(
5125+
UnqualifiedNameAssignmentTarget node,
5126+
) => null;
5127+
50775128
@override
50785129
R? visitVariableDeclaration(VariableDeclaration node) => null;
50795130

@@ -5861,6 +5912,10 @@ class ThrowingAstVisitor2<R> implements AstVisitor2<R> {
58615912
R? visitDelimitedFormalParameters(DelimitedFormalParameters node) =>
58625913
_throw(node);
58635914

5915+
@experimental
5916+
@override
5917+
R? visitDirectAssignment(DirectAssignment node) => _throw(node);
5918+
58645919
@override
58655920
R? visitDoStatement(DoStatement node) => _throw(node);
58665921

@@ -6322,6 +6377,12 @@ class ThrowingAstVisitor2<R> implements AstVisitor2<R> {
63226377
@override
63236378
R? visitUnaryOperatorInvocation(UnaryOperatorInvocation node) => _throw(node);
63246379

6380+
@experimental
6381+
@override
6382+
R? visitUnqualifiedNameAssignmentTarget(
6383+
UnqualifiedNameAssignmentTarget node,
6384+
) => _throw(node);
6385+
63256386
@override
63266387
R? visitVariableDeclaration(VariableDeclaration node) => _throw(node);
63276388

@@ -8230,6 +8291,15 @@ class TimedAstVisitor2<T> implements AstVisitor2<T> {
82308291
return result;
82318292
}
82328293

8294+
@experimental
8295+
@override
8296+
T? visitDirectAssignment(DirectAssignment node) {
8297+
stopwatch.start();
8298+
T? result = _baseVisitor.visitDirectAssignment(node);
8299+
stopwatch.stop();
8300+
return result;
8301+
}
8302+
82338303
@override
82348304
T? visitDoStatement(DoStatement node) {
82358305
stopwatch.start();
@@ -9388,6 +9458,17 @@ class TimedAstVisitor2<T> implements AstVisitor2<T> {
93889458
return result;
93899459
}
93909460

9461+
@experimental
9462+
@override
9463+
T? visitUnqualifiedNameAssignmentTarget(
9464+
UnqualifiedNameAssignmentTarget node,
9465+
) {
9466+
stopwatch.start();
9467+
T? result = _baseVisitor.visitUnqualifiedNameAssignmentTarget(node);
9468+
stopwatch.stop();
9469+
return result;
9470+
}
9471+
93919472
@override
93929473
T? visitVariableDeclaration(VariableDeclaration node) {
93939474
stopwatch.start();
@@ -10240,6 +10321,10 @@ class UnifyingAstVisitor2<R> implements AstVisitor2<R> {
1024010321
R? visitDelimitedFormalParameters(DelimitedFormalParameters node) =>
1024110322
visitNode(node);
1024210323

10324+
@experimental
10325+
@override
10326+
R? visitDirectAssignment(DirectAssignment node) => visitNode(node);
10327+
1024310328
@override
1024410329
R? visitDoStatement(DoStatement node) => visitNode(node);
1024510330

@@ -10720,6 +10805,12 @@ class UnifyingAstVisitor2<R> implements AstVisitor2<R> {
1072010805
R? visitUnaryOperatorInvocation(UnaryOperatorInvocation node) =>
1072110806
visitNode(node);
1072210807

10808+
@experimental
10809+
@override
10810+
R? visitUnqualifiedNameAssignmentTarget(
10811+
UnqualifiedNameAssignmentTarget node,
10812+
) => visitNode(node);
10813+
1072310814
@override
1072410815
R? visitVariableDeclaration(VariableDeclaration node) => visitNode(node);
1072510816

pkg/analyzer/lib/src/dart/analysis/driver.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ testFineAfterLibraryAnalyzerHook;
109109
// TODO(scheglov): Clean up the list of implicitly analyzed files.
110110
class AnalysisDriver {
111111
/// The version of data format, should be incremented on every format change.
112-
static const int DATA_VERSION = 667;
112+
static const int DATA_VERSION = 671;
113113

114114
/// The number of exception contexts allowed to write. Once this field is
115115
/// zero, we stop writing any new exception contexts in this process.

pkg/analyzer/lib/src/dart/analysis/index.dart

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,27 @@ class _IndexContributor extends GeneralizingAstVisitor2 {
920920
node.typeArguments?.accept2(this);
921921
}
922922

923+
@override
924+
void visitDirectAssignment(DirectAssignment node) {
925+
var target = node.target as UnqualifiedNameAssignmentTarget;
926+
var write = target.write;
927+
if (write is! ValidNamedWriteResolution) {
928+
assembler.addNameRelation(
929+
target.name.lexeme,
930+
IndexRelationKind.IS_WRITTEN_BY,
931+
target.offset,
932+
false,
933+
);
934+
} else {
935+
var element = write.element;
936+
if (element.firstFragment.enclosingFragment is LibraryFragmentImpl) {
937+
assembler.addPrefixForElement(element);
938+
}
939+
recordRelation(element, IndexRelationKind.IS_WRITTEN_BY, target, false);
940+
}
941+
super.visitDirectAssignment(node);
942+
}
943+
923944
@override
924945
void visitDotShorthandConstructorInvocation(
925946
DotShorthandConstructorInvocation node,

pkg/analyzer/lib/src/dart/analysis/referenced_names.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,13 @@ class _ReferencedNamesComputer extends GeneralizingAstVisitor2<void> {
420420
super.visitSuperFormalParameter(node);
421421
}
422422

423+
@override
424+
void visitUnqualifiedNameAssignmentTarget(
425+
UnqualifiedNameAssignmentTarget node,
426+
) {
427+
_addIfNotShadowed(node.name, hasImportPrefix: false);
428+
}
429+
423430
/// Adds [token] if it is not shadowed by a local element.
424431
void _addIfNotShadowed(Token token, {required bool hasImportPrefix}) {
425432
var name = token.lexeme;

pkg/analyzer/lib/src/dart/analysis/search.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,8 @@ class Search {
946946
}
947947
if (setter != null) {
948948
await _addResults(results, setter, const {
949+
IndexRelationKind.IS_WRITTEN_BY: SearchResultKind.WRITE,
950+
// TODO(scheglov): Remove when all assignment targets use IS_WRITTEN_BY.
949951
IndexRelationKind.IS_REFERENCED_BY: SearchResultKind.WRITE,
950952
});
951953
}
@@ -1861,6 +1863,20 @@ class _LocalReferencesVisitor extends RecursiveAstVisitor2<void> {
18611863
}
18621864
}
18631865

1866+
@override
1867+
void visitUnqualifiedNameAssignmentTarget(
1868+
UnqualifiedNameAssignmentTarget node,
1869+
) {
1870+
var write = node.write;
1871+
if (write is ValidNamedWriteResolution) {
1872+
var element = write.element;
1873+
var variable = element.tryCast<PropertyAccessorElement>()?.variable;
1874+
if (elements.contains(element) || elements.contains(variable)) {
1875+
_addResult(node, SearchResultKind.WRITE);
1876+
}
1877+
}
1878+
}
1879+
18641880
void _addResult(SyntacticEntity entity, SearchResultKind kind) {
18651881
bool isQualified = entity is AstNode && entity.parent2 is Label;
18661882
_addResultImpl(entity, kind, isQualified: isQualified);

0 commit comments

Comments
 (0)