Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(430)

Unified Diff: pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart

Issue 2828253003: Add top level type inference logic for integer literals. (Closed)
Patch Set: Clean up, bug fix, and remove unintentional expectations changes Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
+ }
+ }
}

Powered by Google App Engine
This is Rietveld 408576698