Skip to content

Commit 9f32f9b

Browse files
mralephcommit-bot@chromium.org
authored andcommitted
[cfe] Store the initializer tokens in constructor builders
For const constructors, we need to compile the initializer expressions and write them into the outline so that we can perform modular constant evaluation. As a first step, preserve the tokens for the initializer expressions in const constructor builders when building the outline. Currently they are discarded later during outline building at the point when we should compile them instead. Change-Id: Ief8d94ceb752b2315982d720836496b7d597e55c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/107509 Commit-Queue: Vyacheslav Egorov <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent bbbeb8b commit 9f32f9b

12 files changed

Lines changed: 46 additions & 28 deletions

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1447,8 +1447,8 @@ class AstBuilder extends StackListener {
14471447
}
14481448

14491449
@override
1450-
void endMethod(
1451-
Token getOrSet, Token beginToken, Token beginParam, Token endToken) {
1450+
void endMethod(Token getOrSet, Token beginToken, Token beginParam,
1451+
Token beginInitializers, Token endToken) {
14521452
assert(getOrSet == null ||
14531453
optional('get', getOrSet) ||
14541454
optional('set', getOrSet));

‎pkg/analyzer/test/generated/parser_fasta_listener.dart‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -908,10 +908,11 @@ class ForwardingTestListener extends ForwardingListener {
908908
}
909909

910910
@override
911-
void endMethod(
912-
Token getOrSet, Token beginToken, Token beginParam, Token endToken) {
911+
void endMethod(Token getOrSet, Token beginToken, Token beginParam,
912+
Token beginInitializers, Token endToken) {
913913
end('Method');
914-
super.endMethod(getOrSet, beginToken, beginParam, endToken);
914+
super.endMethod(
915+
getOrSet, beginToken, beginParam, beginInitializers, endToken);
915916
}
916917

917918
@override

‎pkg/analyzer/tool/summary/mini_ast.dart‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,8 +393,8 @@ class MiniAstBuilder extends StackListener {
393393
NullValue.Metadata);
394394
}
395395

396-
void endMethod(
397-
Token getOrSet, Token beginToken, Token beginParam, Token endToken) {
396+
void endMethod(Token getOrSet, Token beginToken, Token beginParam,
397+
Token beginInitializers, Token endToken) {
398398
debugEvent("Method");
399399
pop(); // Body
400400
pop(); // Initializers

‎pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -671,9 +671,10 @@ class KernelLibraryBuilder
671671
int charOffset,
672672
int charOpenParenOffset,
673673
int charEndOffset,
674-
String nativeMethodName) {
674+
String nativeMethodName,
675+
{Token beginInitializers}) {
675676
MetadataCollector metadataCollector = loader.target.metadataCollector;
676-
ProcedureBuilder procedure = new KernelConstructorBuilder(
677+
KernelConstructorBuilder procedure = new KernelConstructorBuilder(
677678
metadata,
678679
modifiers & ~abstractMask,
679680
returnType,
@@ -699,7 +700,12 @@ class KernelLibraryBuilder
699700
if (nativeMethodName != null) {
700701
addNativeMethod(procedure);
701702
}
702-
if (procedure.isConst) currentDeclaration?.hasConstConstructor = true;
703+
if (procedure.isConst) {
704+
currentDeclaration?.hasConstConstructor = true;
705+
// const constructors will have their initializers compiled and written
706+
// into the outline.
707+
procedure.beginInitializers = beginInitializers;
708+
}
703709
}
704710

705711
void addProcedure(

‎pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ import 'package:kernel/ast.dart'
3434

3535
import 'package:kernel/type_algebra.dart' show containsTypeVariable, substitute;
3636

37+
import '../../scanner/token.dart' show Token;
38+
3739
import '../loader.dart' show Loader;
3840

3941
import '../messages.dart'
@@ -415,6 +417,8 @@ class KernelConstructorBuilder extends KernelFunctionBuilder {
415417

416418
RedirectingInitializer redirectingInitializer;
417419

420+
Token beginInitializers;
421+
418422
@override
419423
KernelConstructorBuilder actualOrigin;
420424

@@ -489,6 +493,7 @@ class KernelConstructorBuilder extends KernelFunctionBuilder {
489493
void buildOutlineExpressions(LibraryBuilder library) {
490494
KernelMetadataBuilder.buildAnnotations(
491495
target, metadata, library, parent, this);
496+
beginInitializers = null;
492497
}
493498

494499
FunctionNode buildFunction(LibraryBuilder library) {

‎pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -774,9 +774,10 @@ class ForwardingListener implements Listener {
774774
}
775775

776776
@override
777-
void endMethod(
778-
Token getOrSet, Token beginToken, Token beginParam, Token endToken) {
779-
listener?.endMethod(getOrSet, beginToken, beginParam, endToken);
777+
void endMethod(Token getOrSet, Token beginToken, Token beginParam,
778+
Token beginInitializers, Token endToken) {
779+
listener?.endMethod(
780+
getOrSet, beginToken, beginParam, beginInitializers, endToken);
780781
}
781782

782783
@override

‎pkg/front_end/lib/src/fasta/parser/listener.dart‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -747,8 +747,8 @@ class Listener implements UnescapeErrorListener {
747747
/// - initializers
748748
/// - async marker
749749
/// - body
750-
void endMethod(
751-
Token getOrSet, Token beginToken, Token beginParam, Token endToken) {
750+
void endMethod(Token getOrSet, Token beginToken, Token beginParam,
751+
Token beginInitializers, Token endToken) {
752752
logEvent("Method");
753753
}
754754

‎pkg/front_end/lib/src/fasta/parser/parser.dart‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2516,7 +2516,7 @@ class Parser {
25162516

25172517
Token parseInitializersOpt(Token token) {
25182518
if (optional(':', token.next)) {
2519-
return parseInitializers(token);
2519+
return parseInitializers(token.next);
25202520
} else {
25212521
listener.handleNoInitializers();
25222522
return token;
@@ -2529,7 +2529,7 @@ class Parser {
25292529
/// ;
25302530
/// ```
25312531
Token parseInitializers(Token token) {
2532-
Token begin = token.next;
2532+
Token begin = token;
25332533
assert(optional(':', begin));
25342534
listener.beginInitializers(begin);
25352535
int count = 0;
@@ -3241,8 +3241,10 @@ class Parser {
32413241
? MemberKind.StaticMethod
32423242
: MemberKind.NonStaticMethod;
32433243
Token beforeParam = token;
3244-
token = parseGetterOrFormalParameters(token, name, isGetter, kind);
3245-
token = parseInitializersOpt(token);
3244+
Token beforeInitializers =
3245+
parseGetterOrFormalParameters(token, name, isGetter, kind);
3246+
token = parseInitializersOpt(beforeInitializers);
3247+
if (token == beforeInitializers) beforeInitializers = null;
32463248

32473249
AsyncModifier savedAsyncModifier = asyncState;
32483250
Token asyncToken = token.next;
@@ -3264,7 +3266,8 @@ class Parser {
32643266
(staticToken == null || externalToken != null) && inPlainSync);
32653267
}
32663268
asyncState = savedAsyncModifier;
3267-
listener.endMethod(getOrSet, beforeStart.next, beforeParam.next, token);
3269+
listener.endMethod(getOrSet, beforeStart.next, beforeParam.next,
3270+
beforeInitializers?.next, token);
32683271
return token;
32693272
}
32703273

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -575,8 +575,8 @@ class DietListener extends StackListener {
575575
}
576576

577577
@override
578-
void endMethod(
579-
Token getOrSet, Token beginToken, Token beginParam, Token endToken) {
578+
void endMethod(Token getOrSet, Token beginToken, Token beginParam,
579+
Token beginInitializers, Token endToken) {
580580
debugEvent("Method");
581581
// TODO(danrubel): Consider removing the beginParam parameter
582582
// and using bodyToken, but pushing a NullValue on the stack

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -754,8 +754,8 @@ class OutlineBuilder extends StackListener {
754754
}
755755

756756
@override
757-
void endMethod(
758-
Token getOrSet, Token beginToken, Token beginParam, Token endToken) {
757+
void endMethod(Token getOrSet, Token beginToken, Token beginParam,
758+
Token beginInitializers, Token endToken) {
759759
debugEvent("Method");
760760
MethodBody bodyKind = pop();
761761
if (bodyKind == MethodBody.RedirectingFactoryBody) {
@@ -871,7 +871,8 @@ class OutlineBuilder extends StackListener {
871871
charOffset,
872872
formalsOffset,
873873
endToken.charOffset,
874-
nativeMethodName);
874+
nativeMethodName,
875+
beginInitializers: beginInitializers);
875876
} else {
876877
if (isConst) {
877878
addProblem(messageConstMethod, varFinalOrConstOffset, 5);

0 commit comments

Comments
 (0)