Skip to content

Commit 234ae42

Browse files
scheglovCommit Queue
authored andcommitted
DeCo. AST for construtors with 'new' and 'factory'.
Change-Id: I84c08de3fb6fe1479a23f7504b9ac340454a8402 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/463501 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 8f36ce0 commit 234ae42

30 files changed

+776
-170
lines changed

pkg/analyzer/api.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -970,10 +970,11 @@ package:analyzer/dart/ast/ast.dart:
970970
factoryKeyword (getter: Token?)
971971
initializers (getter: NodeList<ConstructorInitializer>)
972972
name (getter: Token?)
973+
newKeyword (getter: Token?)
973974
parameters (getter: FormalParameterList)
974975
period (getter: Token?)
975976
redirectedConstructor (getter: ConstructorName?)
976-
returnType (getter: Identifier)
977+
returnType (getter: Identifier, deprecated)
977978
separator (getter: Token?)
978979
typeName (getter: SimpleIdentifier?)
979980
ConstructorFieldInitializer (class extends Object implements ConstructorInitializer):

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -810,8 +810,10 @@ class _IndexContributor extends GeneralizingAstVisitor {
810810
var element = node.declaredFragment!.element;
811811
var superConstructor = element.superConstructor;
812812
if (superConstructor != null) {
813-
var offset = node.returnType.offset;
814-
var end = (node.name ?? node.returnType).end;
813+
// TODO(scheglov): https://github.com/dart-lang/sdk/issues/62067
814+
var offset = node.typeName!.offset;
815+
// TODO(scheglov): https://github.com/dart-lang/sdk/issues/62067
816+
var end = (node.name ?? node.typeName!).end;
815817
recordRelationOffset(
816818
superConstructor,
817819
IndexRelationKind.IS_INVOKED_BY,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ class _ReferencedNamesComputer extends GeneralizingAstVisitor<void> {
343343
}
344344
// Ignore class names references from constructors.
345345
var parent = node.parent!;
346-
if (parent is ConstructorDeclaration && parent.returnType == node) {
346+
if (parent is ConstructorDeclaration && parent.typeName == node) {
347347
return;
348348
}
349349
// Prepare name.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class DeclarationByElementLocator extends UnifyingAstVisitor<void> {
9393
result = node;
9494
}
9595
} else {
96-
if (_hasOffset(node.returnType)) {
96+
if (_hasOffset(node.typeName)) {
9797
result = node;
9898
}
9999
}

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

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4713,6 +4713,11 @@ abstract final class ConstructorDeclaration implements ClassMember {
47134713
/// is unnamed.
47144714
Token? get name;
47154715

4716+
/// The token for the `new` keyword, or `null` if the keyword is absent, so
4717+
/// either [factoryKeyword] is not `null`, or the old syntax with [typeName]
4718+
/// is used.
4719+
Token? get newKeyword;
4720+
47164721
/// The parameters associated with the constructor.
47174722
FormalParameterList get parameters;
47184723

@@ -4725,6 +4730,7 @@ abstract final class ConstructorDeclaration implements ClassMember {
47254730
ConstructorName? get redirectedConstructor;
47264731

47274732
/// The type of object being created.
4733+
@Deprecated('Use typeName instead')
47284734
Identifier get returnType;
47294735

47304736
/// The token for the separator (colon or equals) before the initializer list
@@ -4734,7 +4740,7 @@ abstract final class ConstructorDeclaration implements ClassMember {
47344740

47354741
/// The name of the enclosing type, e.g. `C` in `C() {}` or `C.named() {}`.
47364742
///
4737-
/// Or `null` if uses new syntax with `newKeyword` or [factoryKeyword].
4743+
/// Or `null` if uses new syntax with [newKeyword] or [factoryKeyword].
47384744
SimpleIdentifier? get typeName;
47394745
}
47404746

@@ -4744,7 +4750,8 @@ abstract final class ConstructorDeclaration implements ClassMember {
47444750
GenerateNodeProperty('externalKeyword', tokenGroupId: 0),
47454751
GenerateNodeProperty('constKeyword', tokenGroupId: 0, isTokenFinal: false),
47464752
GenerateNodeProperty('factoryKeyword', tokenGroupId: 0),
4747-
GenerateNodeProperty('returnType'),
4753+
GenerateNodeProperty('newKeyword', tokenGroupId: 0),
4754+
GenerateNodeProperty('typeName'),
47484755
GenerateNodeProperty('period'),
47494756
GenerateNodeProperty('name'),
47504757
GenerateNodeProperty('parameters'),
@@ -4773,7 +4780,11 @@ final class ConstructorDeclarationImpl extends ClassMemberImpl
47734780
final Token? factoryKeyword;
47744781

47754782
@generated
4776-
IdentifierImpl _returnType;
4783+
@override
4784+
final Token? newKeyword;
4785+
4786+
@generated
4787+
SimpleIdentifierImpl? _typeName;
47774788

47784789
@generated
47794790
@override
@@ -4812,19 +4823,20 @@ final class ConstructorDeclarationImpl extends ClassMemberImpl
48124823
required this.externalKeyword,
48134824
required this.constKeyword,
48144825
required this.factoryKeyword,
4815-
required IdentifierImpl returnType,
4826+
required this.newKeyword,
4827+
required SimpleIdentifierImpl? typeName,
48164828
required this.period,
48174829
required this.name,
48184830
required FormalParameterListImpl parameters,
48194831
required this.separator,
48204832
required List<ConstructorInitializerImpl> initializers,
48214833
required ConstructorNameImpl? redirectedConstructor,
48224834
required FunctionBodyImpl body,
4823-
}) : _returnType = returnType,
4835+
}) : _typeName = typeName,
48244836
_parameters = parameters,
48254837
_redirectedConstructor = redirectedConstructor,
48264838
_body = body {
4827-
_becomeParentOf(returnType);
4839+
_becomeParentOf(typeName);
48284840
_becomeParentOf(parameters);
48294841
this.initializers._initialize(this, initializers);
48304842
_becomeParentOf(redirectedConstructor);
@@ -4854,11 +4866,21 @@ final class ConstructorDeclarationImpl extends ClassMemberImpl
48544866
externalKeyword,
48554867
constKeyword,
48564868
factoryKeyword,
4869+
newKeyword,
48574870
)
48584871
case var result?) {
48594872
return result;
48604873
}
4861-
return returnType.beginToken;
4874+
if (typeName case var typeName?) {
4875+
return typeName.beginToken;
4876+
}
4877+
if (period case var period?) {
4878+
return period;
4879+
}
4880+
if (name case var name?) {
4881+
return name;
4882+
}
4883+
return parameters.beginToken;
48624884
}
48634885

