Skip to content

Commit 1aba73d

Browse files
scheglovCommit Queue
authored andcommitted
DeCo. Resolve ClassDeclaration and EnumDeclaration when useDeclaringConstructorsAst is true.
Bug: #61701 Change-Id: I41f79ffe719c2a874e72e76eacbbd7005a0dee09 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/460961 Reviewed-by: Paul Berry <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent abe20ee commit 1aba73d

16 files changed

+1450
-36
lines changed

pkg/analyzer/api.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1558,6 +1558,7 @@ package:analyzer/dart/ast/ast.dart:
15581558
PrimaryConstructorDeclaration (class extends Object implements ClassNamePart, experimental):
15591559
constKeyword (getter: Token?)
15601560
constructorName (getter: PrimaryConstructorName?)
1561+
declaredFragment (getter: ConstructorFragment?)
15611562
formalParameters (getter: FormalParameterList)
15621563
PrimaryConstructorName (class extends Object implements AstNode, experimental):
15631564
name (getter: Token)

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:analyzer/dart/ast/ast.dart';
56
import 'package:analyzer/dart/ast/syntactic_entity.dart';
67
import 'package:analyzer/dart/ast/token.dart';
78
import 'package:analyzer/dart/ast/visitor.dart';
@@ -712,15 +713,17 @@ class _IndexContributor extends GeneralizingAstVisitor {
712713
}
713714

