Skip to content

Commit c72e6bb

Browse files
scheglovCommit Queue
authored andcommitted
DeCo. Build elements from new ASTs.
For now just to understand the same syntax represented with new AST nodes. We now run element tests for classes, enums, extensions, extension types, and mixins in both modes: old AST and new AST. Bug: #61701 Change-Id: I768c16ea4a8bee4579732f80c1beb4bb8a42de43 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/457161 Reviewed-by: Paul Berry <paulberry@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
1 parent 180fbf1 commit c72e6bb

26 files changed

+850
-168
lines changed

pkg/analyzer/api.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,7 +1107,7 @@ package:analyzer/dart/ast/ast.dart:
11071107
superclass (getter: NamedType)
11081108
ExtensionDeclaration (class extends Object implements CompilationUnitMember):
11091109
augmentKeyword (getter: Token?)
1110-
body (getter: BlockClassBody?, experimental)
1110+
body (getter: BlockClassBody, experimental)
11111111
declaredFragment (getter: ExtensionFragment?)
11121112
extensionKeyword (getter: Token)
11131113
leftBracket (getter: Token)
@@ -1437,7 +1437,7 @@ package:analyzer/dart/ast/ast.dart:
14371437
MixinDeclaration (class extends Object implements NamedCompilationUnitMember):
14381438
augmentKeyword (getter: Token?)
14391439
baseKeyword (getter: Token?)
1440-
body (getter: ClassBody, experimental)
1440+
body (getter: BlockClassBody, experimental)
14411441
declaredFragment (getter: MixinFragment?)
14421442
implementsClause (getter: ImplementsClause?)
14431443
leftBracket (getter: Token)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,4 +303,4 @@ export 'package:analyzer/src/dart/ast/ast.dart'
303303
/// 8. [ExtensionTypeDeclaration.visitChildren] visits `namePart` and `body`,
304304
/// and does not visit `typeParameters`, `representation`, or `members`.
305305
@experimental
306-
bool useDeclaringConstructorsAst = false;
306+
bool useDeclaringConstructorsAst = default_useDeclaringConstructorsAst;

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

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import 'package:analyzer/dart/ast/ast.dart';
66
import 'package:analyzer/dart/ast/token.dart';
7+
import 'package:analyzer/src/dart/ast/ast.dart';
78

