Skip to content

Commit 2692a11

Browse files
kallentuCommit Queue
authored andcommitted
[parser] Declaring constructors - Parse primary constructor this body.
Added two listener calls `beginPrimaryConstructorBody` and `endPrimaryConstructorBody` for parsing the `this` body. No AST implementation has been done, only parsing. Bug: #61699 Change-Id: I6aaf621bb3e67bfe00efe32de8097ca1e5048afb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/459901 Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Kallen Tu <[email protected]>
1 parent 85b6b1a commit 2692a11

File tree

53 files changed

+4392
-452
lines changed

Some content is hidden

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

53 files changed

+4392
-452
lines changed

pkg/_fe_analyzer_shared/lib/src/parser/forwarding_listener.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2669,6 +2669,24 @@ class ForwardingListener implements Listener {
26692669
void endConstDotShorthand(Token token) {
26702670
listener?.beginConstDotShorthand(token);
26712671
}
2672+
2673+
@override
2674+
void beginPrimaryConstructorBody(Token token) {
2675+
listener?.beginPrimaryConstructorBody(token);
2676+
}
2677+
2678+
@override
2679+
void endPrimaryConstructorBody(
2680+
Token beginToken,
2681+
Token? beginInitializers,
2682+
Token endToken,
2683+
) {
2684+
listener?.endPrimaryConstructorBody(
2685+
beginToken,
2686+
beginInitializers,
2687+
endToken,
2688+
);
2689+
}
26722690
}
26732691