714715
@override
715-
void visitClassDeclaration(ClassDeclaration node) {
716+
void visitClassDeclaration(covariant ClassDeclarationImpl node) {
716717
_addSubtypeForClassDeclaration(node);
717718
var declaredElement = node.declaredFragment!.element;
718719
if (node.extendsClause == null) {
719720
var objectElement = declaredElement.supertype?.element;
720721
recordRelationOffset(
721722
objectElement,
722723
IndexRelationKind.IS_EXTENDED_BY,
723-
node.name.offset,
724+
useDeclaringConstructorsAst
725+
? node.namePart.typeName.offset
726+
: node.name.offset,
724727
0,
725728
true,
726729
);
@@ -739,7 +742,7 @@ class _IndexContributor extends GeneralizingAstVisitor {
739742
recordRelation(
740743
superConstructor,
741744
IndexRelationKind.IS_INVOKED_BY,
742-
node.name,
745+
useDeclaringConstructorsAst ? node.namePart.typeName : node.name,
743746
true,
744747
);
745748
}
@@ -923,10 +926,12 @@ class _IndexContributor extends GeneralizingAstVisitor {
923926
@override
924927
void visitEnumDeclaration(EnumDeclaration node) {
925928
_addSubtype(
926-
node.name.lexeme,
929+
(useDeclaringConstructorsAst ? node.namePart.typeName : node.name).lexeme,
927930
withClause: node.withClause,
928931
implementsClause: node.implementsClause,
929-
memberNodes: node.members,
932+
memberNodes: useDeclaringConstructorsAst
933+
? node.body.members
934+
: node.members,
930935
);
931936

932937
var declaredElement = node.declaredFragment!.element;
@@ -1335,13 +1340,17 @@ class _IndexContributor extends GeneralizingAstVisitor {
13351340
}
13361341

13371342
/// Record the given class as a subclass of its direct superclasses.
1338-
void _addSubtypeForClassDeclaration(ClassDeclaration node) {
1343+
void _addSubtypeForClassDeclaration(ClassDeclarationImpl node) {
13391344
_addSubtype(
1340-
node.name.lexeme,
1345+
useDeclaringConstructorsAst
1346+
? node.namePart.typeName.lexeme
1347+
: node.name.lexeme,
13411348
superclass: node.extendsClause?.superclass,
13421349
withClause: node.withClause,
13431350
implementsClause: node.implementsClause,
1344-
memberNodes: node.members,
1351+
memberNodes: useDeclaringConstructorsAst
1352+
? node.body.members
1353+
: node.members,
13451354
);
13461355
}
13471356

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20046,6 +20046,11 @@ abstract final class PrimaryConstructorDeclaration implements ClassNamePart {
2004620046
/// The name of the primary constructor.
2004720047
PrimaryConstructorName? get constructorName;
2004820048

20049+
/// The fragment declared by this declaration.
20050+
///
20051+
/// Returns `null` if the AST structure hasn't been resolved.
20052+
ConstructorFragment? get declaredFragment;
20053+
2004920054
/// The formal parameters of the constructor, including declaring.
2005020055
FormalParameterList get formalParameters;
2005120056
}
@@ -20078,6 +20083,9 @@ final class PrimaryConstructorDeclarationImpl extends ClassNamePartImpl
2007820083
@generated
2007920084
FormalParameterListImpl _formalParameters;
2008020085

20086+
@override
20087+
ConstructorFragmentImpl? declaredFragment;
20088+
2008120089
@generated
2008220090
PrimaryConstructorDeclarationImpl({
2008320091
required this.constKeyword,

pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:_fe_analyzer_shared/src/type_inference/type_analyzer.dart'
66
as shared;
77
import 'package:_fe_analyzer_shared/src/type_inference/variable_bindings.dart';
88
import 'package:analyzer/dart/analysis/features.dart';
9+
import 'package:analyzer/dart/ast/ast.dart';
910
import 'package:analyzer/dart/ast/token.dart';
1011
import 'package:analyzer/dart/ast/visitor.dart';
1112
import 'package:analyzer/dart/element/element.dart';
@@ -300,8 +301,13 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
300301

301302
_withElementWalker(ElementWalker.forClass(fragment), () {
302303
_withNameScope(() {
303-
_buildTypeParameterElements(node.typeParameters);
304-
node.typeParameters?.accept(this);
304+
if (useDeclaringConstructorsAst) {
305+
_buildTypeParameterElements(node.namePart.typeParameters);
306+
node.namePart.accept(this);
307+
} else {
308+
_buildTypeParameterElements(node.typeParameters);
309+
node.typeParameters?.accept(this);
310+
}
305311

306312
var extendsClause = node.extendsClause;
307313
var withClause = node.withClause;
@@ -323,7 +329,11 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
323329
_defineElements(element.getters);
324330
_defineElements(element.setters);
325331
_defineElements(element.methods);
326-
node.members.accept(this);
332+
if (useDeclaringConstructorsAst) {
333+
node.body.accept(this);
334+
} else {
335+
node.members.accept(this);
336+
}
327337
});
328338
});
329339

@@ -538,8 +548,13 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
538548

539549
_withElementWalker(ElementWalker.forEnum(fragment), () {
540550
_withNameScope(() {
541-
_buildTypeParameterElements(node.typeParameters);
542-
node.typeParameters?.accept(this);
551+
if (useDeclaringConstructorsAst) {
552+
_buildTypeParameterElements(node.namePart.typeParameters);
553+
node.namePart.accept(this);
554+
} else {
555+
_buildTypeParameterElements(node.typeParameters);
556+
node.typeParameters?.accept(this);
557+
}
543558

544559
_resolveWithClause(declaration: node, clause: node.withClause);
545560
_resolveImplementsClause(
@@ -550,8 +565,12 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
550565
_defineElements(element.getters);
551566
_defineElements(element.setters);
552567
_defineElements(element.methods);
553-
node.constants.accept(this);
554-
node.members.accept(this);
568+
if (useDeclaringConstructorsAst) {
569+
node.body.accept(this);
570+
} else {
571+
node.constants.accept(this);
572+
node.members.accept(this);
573+
}
555574
});
556575
});
557576

@@ -1209,6 +1228,24 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
12091228
super.visitPrefixedIdentifier(node);
12101229
}
12111230

1231+
@override
1232+
void visitPrimaryConstructorDeclaration(
1233+
covariant PrimaryConstructorDeclarationImpl node,
1234+
) {
1235+
var fragment = _elementWalker!.getConstructor();
1236+
node.declaredFragment = fragment;
1237+
1238+
_withElementHolder(ElementHolder(fragment), () {
1239+
_withElementWalker(null, () {
1240+
_withNameScope(() {
1241+
_withElementWalker(ElementWalker.forExecutable(fragment), () {
1242+
node.formalParameters.accept(this);
1243+
});
1244+
});
1245+
});
1246+
});
1247+
}
1248+
12121249
@override
12131250
void visitPropertyAccess(covariant PropertyAccessImpl node) {
12141251
var newNode = _astRewriter.propertyAccess(_nameScope, node);

pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/analysis/features.dart';
6+
import 'package:analyzer/dart/ast/ast.dart';
67
import 'package:analyzer/dart/ast/token.dart';
78
import 'package:analyzer/dart/element/element.dart';
89
import 'package:analyzer/error/error.dart';
@@ -235,6 +236,22 @@ class DuplicateDefinitionVerifier {
235236
);
236237
}
237238
}
239+
} else if (member is ClassDeclarationImpl) {
240+
var declaredFragment = member.declaredFragment!;
241+
_checkDuplicateIdentifier(
242+
definedGetters,
243+
useDeclaringConstructorsAst ? member.namePart.typeName : member.name,
244+
fragment: declaredFragment,
245+
setterScope: definedSetters,
246+
);
247+
} else if (member is EnumDeclarationImpl) {
248+
var declaredFragment = member.declaredFragment!;
249+
_checkDuplicateIdentifier(
250+
definedGetters,
251+
useDeclaringConstructorsAst ? member.namePart.typeName : member.name,
252+
fragment: declaredFragment,
253+
setterScope: definedSetters,
254+
);
238255
} else if (member is NamedCompilationUnitMemberImpl) {
239256
var declaredFragment = member.declaredFragment!;
240257
_checkDuplicateIdentifier(
@@ -382,7 +399,10 @@ class MemberDuplicateDefinitionVerifier {
382399
);
383400

384401
void _checkClass(ClassDeclarationImpl node) {
385-
_checkClassMembers(node.declaredFragment!, node.members);
402+
_checkClassMembers(
403+
node.declaredFragment!,
404+
useDeclaringConstructorsAst ? node.body.members : node.members,
405+
);
386406
}
387407

388408
/// Check that there are no members with the same name.
@@ -638,7 +658,8 @@ class MemberDuplicateDefinitionVerifier {
638658
var elementContext = _getElementContext(firstFragment);
639659
var staticScope = elementContext.staticScope;
640660

641-
for (var constant in node.constants) {
661+
for (var constant
662+
in useDeclaringConstructorsAst ? node.body.constants : node.constants) {
642663
if (constant.name.lexeme == declarationName) {
643664
_diagnosticReporter.atToken(
644665
constant.name,
@@ -656,7 +677,10 @@ class MemberDuplicateDefinitionVerifier {
656677
_checkValuesDeclarationInEnum(constant.name);
657678
}
658679

659-
_checkClassMembers(fragment, node.members);
680+
_checkClassMembers(
681+
fragment,
682+
useDeclaringConstructorsAst ? node.body.members : node.members,
683+
);
660684

661685
if (declarationName == 'values') {
662686
_diagnosticReporter.atToken(
@@ -846,7 +870,12 @@ class MemberDuplicateDefinitionVerifier {
846870
switch (declaration) {
847871
case ClassDeclarationImpl():
848872
var fragment = declaration.declaredFragment!;
849-
_checkClassStatic(fragment, declaration.members);
873+
_checkClassStatic(
874+
fragment,
875+
useDeclaringConstructorsAst
876+
? declaration.body.members
877+
: declaration.members,
878+
);
850879
case EnumDeclarationImpl():
851880
_checkEnumStatic(declaration);
852881
case ExtensionDeclarationImpl():

pkg/analyzer/lib/src/error/inheritance_override.dart

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// BSD-style license that can be found in the LICENSE file.
44

55
import 'package:analyzer/dart/analysis/features.dart';
6+
import 'package:analyzer/dart/ast/ast.dart';
67
import 'package:analyzer/dart/ast/syntactic_entity.dart';
78
import 'package:analyzer/dart/ast/token.dart';
89
import 'package:analyzer/dart/element/element.dart';
@@ -50,10 +51,14 @@ class InheritanceOverrideVerifier {
5051
reporter: _reporter,
5152
featureSet: unit.featureSet,
5253
library: library,
53-
classNameToken: declaration.name,
54+
classNameToken: useDeclaringConstructorsAst
55+
? declaration.namePart.typeName
56+
: declaration.name,
5457
classElement: fragment.element,
5558
implementsClause: declaration.implementsClause,
56-
members: declaration.members,
59+
members: useDeclaringConstructorsAst
60+
? declaration.body.members
61+
: declaration.members,
5762
superclass: declaration.extendsClause?.superclass,
5863
withClause: declaration.withClause,
5964
);
@@ -89,10 +94,14 @@ class InheritanceOverrideVerifier {
8994
reporter: _reporter,
9095
featureSet: unit.featureSet,
9196
library: library,
92-
classNameToken: declaration.name,
97+
classNameToken: useDeclaringConstructorsAst
98+
? declaration.namePart.typeName
99+
: declaration.name,
93100
classElement: fragment.element,
94101
implementsClause: declaration.implementsClause,
95-
members: declaration.members,
102+
members: useDeclaringConstructorsAst
103+
? declaration.body.members
104+
: declaration.members,
96105
withClause: declaration.withClause,
97106
);
98107
if (fragment.isAugmentation) {

0 commit comments

Comments
 (0)