Index: pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart |
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart |
index 8cb5a8d837efea88062ad3d18ba6e637717235b6..40cbe80e12be08140f407d0d4f0e3a202bdab766 100644 |
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart |
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart |
@@ -4,6 +4,20 @@ |
library fasta.kernel_field_builder; |
+import 'package:front_end/src/fasta/builder/ast_factory.dart' show AstFactory; |
+ |
+import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder; |
+ |
+import 'package:front_end/src/fasta/parser/parser.dart' show Parser; |
+ |
+import 'package:front_end/src/fasta/scanner/token.dart' show Token; |
+ |
+import 'package:front_end/src/fasta/builder/class_builder.dart' |
+ show ClassBuilder; |
+ |
+import 'package:front_end/src/fasta/type_inference/type_inferrer.dart' |
+ show TypeInferrer; |
+ |
import 'package:kernel/ast.dart' show Expression, Field, Name; |
import 'kernel_builder.dart' |
@@ -15,14 +29,25 @@ import 'kernel_builder.dart' |
MetadataBuilder; |
class KernelFieldBuilder extends FieldBuilder<Expression> { |
+ final AstFactory astFactory; |
+ final TypeInferrer typeInferrer; |
final Field field; |
final List<MetadataBuilder> metadata; |
final KernelTypeBuilder type; |
+ final Token initializerToken; |
- KernelFieldBuilder(this.metadata, this.type, String name, int modifiers, |
- Builder compilationUnit, int charOffset) |
- : field = new Field(null, fileUri: compilationUnit?.relativeFileUri) |
- ..fileOffset = charOffset, |
+ KernelFieldBuilder( |
+ this.astFactory, |
+ this.typeInferrer, |
+ this.metadata, |
+ this.type, |
+ String name, |
+ int modifiers, |
+ Builder compilationUnit, |
+ int charOffset, |
+ this.initializerToken) |
+ : field = astFactory.field(null, charOffset, |
+ fileUri: compilationUnit?.relativeFileUri), |
super(name, modifiers, compilationUnit, charOffset); |
void set initializer(Expression value) { |
@@ -35,13 +60,44 @@ class KernelFieldBuilder extends FieldBuilder<Expression> { |
field.type = type.build(library); |
} |
bool isInstanceMember = !isStatic && !isTopLevel; |
- return field |
+ field |
..isFinal = isFinal |
..isConst = isConst |
..hasImplicitGetter = isInstanceMember |
..hasImplicitSetter = isInstanceMember && !isConst && !isFinal |
..isStatic = !isInstanceMember; |
+ if (initializerToken != null) { |
+ typeInferrer.recordField(field); |
+ } |
+ return field; |
} |
Field get target => field; |
+ |
+ @override |
+ void prepareInitializerInference(TypeInferrer typeInferrer, |
+ LibraryBuilder library, ClassBuilder currentClass) { |
+ if (initializerToken != null) { |
+ var memberScope = |
+ currentClass == null ? library.scope : currentClass.scope; |
+ var bodyBuilder = new BodyBuilder( |
+ library, |
+ this, |
+ memberScope, |
+ null, |
+ typeInferrer.classHierarchy, |
+ typeInferrer.coreTypes, |
+ currentClass, |
+ isInstanceMember, |
+ library.uri, |
+ typeInferrer, |
+ astFactory, |
+ fieldDependencies: typeInferrer.getFieldDependencies(field)); |
+ Parser parser = new Parser(bodyBuilder); |
+ Token token = parser.parseExpression(initializerToken); |
+ Expression expression = bodyBuilder.popForValue(); |
+ bodyBuilder.checkEmpty(token.charOffset); |
+ initializer = expression; |
+ } |
+ } |
} |