26742692
class NullListener extends ForwardingListener {

pkg/_fe_analyzer_shared/lib/src/parser/listener.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,21 @@ abstract class Listener implements UnescapeErrorListener {
356356
bool forExtensionType,
357357
) {}
358358

359+
void beginPrimaryConstructorBody(Token token) {}
360+
361+
// Handles the `this` body block for a primary constructor. Substructures:
362+
/// - metadata
363+
/// - initializers
364+
/// - async marker
365+
/// - body
366+
void endPrimaryConstructorBody(
367+
Token beginToken,
368+
Token? beginInitializers,
369+
Token endToken,
370+
) {
371+
logEvent("endPrimaryConstructorBody");
372+
}
373+
359374
void beginCombinators(Token token) {}
360375

361376
void endCombinators(int count) {

pkg/_fe_analyzer_shared/lib/src/parser/parser_impl.dart

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3715,6 +3715,24 @@ class Parser {
37153715
return token;
37163716
}
37173717

3718+
Token parsePrimaryConstructorBody(Token token) {
3719+
Token beginToken = token;
3720+
listener.beginPrimaryConstructorBody(token);
3721+
3722+
Token? beforeInitializers = token;
3723+
token = parseInitializersOpt(beforeInitializers);
3724+
3725+
token = parseAsyncModifierOpt(token);
3726+
token = parseFunctionBody(
3727+
token,
3728+
/* ofFunctionExpression = */ false,
3729+
/* allowAbstract = */ inPlainSync,
3730+
);
3731+
3732+
listener.endPrimaryConstructorBody(beginToken, beforeInitializers, token);
3733+
return token;
3734+
}
3735+
37183736
/// Parses an extension type declaration after
37193737
///
37203738
/// 'extension' 'type'
@@ -5361,6 +5379,22 @@ class Parser {
53615379
return token;
53625380
}
53635381
// Fall through to continue parsing `operator` as an identifier.
5382+
} else if (identical(value, 'this')) {
5383+
Token next2 = next.next!;
5384+
if (next2.isA(TokenType.COLON) ||
5385+
next2.isA(TokenType.SEMICOLON) ||
5386+
next2.isA(TokenType.OPEN_CURLY_BRACKET)) {
5387+
if (!_isDeclaringConstructorsFeatureEnabled) {
5388+
reportExperimentNotEnabled(
5389+
ExperimentalFlag.declaringConstructors,
5390+
next,
5391+
next,
5392+
);
5393+
}
5394+
token = parsePrimaryConstructorBody(next);
5395+
listener.endMember();
5396+
return token;
5397+
}
53645398
} else if (!next.isIdentifier ||
53655399
(identical(value, 'typedef') &&
53665400
token == beforeStart &&

pkg/analyzer/lib/src/fasta/ast_builder.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,11 @@ class AstBuilder extends StackListener {
617617
debugEvent("PrimaryConstructor");
618618
}
619619

620+
@override
621+
void beginPrimaryConstructorBody(Token beginToken) {
622+
debugEvent("PrimaryConstructorBody");
623+
}
624+
620625
@override
621626
void beginSwitchCaseWhenClause(Token when) {
622627
debugEvent("PatternSwitchCaseGuard");
@@ -3168,6 +3173,23 @@ class AstBuilder extends StackListener {
31683173
}
31693174
}
31703175

3176+
@override
3177+
void endPrimaryConstructorBody(
3178+
Token beginToken,
3179+
Token? beginInitializers,
3180+
Token endToken,
3181+
) {
3182+
// TODO(declaring-constructors): Implement primary constructor body.
3183+
// ignore: unused_local_variable
3184+
var bodyObject = pop();
3185+
// ignore: unused_local_variable
3186+
var initializers = (pop() as List<ConstructorInitializerImpl>?) ?? const [];
3187+
// ignore: unused_local_variable
3188+
var separator = pop() as Token?;
3189+
// ignore: unused_local_variable
3190+
var metadata = pop() as List<AnnotationImpl>?;
3191+
}
3192+
31713193
@override
31723194
void endRecordLiteral(Token leftParenthesis, int count, Token? constKeyword) {
31733195
debugEvent("RecordLiteral");

pkg/front_end/lib/src/source/diet_listener.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,6 +1213,22 @@ class DietListener extends StackListenerImpl {
12131213
_memberScope = outermostScope;
12141214
}
12151215

1216+
@override
1217+
// Coverage-ignore(suite): Not run.
1218+
void endPrimaryConstructorBody(
1219+
Token beginToken,
1220+
Token? beginInitializers,
1221+
Token endToken,
1222+
) {
1223+
debugEvent("endPrimaryConstructorBody");
1224+
assert(
1225+
checkState(beginToken, [/* metadata token */ ValueKinds.TokenOrNull]),
1226+
);
1227+
// TODO(declaring-constructors): Implement primary constructor body.
1228+
pop() as Token?;
1229+
checkEmpty(beginToken.charOffset);
1230+
}
1231+
12161232
@override
12171233
void endExtensionTypeDeclaration(
12181234
Token beginToken,

pkg/front_end/lib/src/source/outline_builder.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1960,6 +1960,31 @@ class OutlineBuilder extends StackListenerImpl {
19601960
);
19611961
}
19621962

1963+
@override
1964+
// Coverage-ignore(suite): Not run.
1965+
void endPrimaryConstructorBody(
1966+
Token beginToken,
1967+
Token? beginInitializers,
1968+
Token endToken,
1969+
) {
1970+
debugEvent("endPrimaryConstructorBody");
1971+
assert(
1972+
checkState(beginToken, [
1973+
ValueKinds.MethodBody,
1974+
ValueKinds.AsyncModifier,
1975+
ValueKinds.MetadataListOrNull,
1976+
]),
1977+
);
1978+
1979+
// TODO(declaring-constructors): Implement primary constructor body.
1980+
// ignore: unused_local_variable
1981+
MethodBody bodyKind = pop() as MethodBody;
1982+
// ignore: unused_local_variable
1983+
AsyncMarker asyncModifier = pop() as AsyncMarker;
1984+
// ignore: unused_local_variable
1985+
List<MetadataBuilder>? metadata = pop() as List<MetadataBuilder>?;
1986+
}
1987+
19631988
@override
19641989
void beginTopLevelMethod(
19651990
Token lastConsumed,

pkg/front_end/lib/src/util/parser_ast.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,6 +1533,18 @@ extension MemberExtension on MemberEnd {
15331533
if (child is EnumFactoryMethodEnd) return child;
15341534
throw "Not found";
15351535
}
1536+
1537+
bool isPrimaryConstructorBody() {
1538+
ParserAstNode child = children![1];
1539+
if (child is PrimaryConstructorBodyEnd) return true;
1540+
return false;
1541+
}
1542+
1543+
PrimaryConstructorBodyEnd getPrimaryConstructorBody() {
1544+
ParserAstNode child = children![1];
1545+
if (child is PrimaryConstructorBodyEnd) return child;
1546+
throw "Not found";
1547+
}
15361548
}
15371549

15381550
// Coverage-ignore(suite): Not run.

pkg/front_end/lib/src/util/parser_ast_helper.dart

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -548,6 +548,30 @@ abstract class AbstractParserAstListener implements Listener {
548548
seen(data);
549549
}
550550

551+
@override
552+
void beginPrimaryConstructorBody(Token token) {
553+
PrimaryConstructorBodyBegin data = new PrimaryConstructorBodyBegin(
554+
ParserAstType.BEGIN,
555+
token: token,
556+
);
557+
seen(data);
558+
}
559+
560+
@override
561+
void endPrimaryConstructorBody(
562+
Token beginToken,
563+
Token? beginInitializers,
564+
Token endToken,
565+
) {
566+
PrimaryConstructorBodyEnd data = new PrimaryConstructorBodyEnd(
567+
ParserAstType.END,
568+
beginToken: beginToken,
569+
beginInitializers: beginInitializers,
570+
endToken: endToken,
571+
);
572+
seen(data);
573+
}
574+
551575
@override
552576
void beginCombinators(Token token) {
553577
CombinatorsBegin data = new CombinatorsBegin(
@@ -5082,6 +5106,46 @@ class NoPrimaryConstructorHandle extends ParserAstNode {
50825106
R accept<R>(ParserAstVisitor<R> v) => v.visitNoPrimaryConstructorHandle(this);
50835107
}
50845108

5109+
class PrimaryConstructorBodyBegin extends ParserAstNode {
5110+
final Token token;
5111+
5112+
PrimaryConstructorBodyBegin(ParserAstType type, {required this.token})
5113+
: super("PrimaryConstructorBody", type);
5114+
5115+
@override
5116+
Map<String, Object?> get deprecatedArguments => {"token": token};
5117+
5118+
@override
5119+
R accept<R>(ParserAstVisitor<R> v) =>
5120+
v.visitPrimaryConstructorBodyBegin(this);
5121+
}
5122+
5123+
class PrimaryConstructorBodyEnd extends ParserAstNode
5124+
implements BeginAndEndTokenParserAstNode {
5125+
@override
5126+
final Token beginToken;
5127+
final Token? beginInitializers;
5128+
@override
5129+
final Token endToken;
5130+
5131+
PrimaryConstructorBodyEnd(
5132+
ParserAstType type, {
5133+
required this.beginToken,
5134+
this.beginInitializers,
5135+
required this.endToken,
5136+
}) : super("PrimaryConstructorBody", type);
5137+
5138+
@override
5139+
Map<String, Object?> get deprecatedArguments => {
5140+
"beginToken": beginToken,
5141+
"beginInitializers": beginInitializers,
5142+
"endToken": endToken,
5143+
};
5144+
5145+
@override
5146+
R accept<R>(ParserAstVisitor<R> v) => v.visitPrimaryConstructorBodyEnd(this);
5147+
}
5148+
50855149
class CombinatorsBegin extends ParserAstNode {
50865150
final Token token;
50875151

@@ -11379,6 +11443,8 @@ abstract class ParserAstVisitor<R> {
1137911443
R visitPrimaryConstructorBegin(PrimaryConstructorBegin node);
1138011444
R visitPrimaryConstructorEnd(PrimaryConstructorEnd node);
1138111445
R visitNoPrimaryConstructorHandle(NoPrimaryConstructorHandle node);
11446+
R visitPrimaryConstructorBodyBegin(PrimaryConstructorBodyBegin node);
11447+
R visitPrimaryConstructorBodyEnd(PrimaryConstructorBodyEnd node);
1138211448
R visitCombinatorsBegin(CombinatorsBegin node);
1138311449
R visitCombinatorsEnd(CombinatorsEnd node);
1138411450
R visitCompilationUnitBegin(CompilationUnitBegin node);
@@ -11917,6 +11983,14 @@ class RecursiveParserAstVisitor implements ParserAstVisitor<void> {
1191711983
void visitNoPrimaryConstructorHandle(NoPrimaryConstructorHandle node) =>
1191811984
node.visitChildren(this);
1191911985

11986+
@override
11987+
void visitPrimaryConstructorBodyBegin(PrimaryConstructorBodyBegin node) =>
11988+
node.visitChildren(this);
11989+
11990+
@override
11991+
void visitPrimaryConstructorBodyEnd(PrimaryConstructorBodyEnd node) =>
11992+
node.visitChildren(this);
11993+
1192011994
@override
1192111995
void visitCombinatorsBegin(CombinatorsBegin node) => node.visitChildren(this);
1192211996

@@ -13384,6 +13458,15 @@ class RecursiveParserAstVisitorWithDefaultNodeAsync
1338413458
NoPrimaryConstructorHandle node,
1338513459
) => defaultNode(node);
1338613460

13461+
@override
13462+
Future<void> visitPrimaryConstructorBodyBegin(
13463+
PrimaryConstructorBodyBegin node,
13464+
) => defaultNode(node);
13465+
13466+
@override
13467+
Future<void> visitPrimaryConstructorBodyEnd(PrimaryConstructorBodyEnd node) =>
13468+
defaultNode(node);
13469+
1338713470
@override
1338813471
Future<void> visitCombinatorsBegin(CombinatorsBegin node) =>
1338913472
defaultNode(node);
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class C1() {
2+
this {}
3+
}
4+
5+
class C2() {
6+
this : assert(1 > 2) {}
7+
}
8+
9+
class C3() {
10+
this;
11+
}
12+
13+
class C4() {
14+
this : assert(1 > 2);
15+
}

0 commit comments

Comments
 (0)