Skip to content

Commit 3c52283

Browse files
scheglovCommit Queue
authored andcommitted
DeCo. Build PrimaryConstructorBody.
Bug: #61701 Change-Id: I8ad2dc544c6a91092e266ae52697c78ee57bc306 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/460884 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 1e6debf commit 3c52283

25 files changed

+565
-8
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ class BindToField extends ResolvedCorrectionProducer {
105105
ConstructorDeclaration() => false,
106106
FieldDeclaration() => false,
107107
MethodDeclaration() => member.name.lexeme == parameter.name?.lexeme,
108+
// ignore: experimental_member_use
109+
PrimaryConstructorBody() => false,
108110
},
109111
)) {
110112
return;

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@ class CreateMethod extends ResolvedCorrectionProducer {
160160
fields: VariableDeclarationList(:var isLate),
161161
) =>
162162
isStatic || !isLate,
163+
// ignore: experimental_member_use
164+
PrimaryConstructorBody() => false,
163165
};
164166
}
165167
} else {

pkg/analyzer/api.txt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ package:analyzer/analysis_rule/rule_visitor_registry.dart:
247247
addPostfixExpression (method: void Function(AbstractAnalysisRule, AstVisitor<dynamic>))
248248
addPrefixExpression (method: void Function(AbstractAnalysisRule, AstVisitor<dynamic>))
249249
addPrefixedIdentifier (method: void Function(AbstractAnalysisRule, AstVisitor<dynamic>))
250+
addPrimaryConstructorBody (method: void Function(AbstractAnalysisRule, AstVisitor<dynamic>), experimental)
250251
addPrimaryConstructorDeclaration (method: void Function(AbstractAnalysisRule, AstVisitor<dynamic>), experimental)
251252
addPrimaryConstructorName (method: void Function(AbstractAnalysisRule, AstVisitor<dynamic>), experimental)
252253
addPropertyAccess (method: void Function(AbstractAnalysisRule, AstVisitor<dynamic>))
@@ -771,6 +772,7 @@ package:analyzer/dart/ast/ast.dart:
771772
visitPostfixExpression (method: R? Function(PostfixExpression))
772773
visitPrefixExpression (method: R? Function(PrefixExpression))
773774
visitPrefixedIdentifier (method: R? Function(PrefixedIdentifier))
775+
visitPrimaryConstructorBody (method: R? Function(PrimaryConstructorBody), experimental)
774776
visitPrimaryConstructorDeclaration (method: R? Function(PrimaryConstructorDeclaration), experimental)
775777
visitPrimaryConstructorName (method: R? Function(PrimaryConstructorName), experimental)
776778
visitPropertyAccess (method: R? Function(PropertyAccess))
@@ -893,7 +895,7 @@ package:analyzer/dart/ast/ast.dart:
893895
sealedKeyword (getter: Token?)
894896
typeParameters (getter: TypeParameterList?)
895897
withClause (getter: WithClause?)
896-
ClassMember (class extends Object implements Declaration, sealed (immediate subtypes: ClassMemberImpl, ConstructorDeclaration, FieldDeclaration, MethodDeclaration))
898+
ClassMember (class extends Object implements Declaration, sealed (immediate subtypes: ClassMemberImpl, ConstructorDeclaration, FieldDeclaration, MethodDeclaration, PrimaryConstructorBody))
897899
ClassNamePart (class extends Object implements AstNode, sealed (immediate subtypes: ClassNamePartImpl, NameWithTypeParameters, PrimaryConstructorDeclaration), experimental):
898900
typeName (getter: Token)
899901
typeParameters (getter: TypeParameterList?)
@@ -1555,6 +1557,11 @@ package:analyzer/dart/ast/ast.dart:
15551557
isDeferred (getter: bool)
15561558
period (getter: Token)
15571559
prefix (getter: SimpleIdentifier)
1560+
PrimaryConstructorBody (class extends Object implements ClassMember, experimental):
1561+
body (getter: FunctionBody)
1562+
colon (getter: Token?)
1563+
initializers (getter: NodeList<ConstructorInitializer>)
1564+
thisKeyword (getter: Token)
15581565
PrimaryConstructorDeclaration (class extends Object implements ClassNamePart, experimental):
15591566
constKeyword (getter: Token?)
15601567
constructorName (getter: PrimaryConstructorName?)
@@ -2343,6 +2350,7 @@ package:analyzer/dart/ast/visitor.dart:
23432350
visitPostfixExpression (method: R? Function(PostfixExpression))
23442351
visitPrefixExpression (method: R? Function(PrefixExpression))
23452352
visitPrefixedIdentifier (method: R? Function(PrefixedIdentifier))
2353+
visitPrimaryConstructorBody (method: R? Function(PrimaryConstructorBody), experimental)
23462354
visitPrimaryConstructorDeclaration (method: R? Function(PrimaryConstructorDeclaration), experimental)
23472355
visitPrimaryConstructorName (method: R? Function(PrimaryConstructorName), experimental)
23482356
visitPropertyAccess (method: R? Function(PropertyAccess))
@@ -2534,6 +2542,7 @@ package:analyzer/dart/ast/visitor.dart:
25342542
visitPostfixExpression (method: R? Function(PostfixExpression))
25352543
visitPrefixExpression (method: R? Function(PrefixExpression))
25362544
visitPrefixedIdentifier (method: R? Function(PrefixedIdentifier))
2545+
visitPrimaryConstructorBody (method: R? Function(PrimaryConstructorBody), experimental)
25372546
visitPrimaryConstructorDeclaration (method: R? Function(PrimaryConstructorDeclaration), experimental)
25382547
visitPrimaryConstructorName (method: R? Function(PrimaryConstructorName), experimental)
25392548
visitPropertyAccess (method: R? Function(PropertyAccess))
@@ -2715,6 +2724,7 @@ package:analyzer/dart/ast/visitor.dart:
27152724
visitPostfixExpression (method: R? Function(PostfixExpression))
27162725
visitPrefixExpression (method: R? Function(PrefixExpression))
27172726
visitPrefixedIdentifier (method: R? Function(PrefixedIdentifier))
2727+
visitPrimaryConstructorBody (method: R? Function(PrimaryConstructorBody), experimental)
27182728
visitPrimaryConstructorDeclaration (method: R? Function(PrimaryConstructorDeclaration), experimental)
27192729
visitPrimaryConstructorName (method: R? Function(PrimaryConstructorName), experimental)
27202730
visitPropertyAccess (method: R? Function(PropertyAccess))
@@ -2896,6 +2906,7 @@ package:analyzer/dart/ast/visitor.dart:
28962906
visitPostfixExpression (method: R? Function(PostfixExpression))
28972907
visitPrefixExpression (method: R? Function(PrefixExpression))
28982908
visitPrefixedIdentifier (method: R? Function(PrefixedIdentifier))
2909+
visitPrimaryConstructorBody (method: R? Function(PrimaryConstructorBody), experimental)
28992910
visitPrimaryConstructorDeclaration (method: R? Function(PrimaryConstructorDeclaration), experimental)
29002911
visitPrimaryConstructorName (method: R? Function(PrimaryConstructorName), experimental)
29012912
visitPropertyAccess (method: R? Function(PropertyAccess))
@@ -3078,6 +3089,7 @@ package:analyzer/dart/ast/visitor.dart:
30783089
visitPostfixExpression (method: T? Function(PostfixExpression))
30793090
visitPrefixExpression (method: T? Function(PrefixExpression))
30803091
visitPrefixedIdentifier (method: T? Function(PrefixedIdentifier))
3092+
visitPrimaryConstructorBody (method: T? Function(PrimaryConstructorBody), experimental)
30813093
visitPrimaryConstructorDeclaration (method: T? Function(PrimaryConstructorDeclaration), experimental)
30823094
visitPrimaryConstructorName (method: T? Function(PrimaryConstructorName), experimental)
30833095
visitPropertyAccess (method: T? Function(PropertyAccess))
@@ -3260,6 +3272,7 @@ package:analyzer/dart/ast/visitor.dart:
32603272
visitPostfixExpression (method: R? Function(PostfixExpression))
32613273
visitPrefixExpression (method: R? Function(PrefixExpression))
32623274
visitPrefixedIdentifier (method: R? Function(PrefixedIdentifier))
3275+
visitPrimaryConstructorBody (method: R? Function(PrimaryConstructorBody), experimental)
32633276
visitPrimaryConstructorDeclaration (method: R? Function(PrimaryConstructorDeclaration), experimental)
32643277
visitPrimaryConstructorName (method: R? Function(PrimaryConstructorName), experimental)
32653278
visitPropertyAccess (method: R? Function(PropertyAccess))

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,9 @@ abstract class RuleVisitorRegistry {
335335

336336
void addPrefixExpression(AbstractAnalysisRule rule, AstVisitor visitor);
337337

338+
@experimental
339+
void addPrimaryConstructorBody(AbstractAnalysisRule rule, AstVisitor visitor);
340+
338341
@experimental
339342
void addPrimaryConstructorDeclaration(
340343
AbstractAnalysisRule rule,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ export 'package:analyzer/src/dart/ast/ast.dart'
203203
PostfixExpression,
204204
PrefixedIdentifier,
205205
PrefixExpression,
206+
PrimaryConstructorBody,
206207
PrimaryConstructorDeclaration,
207208
PrimaryConstructorName,
208209
PropertyAccess,

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,11 @@ class GeneralizingAstVisitor<R> implements AstVisitor<R> {
535535
@override
536536
R? visitPrefixExpression(PrefixExpression node) => visitExpression(node);
537537

538+
@experimental
539+
@override
540+
R? visitPrimaryConstructorBody(PrimaryConstructorBody node) =>
541+
visitClassMember(node);
542+
538543
@experimental
539544
@override
540545
R? visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node) =>
@@ -1529,6 +1534,13 @@ class RecursiveAstVisitor<R> implements AstVisitor<R> {
15291534
return null;
15301535
}
15311536

1537+
@experimental
1538+
@override
1539+
R? visitPrimaryConstructorBody(PrimaryConstructorBody node) {
1540+
node.visitChildren(this);
1541+
return null;
1542+
}
1543+
15321544
@experimental
15331545
@override
15341546
R? visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node) {
@@ -2245,6 +2257,10 @@ class SimpleAstVisitor<R> implements AstVisitor<R> {
22452257
@override
22462258
R? visitPrefixExpression(PrefixExpression node) => null;
22472259

2260+
@experimental
2261+
@override
2262+
R? visitPrimaryConstructorBody(PrimaryConstructorBody node) => null;
2263+
22482264
@experimental
22492265
@override
22502266
R? visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node) =>
@@ -2825,6 +2841,10 @@ class ThrowingAstVisitor<R> implements AstVisitor<R> {
28252841
@override
28262842
R? visitPrefixExpression(PrefixExpression node) => _throw(node);
28272843

2844+
@experimental
2845+
@override
2846+
R? visitPrimaryConstructorBody(PrimaryConstructorBody node) => _throw(node);
2847+
28282848
@experimental
28292849
@override
28302850
R? visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node) =>
@@ -4054,6 +4074,15 @@ class TimedAstVisitor<T> implements AstVisitor<T> {
40544074
return result;
40554075
}
40564076

4077+
@experimental
4078+
@override
4079+
T? visitPrimaryConstructorBody(PrimaryConstructorBody node) {
4080+
stopwatch.start();
4081+
T? result = _baseVisitor.visitPrimaryConstructorBody(node);
4082+
stopwatch.stop();
4083+
return result;
4084+
}
4085+
40574086
@experimental
40584087
@override
40594088
T? visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node) {
@@ -4901,6 +4930,11 @@ class UnifyingAstVisitor<R> implements AstVisitor<R> {
49014930
@override
49024931
R? visitPrefixExpression(PrefixExpression node) => visitNode(node);
49034932

4933+
@experimental
4934+
@override
4935+
R? visitPrimaryConstructorBody(PrimaryConstructorBody node) =>
4936+
visitNode(node);
4937+
49044938
@experimental
49054939
@override
49064940
R? visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node) =>

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class _UnitApiSignatureComputer {
2424
static const int _kindConstructorDeclaration = 1;
2525
static const int _kindFieldDeclaration = 2;
2626
static const int _kindMethodDeclaration = 3;
27+
static const int _kindPrimaryConstructorBody = 4;
2728
static const int _nullNode = 0;
2829
static const int _notNullNode = 1;
2930
static const int _nullToken = 0;
@@ -89,6 +90,8 @@ class _UnitApiSignatureComputer {
8990
_addFieldDeclaration(member, hasConstConstructor);
9091
} else if (member is MethodDeclaration) {
9192
_addMethodDeclaration(member);
93+
} else if (member is PrimaryConstructorBody) {
94+
_addPrimaryConstructorBody(member);
9295
} else {
9396
throw UnimplementedError('(${member.runtimeType}) $member');
9497
}
@@ -188,6 +191,11 @@ class _UnitApiSignatureComputer {
188191
}
189192
}
190193

194+
void _addPrimaryConstructorBody(PrimaryConstructorBody node) {
195+
signature.addInt(_kindPrimaryConstructorBody);
196+
_addTokens(node.beginToken, node.body.beginToken);
197+
}
198+
191199
void _addToken(Token? token) {
192200
if (token != null) {
193201
signature.addInt(_notNullToken);

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

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20035,6 +20035,126 @@ final class PrefixExpressionImpl extends ExpressionImpl
2003520035
}
2003620036
}
2003720037

20038+
/// The body of a primary constructor.
20039+
@AnalyzerPublicApi(message: 'exported by lib/dart/ast/ast.dart')
20040+
@experimental
20041+
// TODO(scheglov): This should not be a `Declaration`.
20042+
abstract final class PrimaryConstructorBody implements ClassMember {
20043+
/// The body of the constructor.
20044+
FunctionBody get body;
20045+
20046+
/// The token for the separator before [initializers], or `null` if there
20047+
/// are no initializers.
20048+
Token? get colon;
20049+
20050+
/// The initializers associated with the constructor.
20051+
NodeList<ConstructorInitializer> get initializers;
20052+
20053+
/// The token for the `this` keyword.
20054+
Token get thisKeyword;
20055+
}
20056+
20057+
@GenerateNodeImpl(
20058+
childEntitiesOrder: [
20059+
GenerateNodeProperty('thisKeyword'),
20060+
GenerateNodeProperty('colon'),
20061+
GenerateNodeProperty('initializers'),
20062+
GenerateNodeProperty('body'),
20063+
],
20064+
)
20065+
final class PrimaryConstructorBodyImpl extends ClassMemberImpl
20066+
implements PrimaryConstructorBody {
20067+
@generated
20068+
@override
20069+
final Token thisKeyword;
20070+
20071+
@generated
20072+
@override
20073+
final Token? colon;
20074+
20075+
@generated
20076+
@override
20077+
final NodeListImpl<ConstructorInitializerImpl> initializers =
20078+
NodeListImpl._();
20079+
20080+
@generated
20081+
FunctionBodyImpl _body;
20082+
20083+
@generated
20084+
PrimaryConstructorBodyImpl({
20085+
required super.comment,
20086+
required super.metadata,
20087+
required this.thisKeyword,
20088+
required this.colon,
20089+
required List<ConstructorInitializerImpl> initializers,
20090+
required FunctionBodyImpl body,
20091+
}) : _body = body {
20092+
this.initializers._initialize(this, initializers);
20093+
_becomeParentOf(body);
20094+
}
20095+
20096+
@generated
20097+
@override
20098+
FunctionBodyImpl get body => _body;
20099+
20100+
@generated
20101+
set body(FunctionBodyImpl body) {
20102+
_body = _becomeParentOf(body);
20103+
}
20104+
20105+
@generated
20106+
@override
20107+
Token get endToken {
20108+
return body.endToken;
20109+
}
20110+
20111+
@generated
20112+
@override
20113+
Token get firstTokenAfterCommentAndMetadata {
20114+
return thisKeyword;
20115+
}
20116+
20117+
@generated
20118+
@override
20119+
ChildEntities get _childEntities => super._childEntities
20120+
..addToken('thisKeyword', thisKeyword)
20121+
..addToken('colon', colon)
20122+
..addNodeList('initializers', initializers)
20123+
..addNode('body', body);
20124+
20125+
@generated
20126+
@override
20127+
E? accept<E>(AstVisitor<E> visitor) =>
20128+
visitor.visitPrimaryConstructorBody(this);
20129+
20130+
@override
20131+
dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
20132+
20133+
@generated
20134+
@override
20135+
void visitChildren(AstVisitor visitor) {
20136+
super.visitChildren(visitor);
20137+
initializers.accept(visitor);
20138+
body.accept(visitor);
20139+
}
20140+
20141+
@generated
20142+
@override
20143+
AstNodeImpl? _childContainingRange(int rangeOffset, int rangeEnd) {
20144+
if (super._childContainingRange(rangeOffset, rangeEnd) case var result?) {
20145+
return result;
20146+
}
20147+
if (initializers._elementContainingRange(rangeOffset, rangeEnd)
20148+
case var result?) {
20149+
return result;
20150+
}
20151+
if (body._containsOffset(rangeOffset, rangeEnd)) {
20152+
return body;
20153+
}
20154+
return null;
20155+
}
20156+
}
20157+
2003820158
/// The declaration of a primary constructor.
2003920159
@AnalyzerPublicApi(message: 'exported by lib/dart/ast/ast.dart')
2004020160
@experimental

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,9 @@ abstract class AstVisitor<R> {
287287

288288
R? visitPrefixExpression(PrefixExpression node);
289289

290+
@experimental
291+
R? visitPrimaryConstructorBody(PrimaryConstructorBody node);
292+
290293
@experimental
291294
R? visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node);
292295

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,17 @@ class ToSourceVisitor implements AstVisitor<void> {
11511151
_writeOperand(node, node.operand);
11521152
}
11531153

1154+
@override
1155+
void visitPrimaryConstructorBody(PrimaryConstructorBody node) {
1156+
_visitNodeList(node.metadata, separator: ' ', suffix: ' ');
1157+
_visitToken(node.thisKeyword);
1158+
if (node.initializers.isNotEmpty) {
1159+
_visitToken(node.colon, prefix: ' ', suffix: ' ');
1160+
_visitNodeList(node.initializers, separator: ', ');
1161+
}
1162+
_visitFunctionBody(node.body);
1163+
}
1164+
11541165
@override
11551166
void visitPrimaryConstructorDeclaration(PrimaryConstructorDeclaration node) {
11561167
_visitToken(node.constKeyword, suffix: ' ');

0 commit comments

Comments
 (0)