89
/// Compute the [DefinedNames] for the given [unit].
910
DefinedNames computeDefinedNames(CompilationUnit unit) {
@@ -28,21 +29,46 @@ DefinedNames computeDefinedNames(CompilationUnit unit) {
2829

2930
void appendTopLevelName(CompilationUnitMember member) {
3031
if (member is NamedCompilationUnitMember) {
31-
appendName(names.topLevelNames, member.name);
32-
if (member is ClassDeclaration) {
33-
member.members.forEach(appendClassMemberName);
34-
}
35-
if (member is EnumDeclaration) {
36-
for (var constant in member.constants) {
37-
appendName(names.classMemberNames, constant.name);
38-
}
39-
member.members.forEach(appendClassMemberName);
40-
}
41-
if (member is ExtensionTypeDeclaration) {
42-
member.members.forEach(appendClassMemberName);
43-
}
44-
if (member is MixinDeclaration) {
45-
member.members.forEach(appendClassMemberName);
32+
switch (member) {
33+
case ClassDeclarationImpl():
34+
if (useDeclaringConstructorsAst) {
35+
appendName(names.topLevelNames, member.namePart.typeName);
36+
member.body.members.forEach(appendClassMemberName);
37+
} else {
38+
appendName(names.topLevelNames, member.name);
39+
member.members.forEach(appendClassMemberName);
40+
}
41+
case EnumDeclaration():
42+
if (useDeclaringConstructorsAst) {
43+
appendName(names.topLevelNames, member.namePart.typeName);
44+
for (var constant in member.body.constants) {
45+
appendName(names.classMemberNames, constant.name);
46+
}
47+
member.body.members.forEach(appendClassMemberName);
48+
} else {
49+
appendName(names.topLevelNames, member.name);
50+
for (var constant in member.constants) {
51+
appendName(names.classMemberNames, constant.name);
52+
}
53+
member.members.forEach(appendClassMemberName);
54+
}
55+
case ExtensionTypeDeclarationImpl():
56+
if (useDeclaringConstructorsAst) {
57+
appendName(names.topLevelNames, member.namePart.typeName);
58+
member.body.members.forEach(appendClassMemberName);
59+
} else {
60+
appendName(names.topLevelNames, member.name);
61+
member.members.forEach(appendClassMemberName);
62+
}
63+
case MixinDeclaration():
64+
appendName(names.topLevelNames, member.name);
65+
if (useDeclaringConstructorsAst) {
66+
member.body.members.forEach(appendClassMemberName);
67+
} else {
68+
member.members.forEach(appendClassMemberName);
69+
}
70+
default:
71+
appendName(names.topLevelNames, member.name);
4672
}
4773
} else if (member is TopLevelVariableDeclaration) {
4874
for (VariableDeclaration variable in member.variables.variables) {

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:typed_data';
77

88
import 'package:analyzer/dart/analysis/declared_variables.dart';
99
import 'package:analyzer/dart/analysis/results.dart';
10+
import 'package:analyzer/dart/ast/ast.dart';
1011
import 'package:analyzer/diagnostic/diagnostic.dart';
1112
import 'package:analyzer/error/error.dart';
1213
import 'package:analyzer/error/listener.dart';
@@ -2487,7 +2488,9 @@ class AnalysisDriver {
24872488
static Uint32List _calculateSaltForElements(
24882489
DeclaredVariables declaredVariables,
24892490
) {
2490-
var buffer = ApiSignature()..addInt(DATA_VERSION);
2491+
var buffer = ApiSignature()
2492+
..addInt(DATA_VERSION)
2493+
..addBool(useDeclaringConstructorsAst);
24912494
_addDeclaredVariablesToSignature(buffer, declaredVariables);
24922495
return buffer.toUint32List();
24932496
}
@@ -2500,6 +2503,7 @@ class AnalysisDriver {
25002503
var buffer = ApiSignature()
25012504
..addInt(DATA_VERSION)
25022505
..addBool(enableIndex)
2506+
..addBool(useDeclaringConstructorsAst)
25032507
..addBool(enableDebugResolutionMarkers);
25042508
_addDeclaredVariablesToSignature(buffer, declaredVariables);
25052509

@@ -2512,7 +2516,8 @@ class AnalysisDriver {
25122516
static Uint32List _calculateSaltForUnlinked({required bool enableIndex}) {
25132517
var buffer = ApiSignature()
25142518
..addInt(DATA_VERSION)
2515-
..addBool(enableIndex);
2519+
..addBool(enableIndex)
2520+
..addBool(useDeclaringConstructorsAst);
25162521

25172522
return buffer.toUint32List();
25182523
}

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:_fe_analyzer_shared/src/scanner/string_canonicalizer.dart';
1111
import 'package:analyzer/dart/analysis/analysis_options.dart';
1212
import 'package:analyzer/dart/analysis/declared_variables.dart';
1313
import 'package:analyzer/dart/analysis/features.dart';
14+
import 'package:analyzer/dart/ast/ast.dart';
1415
import 'package:analyzer/dart/ast/token.dart';
1516
import 'package:analyzer/dart/element/element.dart';
1617
import 'package:analyzer/error/listener.dart';
@@ -1010,14 +1011,28 @@ class FileState {
10101011
var topLevelDeclarations = <String>{};
10111012
for (var declaration in unit.declarations) {
10121013
if (declaration is ClassDeclaration) {
1013-
topLevelDeclarations.add(declaration.name.lexeme);
1014+
if (useDeclaringConstructorsAst) {
1015+
topLevelDeclarations.add(declaration.namePart.typeName.lexeme);
1016+
} else {
1017+
topLevelDeclarations.add(declaration.name.lexeme);
1018+
}
10141019
} else if (declaration is EnumDeclaration) {
1015-
topLevelDeclarations.add(declaration.name.lexeme);
1020+
if (useDeclaringConstructorsAst) {
1021+
topLevelDeclarations.add(declaration.namePart.typeName.lexeme);
1022+
} else {
1023+
topLevelDeclarations.add(declaration.name.lexeme);
1024+
}
10161025
} else if (declaration is ExtensionDeclaration) {
10171026
var name = declaration.name;
10181027
if (name != null) {
10191028
topLevelDeclarations.add(name.lexeme);
10201029
}
1030+
} else if (declaration is ExtensionTypeDeclaration) {
1031+
if (useDeclaringConstructorsAst) {
1032+
topLevelDeclarations.add(declaration.namePart.typeName.lexeme);
1033+
} else {
1034+
topLevelDeclarations.add(declaration.name.lexeme);
1035+
}
10211036
} else if (declaration is FunctionDeclaration) {
10221037
topLevelDeclarations.add(declaration.name.lexeme);
10231038
} else if (declaration is MixinDeclaration) {

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

Lines changed: 64 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'package:analyzer/dart/ast/ast.dart';
66
import 'package:analyzer/dart/ast/token.dart';
77
import 'package:analyzer/dart/ast/visitor.dart';
8+
import 'package:analyzer/src/dart/ast/ast.dart';
89

910
/// Compute the set of external names referenced in the [unit].
1011
Set<String> computeReferencedNames(CompilationUnit unit) {
@@ -72,15 +73,26 @@ class _LocalNameScope {
7273

7374
factory _LocalNameScope.forClass(
7475
_LocalNameScope enclosing,
75-
ClassDeclaration node,
76+
ClassDeclarationImpl node,
7677
) {
7778
_LocalNameScope scope = _LocalNameScope(enclosing);
78-
scope.addTypeParameters(node.typeParameters);
79-
for (ClassMember member in node.members) {
80-
if (member is FieldDeclaration) {
81-
scope.addVariableNames(member.fields);
82-
} else if (member is MethodDeclaration) {
83-
scope.add(member.name);
79+
if (useDeclaringConstructorsAst) {
80+
scope.addTypeParameters(node.namePart.typeParameters);
81+
for (ClassMember member in node.body.members) {
82+
if (member is FieldDeclaration) {
83+
scope.addVariableNames(member.fields);
84+
} else if (member is MethodDeclaration) {
85+
scope.add(member.name);
86+
}
87+
}
88+
} else {
89+
scope.addTypeParameters(node.typeParameters);
90+
for (ClassMember member in node.members) {
91+
if (member is FieldDeclaration) {
92+
scope.addVariableNames(member.fields);
93+
} else if (member is MethodDeclaration) {
94+
scope.add(member.name);
95+
}
8496
}
8597
}
8698
return scope;
@@ -106,15 +118,26 @@ class _LocalNameScope {
106118

107119
factory _LocalNameScope.forExtensionType(
108120
_LocalNameScope enclosing,
109-
ExtensionTypeDeclaration node,
121+
ExtensionTypeDeclarationImpl node,
110122
) {
111123
var scope = _LocalNameScope(enclosing);
112-
scope.addTypeParameters(node.typeParameters);
113-
for (var member in node.members) {
114-
if (member is FieldDeclaration) {
115-
scope.addVariableNames(member.fields);
116-
} else if (member is MethodDeclaration) {
117-
scope.add(member.name);
124+
if (useDeclaringConstructorsAst) {
125+
scope.addTypeParameters(node.namePart.typeParameters);
126+
for (ClassMember member in node.body.members) {
127+
if (member is FieldDeclaration) {
128+
scope.addVariableNames(member.fields);
129+
} else if (member is MethodDeclaration) {
130+
scope.add(member.name);
131+
}
132+
}
133+
} else {
134+
scope.addTypeParameters(node.typeParameters);
135+
for (var member in node.members) {
136+
if (member is FieldDeclarationImpl) {
137+
scope.addVariableNames(member.fields);
138+
} else if (member is MethodDeclarationImpl) {
139+
scope.add(member.name);
140+
}
118141
}
119142
}
120143
return scope;
@@ -152,10 +175,29 @@ class _LocalNameScope {
152175
factory _LocalNameScope.forUnit(CompilationUnit node) {
153176
_LocalNameScope scope = _LocalNameScope(null);
154177
for (CompilationUnitMember declaration in node.declarations) {
155-
if (declaration is NamedCompilationUnitMember) {
156-
scope.add(declaration.name);
157-
} else if (declaration is TopLevelVariableDeclaration) {
158-
scope.addVariableNames(declaration.variables);
178+
switch (declaration) {
179+
case ClassDeclaration():
180+
if (useDeclaringConstructorsAst) {
181+
scope.add(declaration.namePart.typeName);
182+
} else {
183+
scope.add(declaration.name);
184+
}
185+
case EnumDeclaration():
186+
if (useDeclaringConstructorsAst) {
187+
scope.add(declaration.namePart.typeName);
188+
} else {
189+
scope.add(declaration.name);
190+
}
191+
case ExtensionTypeDeclaration():
192+
if (useDeclaringConstructorsAst) {
193+
scope.add(declaration.namePart.typeName);
194+
} else {
195+
scope.add(declaration.name);
196+
}
197+
case NamedCompilationUnitMember():
198+
scope.add(declaration.name);
199+
case TopLevelVariableDeclaration():
200+
scope.addVariableNames(declaration.variables);
159201
}
160202
}
161203
return scope;
@@ -216,7 +258,7 @@ class _ReferencedNamesComputer extends GeneralizingAstVisitor<void> {
216258
}
217259

218260
@override
219-
void visitClassDeclaration(ClassDeclaration node) {
261+
void visitClassDeclaration(covariant ClassDeclarationImpl node) {
220262
_LocalNameScope outerScope = localScope;
221263
try {
222264
localScope = _LocalNameScope.forClass(localScope, node);
@@ -262,7 +304,9 @@ class _ReferencedNamesComputer extends GeneralizingAstVisitor<void> {
262304
}
263305

264306
@override
265-
void visitExtensionTypeDeclaration(ExtensionTypeDeclaration node) {
307+
void visitExtensionTypeDeclaration(
308+
covariant ExtensionTypeDeclarationImpl node,
309+
) {
266310
var outerScope = localScope;
267311
try {
268312
localScope = _LocalNameScope.forExtensionType(localScope, node);

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

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:typed_data';
66

77
import 'package:analyzer/dart/ast/ast.dart';
88
import 'package:analyzer/dart/ast/token.dart';
9+
import 'package:analyzer/src/dart/ast/ast.dart';
910
import 'package:analyzer/src/dart/ast/invokes_super_self.dart';
1011
import 'package:analyzer/src/dart/ast/mixin_super_invoked_names.dart';
1112
import 'package:analyzer/src/summary/api_signature.dart';
@@ -38,7 +39,7 @@ class _UnitApiSignatureComputer {
3839

3940
signature.addInt(unit.declarations.length);
4041
for (var declaration in unit.declarations) {
41-
if (declaration is ClassDeclaration) {
42+
if (declaration is ClassDeclarationImpl) {
4243
_addClass(declaration);
4344
} else if (declaration is EnumDeclaration) {
4445
_addEnum(declaration);
@@ -61,14 +62,22 @@ class _UnitApiSignatureComputer {
6162
}
6263
}
6364

64-
void _addClass(ClassDeclaration node) {
65-
_addTokens(node.beginToken, node.leftBracket);
65+
void _addClass(ClassDeclarationImpl node) {
66+
if (useDeclaringConstructorsAst) {
67+
_addTokens(node.beginToken, node.body.beginToken);
68+
bool hasConstConstructor = node.body.members.any(
69+
(m) => m is ConstructorDeclarationImpl && m.constKeyword != null,
70+
);
71+
_addClassMembers(node.body.members, hasConstConstructor);
72+
} else {
73+
_addTokens(node.beginToken, node.leftBracket);
6674

67-
bool hasConstConstructor = node.members.any(
68-
(m) => m is ConstructorDeclaration && m.constKeyword != null,
69-
);
75+
bool hasConstConstructor = node.members.any(
76+
(m) => m is ConstructorDeclarationImpl && m.constKeyword != null,
77+
);
7078

71-
_addClassMembers(node.members, hasConstConstructor);
79+
_addClassMembers(node.members, hasConstConstructor);
80+
}
7281
}
7382

7483
void _addClassMembers(List<ClassMember> members, bool hasConstConstructor) {
@@ -94,7 +103,9 @@ class _UnitApiSignatureComputer {
94103
}
95104

96105
void _addEnum(EnumDeclaration node) {
97-
var members = node.members;
106+
var members = useDeclaringConstructorsAst
107+
? node.body.members
108+
: node.members;
98109

99110
// If not enhanced, include the whole node.
100111
var firstMember = members.firstOrNull;
@@ -108,8 +119,13 @@ class _UnitApiSignatureComputer {
108119
}
109120

110121
void _addExtension(ExtensionDeclaration node) {
111-
_addTokens(node.beginToken, node.leftBracket);
112-
_addClassMembers(node.members, false);
122+
if (useDeclaringConstructorsAst) {
123+
_addTokens(node.beginToken, node.body.beginToken);
124+
_addClassMembers(node.body.members, false);
125+
} else {
126+
_addTokens(node.beginToken, node.leftBracket);
127+
_addClassMembers(node.members, false);
128+
}
113129
}
114130

115131
void _addFieldDeclaration(FieldDeclaration node, bool hasConstConstructor) {
@@ -147,8 +163,13 @@ class _UnitApiSignatureComputer {
147163
}
148164

149165
void _addMixin(MixinDeclaration node) {
150-
_addTokens(node.beginToken, node.leftBracket);
151-
_addClassMembers(node.members, false);
166+
if (useDeclaringConstructorsAst) {
167+
_addTokens(node.beginToken, node.body.beginToken);
168+
_addClassMembers(node.body.members, false);
169+
} else {
170+
_addTokens(node.beginToken, node.leftBracket);
171+
_addClassMembers(node.members, false);
172+
}
152173
signature.addStringList(node.superInvokedNames);
153174
}
154175

0 commit comments

Comments
 (0)