48644886
/// Whether this is a trivial constructor.
@@ -4891,27 +4913,31 @@ final class ConstructorDeclarationImpl extends ClassMemberImpl
48914913
_redirectedConstructor = _becomeParentOf(redirectedConstructor);
48924914
}
48934915

4916+
@Deprecated('Use typeName instead')
4917+
@override
4918+
IdentifierImpl get returnType {
4919+
// TODO(scheglov): https://github.com/dart-lang/sdk/issues/62067
4920+
return typeName!;
4921+
}
4922+
48944923
@generated
48954924
@override
4896-
IdentifierImpl get returnType => _returnType;
4925+
SimpleIdentifierImpl? get typeName => _typeName;
48974926

48984927
@generated
4899-
set returnType(IdentifierImpl returnType) {
4900-
_returnType = _becomeParentOf(returnType);
4928+
set typeName(SimpleIdentifierImpl? typeName) {
4929+
_typeName = _becomeParentOf(typeName);
49014930
}
49024931

4903-
@override
4904-
// TODO(scheglov): flip the implementation to make this property leading
4905-
SimpleIdentifierImpl? get typeName => returnType as SimpleIdentifierImpl;
4906-
49074932
@generated
49084933
@override
49094934
ChildEntities get _childEntities => super._childEntities
49104935
..addToken('augmentKeyword', augmentKeyword)
49114936
..addToken('externalKeyword', externalKeyword)
49124937
..addToken('constKeyword', constKeyword)
49134938
..addToken('factoryKeyword', factoryKeyword)
4914-
..addNode('returnType', returnType)
4939+
..addToken('newKeyword', newKeyword)
4940+
..addNode('typeName', typeName)
49154941
..addToken('period', period)
49164942
..addToken('name', name)
49174943
..addNode('parameters', parameters)
@@ -4929,7 +4955,7 @@ final class ConstructorDeclarationImpl extends ClassMemberImpl
49294955
@override
49304956
void visitChildren(AstVisitor visitor) {
49314957
super.visitChildren(visitor);
4932-
returnType.accept(visitor);
4958+
typeName?.accept(visitor);
49334959
parameters.accept(visitor);
49344960
initializers.accept(visitor);
49354961
redirectedConstructor?.accept(visitor);
@@ -4942,8 +4968,10 @@ final class ConstructorDeclarationImpl extends ClassMemberImpl
49424968
if (super._childContainingRange(rangeOffset, rangeEnd) case var result?) {
49434969
return result;
49444970
}
4945-
if (returnType._containsOffset(rangeOffset, rangeEnd)) {
4946-
return returnType;
4971+
if (typeName case var typeName?) {
4972+
if (typeName._containsOffset(rangeOffset, rangeEnd)) {
4973+
return typeName;
4974+
}
49474975
}
49484976
if (parameters._containsOffset(rangeOffset, rangeEnd)) {
49494977
return parameters;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ class _ElementMapper2 extends GeneralizingAstVisitor<Element> {
166166
}
167167
} else if (parent is ConstructorDeclaration) {
168168
// Map a constructor declarations to its associated constructor element.
169-
var returnType = parent.returnType;
169+
var returnType = parent.typeName;
170170
if (identical(returnType, node)) {
171171
var name = parent.name;
172172
if (name != null) {

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,10 @@ extension ConstructorDeclarationExtension on ConstructorDeclaration {
100100
/// declaration, accounting for named and unnamed constructors.
101101
SourceRange get errorRange {
102102
var name = this.name;
103-
var offset = returnType.offset;
104-
int length = (name != null ? name.end : returnType.end) - offset;
103+
// TODO(scheglov): https://github.com/dart-lang/sdk/issues/62067
104+
var offset = typeName!.offset;
105+
// TODO(scheglov): https://github.com/dart-lang/sdk/issues/62067
106+
int length = (name != null ? name.end : typeName!.end) - offset;
105107
return SourceRange(offset, length);
106108
}
107109

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ class ToSourceVisitor implements AstVisitor<void> {
265265
_visitToken(node.externalKeyword, suffix: ' ');
266266
_visitToken(node.constKeyword, suffix: ' ');
267267
_visitToken(node.factoryKeyword, suffix: ' ');
268-
_visitNode(node.returnType);
268+
_visitNode(node.typeName);
269269
_visitToken(node.name, prefix: '.');
270270
_visitNode(node.parameters);
271271
_visitNodeList(node.initializers, prefix: ' : ', separator: ', ');

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ class NodeLocator2 extends UnifyingAstVisitor<void> {
8080
// Names do not have AstNodes but offsets at the end should be treated as
8181
// part of the declaration (not parameter list).
8282
if (_startOffset == _endOffset &&
83-
_startOffset == (node.name ?? node.returnType).end) {
83+
// TODO(scheglov): https://github.com/dart-lang/sdk/issues/62067
84+
_startOffset == (node.name ?? node.typeName!).end) {
8485
_foundNode = node;
8586
return;
8687
}
@@ -456,10 +457,7 @@ class NodeReplacer extends ThrowingAstVisitor<bool> {
456457

457458
@override
458459
bool visitConstructorDeclaration(covariant ConstructorDeclarationImpl node) {
459-
if (identical(node.returnType, _oldNode)) {
460-
node.returnType = _newNode as IdentifierImpl;
461-
return true;
462-
} else if (identical(node.parameters, _oldNode)) {
460+
if (identical(node.parameters, _oldNode)) {
463461
node.parameters = _newNode as FormalParameterListImpl;
464462
return true;
465463
} else if (identical(node.redirectedConstructor, _oldNode)) {

pkg/analyzer/lib/src/dart/constant/constant_verifier.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ class ConstantVerifier extends RecursiveAstVisitor<void> {
168168
var element = node.declaredFragment!.element;
169169
if (!element.isCycleFree && !element.isFactory) {
170170
_diagnosticReporter.atNode(
171-
node.returnType,
171+
// TODO(scheglov): https://github.com/dart-lang/sdk/issues/62067
172+
node.typeName!,
172173
diag.recursiveConstantConstructor,
173174
);
174175
}

0 commit comments

Comments
 (0)