Skip to content

Commit 5013ce6

Browse files
johnniwinthercommit-bot@chromium.org
authored andcommitted
[cfe] Use correct types and errors in late lowering
Change-Id: I6e7dcbd96e151a69fc67a6cd5e5af1620760b02a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/126647 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Jens Johansen <[email protected]> Reviewed-by: Lasse R.H. Nielsen <[email protected]>
1 parent 46a5f35 commit 5013ce6

File tree

57 files changed

+327
-191
lines changed

Some content is hidden

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

57 files changed

+327
-191
lines changed

pkg/front_end/lib/src/fasta/builder/class_builder.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ abstract class ClassBuilder implements DeclarationBuilder {
169169

170170
List<ConstructorReferenceBuilder> get constructorReferences;
171171

172-
void buildOutlineExpressions(LibraryBuilder library);
172+
void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes);
173173

174174
/// Registers a constructor redirection for this class and returns true if
175175
/// this redirection gives rise to a cycle that has not been reported before.
@@ -409,10 +409,10 @@ abstract class ClassBuilderImpl extends DeclarationBuilderImpl
409409
List<ConstructorReferenceBuilder> get constructorReferences => null;
410410

411411
@override
412-
void buildOutlineExpressions(LibraryBuilder library) {
412+
void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes) {
413413
void build(String ignore, Builder declaration) {
414414
MemberBuilder member = declaration;
415-
member.buildOutlineExpressions(library);
415+
member.buildOutlineExpressions(library, coreTypes);
416416
}
417417

418418
MetadataBuilder.buildAnnotations(

pkg/front_end/lib/src/fasta/builder/constructor_builder.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:core' hide MapEntry;
77
import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
88

99
import 'package:kernel/ast.dart';
10+
import 'package:kernel/core_types.dart';
1011

1112
import '../constant_context.dart' show ConstantContext;
1213

@@ -209,8 +210,8 @@ class ConstructorBuilderImpl extends FunctionBuilderImpl
209210
}
210211

211212
@override
212-
void buildOutlineExpressions(LibraryBuilder library) {
213-
super.buildOutlineExpressions(library);
213+
void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes) {
214+
super.buildOutlineExpressions(library, coreTypes);
214215

215216
// For modular compilation purposes we need to include initializers
216217
// for const constructors into the outline.

pkg/front_end/lib/src/fasta/builder/enum_builder.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,11 @@ class EnumBuilder extends SourceClassBuilder {
297297
}
298298
SourceFieldBuilder valuesBuilder = firstMemberNamed("values");
299299
valuesBuilder.build(libraryBuilder);
300-
valuesBuilder.buildBody(new ListLiteral(values,
301-
typeArgument: rawType(library.nonNullable), isConst: true));
300+
valuesBuilder.buildBody(
301+
// TODO(johnniwinther): Create the bodies only when we have core types.
302+
null,
303+
new ListLiteral(values,
304+
typeArgument: rawType(library.nonNullable), isConst: true));
302305
ConstructorBuilderImpl constructorBuilder = constructorScopeBuilder[""];
303306
Constructor constructor = constructorBuilder.build(libraryBuilder);
304307
constructor.initializers.insert(
@@ -343,6 +346,9 @@ class EnumBuilder extends SourceClassBuilder {
343346
new StringLiteral("$name.$constant")
344347
]);
345348
field.buildBody(
349+
// TODO(johnniwinther): Create the bodies only when we have core
350+
// types.
351+
null,
346352
new ConstructorInvocation(constructor, arguments, isConst: true));
347353
}
348354
}

pkg/front_end/lib/src/fasta/builder/extension_builder.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import 'dart:core' hide MapEntry;
66

77
import 'package:kernel/ast.dart';
8+
import 'package:kernel/core_types.dart';
89

910
import '../fasta_codes.dart' show templateInternalProblemNotFoundIn;
1011
import '../scope.dart';
@@ -26,7 +27,7 @@ abstract class ExtensionBuilder implements DeclarationBuilder {
2627
/// Return the [Extension] built by this builder.
2728
Extension get extension;
2829

29-
void buildOutlineExpressions(LibraryBuilder library);
30+
void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes);
3031

3132
/// Looks up extension member by [name] taking privacy into account.
3233
///
@@ -120,10 +121,10 @@ abstract class ExtensionBuilderImpl extends DeclarationBuilderImpl
120121
String get debugName => "ExtensionBuilder";
121122

