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

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

Issue 2938423003: Implement override-based inference of instance fields. (Closed)
Patch Set: Created 3 years, 6 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 c6f206933384f2afa355c9da30b58ad13d0ce9ef..1a0c7cc87a59ed71d48b960fd2da9f5648c79156 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
@@ -57,6 +57,9 @@ class KernelFieldBuilder extends FieldBuilder<Expression> {
field.initializer = value..parent = field;
}
+ bool get isEligibleForInference =>
+ type == null && (hasInitializer || isInstanceMember);
+
Field build(SourceLibraryBuilder library) {
field.name ??= new Name(name, library.target);
if (type != null) {
@@ -69,9 +72,7 @@ class KernelFieldBuilder extends FieldBuilder<Expression> {
..hasImplicitGetter = isInstanceMember
..hasImplicitSetter = isInstanceMember && !isConst && !isFinal
..isStatic = !isInstanceMember;
- if (initializerTokenForInference != null &&
- !initializerTokenForInference.isEof) {
- assert(type == null);
+ if (isEligibleForInference) {
library.loader.typeInferenceEngine.recordField(field);
}
return field;
@@ -82,8 +83,7 @@ class KernelFieldBuilder extends FieldBuilder<Expression> {
@override
void prepareInitializerInference(
SourceLibraryBuilder library, ClassBuilder currentClass) {
- if (initializerTokenForInference != null &&
- !initializerTokenForInference.isEof) {
+ if (isEligibleForInference) {
var memberScope =
currentClass == null ? library.scope : currentClass.scope;
// TODO(paulberry): Is it correct to pass library.uri into BodyBuilder, or
@@ -92,22 +92,24 @@ class KernelFieldBuilder extends FieldBuilder<Expression> {
var listener = new TypeInferenceListener();
var typeInferrer = typeInferenceEngine.createTopLevelTypeInferrer(
listener, field.enclosingClass?.thisType, field);
- var bodyBuilder = new BodyBuilder(
- library,
- this,
- memberScope,
- null,
- typeInferenceEngine.classHierarchy,
- typeInferenceEngine.coreTypes,
- currentClass,
- isInstanceMember,
- library.uri,
- typeInferrer);
- Parser parser = new Parser(bodyBuilder);
- Token token = parser.parseExpression(initializerTokenForInference);
- Expression expression = bodyBuilder.popForValue();
- bodyBuilder.checkEmpty(token.charOffset);
- initializer = expression;
+ if (hasInitializer) {
+ var bodyBuilder = new BodyBuilder(
+ library,
+ this,
+ memberScope,
+ null,
+ typeInferenceEngine.classHierarchy,
+ typeInferenceEngine.coreTypes,
+ currentClass,
+ isInstanceMember,
+ library.uri,
+ typeInferrer);
+ Parser parser = new Parser(bodyBuilder);
+ Token token = parser.parseExpression(initializerTokenForInference);
+ Expression expression = bodyBuilder.popForValue();
+ bodyBuilder.checkEmpty(token.charOffset);
+ initializer = expression;
+ }
}
}

Powered by Google App Engine
This is Rietveld 408576698