@@ -7,6 +7,7 @@ library fasta.field_builder;
77import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token;
88
99import 'package:kernel/ast.dart' hide MapEntry;
10+ import 'package:kernel/core_types.dart' ;
1011
1112import '../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
414424class 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
732751mixin 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
745765mixin 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
765781mixin 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
0 commit comments