122123
@override
123-
void buildOutlineExpressions(LibraryBuilder library) {
124+
void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes) {
124125
void build(String ignore, Builder declaration) {
125126
MemberBuilder member = declaration;
126-
member.buildOutlineExpressions(library);
127+
member.buildOutlineExpressions(library, coreTypes);
127128
}
128129

129130
// TODO(johnniwinther): Handle annotations on the extension declaration.

pkg/front_end/lib/src/fasta/builder/field_builder.dart

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ library fasta.field_builder;
77
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
88

99
import 'package:kernel/ast.dart' hide MapEntry;
10+
import 'package:kernel/core_types.dart';
1011

1112
import '../constant_context.dart' show ConstantContext;
1213

@@ -70,7 +71,7 @@ abstract class FieldBuilder implements MemberBuilder {
7071

7172
/// Builds the body of this field using [initializer] as the initializer
7273
/// expression.
73-
void buildBody(Expression initializer);
74+
void buildBody(CoreTypes coreTypes, Expression initializer);
7475

7576
/// Builds the field initializers for each field used to encode this field
7677
/// using the [fileOffset] for the created nodes and [value] as the initial
@@ -154,7 +155,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
154155
bool get hasInitializer => (modifiers & hasInitializerMask) != 0;
155156

156157
@override
157-
void buildBody(Expression initializer) {
158+
void buildBody(CoreTypes coreTypes, Expression initializer) {
158159
assert(!hasBodyBeenBuilt);
159160
hasBodyBeenBuilt = true;
160161
if (!hasInitializer &&
@@ -165,7 +166,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
165166
internalProblem(
166167
messageInternalProblemAlreadyInitialized, charOffset, fileUri);
167168
}
168-
_fieldEncoding.createBodies(initializer);
169+
_fieldEncoding.createBodies(coreTypes, initializer);
169170
}
170171

171172
@override
@@ -220,7 +221,9 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
220221
}
221222

222223
@override
223-
void buildOutlineExpressions(LibraryBuilder library) {
224+
void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes) {
225+
_fieldEncoding.completeSignature(coreTypes);
226+
224227
ClassBuilder classBuilder = isClassMember ? parent : null;
225228
MetadataBuilder.buildAnnotations(
226229
_fieldEncoding.field, metadata, library, classBuilder, this);
@@ -255,7 +258,7 @@ class SourceFieldBuilder extends MemberBuilderImpl implements FieldBuilder {
255258
bodyBuilder.transformCollections, library.library);
256259
initializer = wrapper.operand;
257260
}
258-
buildBody(initializer);
261+
buildBody(coreTypes, initializer);
259262
bodyBuilder.resolveRedirectingFactoryTargets();
260263
}
261264
constInitializerToken = null;
@@ -374,7 +377,7 @@ abstract class FieldEncoding {
374377
///
375378
/// This method is not called for fields in outlines unless their are constant
376379
/// or part of a const constructor.
377-
void createBodies(Expression initializer);
380+
void createBodies(CoreTypes coreTypes, Expression initializer);
378381

379382
List<Initializer> createInitializer(int fileOffset, Expression value,
380383
{bool isSynthetic});
@@ -406,9 +409,16 @@ abstract class FieldEncoding {
406409
SourceFieldBuilder fieldBuilder,
407410
void Function(Member, BuiltMemberKind) f);
408411

412+
/// Returns a list of the field, getters and methods created by this field
413+
/// encoding.
409414
List<ClassMember> getLocalMembers(SourceFieldBuilder fieldBuilder);
410415

416+
/// Returns a list of the setters created by this field encoding.
411417
List<ClassMember> getLocalSetters(SourceFieldBuilder fieldBuilder);
418+
419+
/// Ensures that the signatures all members created by this field encoding
420+
/// are fully typed.
421+
void completeSignature(CoreTypes coreTypes);
412422
}
413423

414424
class RegularFieldEncoding implements FieldEncoding {
@@ -429,7 +439,10 @@ class RegularFieldEncoding implements FieldEncoding {
429439
}
430440

431441
@override
432-
void createBodies(Expression initializer) {
442+
void completeSignature(CoreTypes coreTypes) {}
443+
444+
@override
445+
void createBodies(CoreTypes coreTypes, Expression initializer) {
433446
if (initializer != null) {
434447
_field.initializer = initializer..parent = _field;
435448
}
@@ -538,18 +551,25 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
538551
}
539552

540553
@override
541-
void createBodies(Expression initializer) {
554+
void completeSignature(CoreTypes coreTypes) {
555+
if (_lateIsSetField != null) {
556+
_lateIsSetField.type = coreTypes.boolRawType(Nullability.nonNullable);
557+
}
558+
}
559+
560+
@override
561+
void createBodies(CoreTypes coreTypes, Expression initializer) {
542562
assert(_type != null, "Type has not been computed for field $name.");
543563
_field.initializer = new NullLiteral()..parent = _field;
544564
if (_type.isPotentiallyNullable) {
545565
_lateIsSetField.initializer = new BoolLiteral(false)
546566
..parent = _lateIsSetField;
547567
}
548-
_lateGetter.function.body = _createGetterBody(name, initializer)
568+
_lateGetter.function.body = _createGetterBody(coreTypes, name, initializer)
549569
..parent = _lateGetter.function;
550570
if (_lateSetter != null) {
551571
_lateSetter.function.body = _createSetterBody(
552-
name, _lateSetter.function.positionalParameters.first)
572+
coreTypes, name, _lateSetter.function.positionalParameters.first)
553573
..parent = _lateSetter.function;
554574
}
555575
}
@@ -590,7 +610,8 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
590610
}
591611
}
592612

593-
Statement _createGetterBody(String name, Expression initializer);
613+
Statement _createGetterBody(
614+
CoreTypes coreTypes, String name, Expression initializer);
594615

595616
Procedure _createSetter(String name, Uri fileUri, int charOffset) {
596617
VariableDeclaration parameter = new VariableDeclaration(null);
@@ -603,7 +624,8 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
603624
..fileOffset = charOffset;
604625
}
605626

606-
Statement _createSetterBody(String name, VariableDeclaration parameter);
627+
Statement _createSetterBody(
628+
CoreTypes coreTypes, String name, VariableDeclaration parameter);
607629

608630
@override
609631
DartType get type => _type;
@@ -674,9 +696,6 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
674696
..hasImplicitSetter = isInstanceMember
675697
..isStatic = _field.isStatic
676698
..isExtensionMember = isExtensionMember;
677-
// TODO(johnniwinther): Provide access to a `bool` type here.
678-
/*_lateIsSetField.type =
679-
libraryBuilder.loader.coreTypes.boolNonNullableRawType;*/
680699
}
681700
_lateGetter
682701
..name = new Name(fieldName, libraryBuilder.library)
@@ -731,7 +750,8 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
731750

732751
mixin NonFinalLate on AbstractLateFieldEncoding {
733752
@override
734-
Statement _createSetterBody(String name, VariableDeclaration parameter) {
753+
Statement _createSetterBody(
754+
CoreTypes coreTypes, String name, VariableDeclaration parameter) {
735755
assert(_type != null, "Type has not been computed for field $name.");
736756
return late_lowering.createSetterBody(fileOffset, name, parameter, _type,
737757
shouldReturnValue: false,
@@ -744,7 +764,8 @@ mixin NonFinalLate on AbstractLateFieldEncoding {
744764

745765
mixin LateWithInitializer on AbstractLateFieldEncoding {
746766
@override
747-
Statement _createGetterBody(String name, Expression initializer) {
767+
Statement _createGetterBody(
768+
CoreTypes coreTypes, String name, Expression initializer) {
748769
assert(_type != null, "Type has not been computed for field $name.");
749770
return late_lowering.createGetterWithInitializer(
750771
fileOffset, name, _type, initializer,
@@ -755,19 +776,15 @@ mixin LateWithInitializer on AbstractLateFieldEncoding {
755776
createIsSetWrite: (Expression value) =>
756777
_createFieldSet(_lateIsSetField, value));
757778
}
758-
759-
@override
760-
void createBodies(Expression initializer) {
761-
super.createBodies(initializer);
762-
}
763779
}
764780

765781
mixin LateWithoutInitializer on AbstractLateFieldEncoding {
766782
@override
767-
Statement _createGetterBody(String name, Expression initializer) {
783+
Statement _createGetterBody(
784+
CoreTypes coreTypes, String name, Expression initializer) {
768785
assert(_type != null, "Type has not been computed for field $name.");
769786
return late_lowering.createGetterBodyWithoutInitializer(
770-
fileOffset, name, type, 'Field',
787+
coreTypes, fileOffset, name, type, 'Field',
771788
createVariableRead: () => _createFieldGet(_field),
772789
createIsSetRead: () => _createFieldGet(_lateIsSetField));
773790
}
@@ -794,10 +811,11 @@ class LateFinalFieldWithoutInitializerEncoding extends AbstractLateFieldEncoding
794811
: super(name, fileUri, charOffset, charEndOffset);
795812

796813
@override
797-
Statement _createSetterBody(String name, VariableDeclaration parameter) {
814+
Statement _createSetterBody(
815+
CoreTypes coreTypes, String name, VariableDeclaration parameter) {
798816
assert(_type != null, "Type has not been computed for field $name.");
799817
return late_lowering.createSetterBodyFinal(
800-
fileOffset, name, parameter, type, 'Field',
818+
coreTypes, fileOffset, name, parameter, type, 'Field',
801819
shouldReturnValue: false,
802820
createVariableRead: () => _createFieldGet(_field),
803821
createVariableWrite: (Expression value) =>
@@ -818,7 +836,8 @@ class LateFinalFieldWithInitializerEncoding extends AbstractLateFieldEncoding
818836
Procedure _createSetter(String name, Uri fileUri, int charOffset) => null;
819837

820838
@override
821-
Statement _createSetterBody(String name, VariableDeclaration parameter) =>
839+
Statement _createSetterBody(
840+
CoreTypes coreTypes, String name, VariableDeclaration parameter) =>
822841
null;
823842
}
824843

pkg/front_end/lib/src/fasta/builder/function_builder.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ abstract class FunctionBuilderImpl extends MemberBuilderImpl
483483
}
484484

485485
@override
486-
void buildOutlineExpressions(LibraryBuilder library) {
486+
void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes) {
487487
MetadataBuilder.buildAnnotations(
488488
member, metadata, library, isClassMember ? parent : null, this);
489489

pkg/front_end/lib/src/fasta/builder/member_builder.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ library fasta.member_builder;
77
import 'dart:core' hide MapEntry;
88

99
import 'package:kernel/ast.dart';
10+
import 'package:kernel/core_types.dart';
1011

1112
import '../../base/common.dart';
1213

@@ -53,7 +54,7 @@ abstract class MemberBuilder implements ModifierBuilder, ClassMember {
5354
// TODO(johnniwinther): Remove this and create a [ProcedureBuilder] interface.
5455
ProcedureKind get kind;
5556

56-
void buildOutlineExpressions(LibraryBuilder library);
57+
void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes);
5758

5859
/// Returns the [ClassMember]s for the non-setter members created for this
5960
/// member builder.
@@ -133,7 +134,7 @@ abstract class MemberBuilderImpl extends ModifierBuilderImpl
133134
ProcedureKind get kind => unsupported("kind", charOffset, fileUri);
134135

135136
@override
136-
void buildOutlineExpressions(LibraryBuilder library) {}
137+
void buildOutlineExpressions(LibraryBuilder library, CoreTypes coreTypes) {}
137138

138139
void buildMembers(
139140
LibraryBuilder library, void Function(Member, BuiltMemberKind) f);

pkg/front_end/lib/src/fasta/kernel/body_builder.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,10 +698,10 @@ class BodyBuilder extends ScopeListener<JumpTarget>
698698
libraryBuilder.library);
699699
initializer = wrapper.operand;
700700
}
701-
fieldBuilder.buildBody(initializer);
701+
fieldBuilder.buildBody(coreTypes, initializer);
702702
}
703703
} else if (!fieldBuilder.hasBodyBeenBuilt) {
704-
fieldBuilder.buildBody(null);
704+
fieldBuilder.buildBody(coreTypes, null);
705705
}
706706
}
707707
{

pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5082,7 +5082,11 @@ class InferenceVisitor
50825082
new FunctionNode(
50835083
node.initializer == null
50845084
? late_lowering.createGetterBodyWithoutInitializer(
5085-
fileOffset, node.name, node.type, 'Local',
5085+
inferrer.coreTypes,
5086+
fileOffset,
5087+
node.name,
5088+
node.type,
5089+
'Local',
50865090
createVariableRead: createVariableRead,
50875091
createIsSetRead: createIsSetRead)
50885092
: late_lowering.createGetterWithInitializer(
@@ -5108,8 +5112,13 @@ class InferenceVisitor
51085112
setVariable,
51095113
new FunctionNode(
51105114
node.isFinal
5111-
? late_lowering.createSetterBodyFinal(fileOffset,
5112-
node.name, setterParameter, node.type, 'Local',
5115+
? late_lowering.createSetterBodyFinal(
5116+
inferrer.coreTypes,
5117+
fileOffset,
5118+
node.name,
5119+
setterParameter,
5120+
node.type,
5121+
'Local',
51135122
shouldReturnValue: true,
51145123
createVariableRead: createVariableRead,
51155124
createVariableWrite: createVariableWrite,

pkg/front_end/lib/src/fasta/kernel/kernel_target.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ class KernelTarget extends TargetImplementation {
284284
loader.checkRedirectingFactories(myClasses);
285285
loader.addNoSuchMethodForwarders(myClasses);
286286
loader.checkMixins(myClasses);
287-
loader.buildOutlineExpressions();
287+
loader.buildOutlineExpressions(loader.coreTypes);
288288
installAllComponentProblems(loader.allComponentProblems);
289289
loader.allComponentProblems.clear();
290290
return component;

0 commit comments

Comments
 (0)