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

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

Issue 2943273002: Implement type inference of getters/setters based on inheritance. (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_procedure_builder.dart
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
index 6a5b9a368b78ac1ecf135e7ebf9f92a8b0a0c22a..7c54474acf391221c4b75b6f6250f485bc312943 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
@@ -4,6 +4,15 @@
library fasta.kernel_procedure_builder;
+import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart'
+ show KernelProcedure;
+
+import 'package:front_end/src/fasta/source/source_library_builder.dart'
+ show SourceLibraryBuilder;
+
+import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart'
+ show TypeInferenceListener;
+
import 'package:kernel/ast.dart'
show
Arguments,
@@ -165,7 +174,7 @@ abstract class KernelFunctionBuilder
return function = result;
}
- Member build(LibraryBuilder library);
+ Member build(SourceLibraryBuilder library);
void becomeNative(Loader loader) {
target.isExternal = true;
@@ -185,7 +194,7 @@ abstract class KernelFunctionBuilder
}
class KernelProcedureBuilder extends KernelFunctionBuilder {
- final Procedure procedure;
+ final KernelProcedure procedure;
final int charOpenParenOffset;
AsyncMarker actualAsyncModifier = AsyncMarker.Sync;
@@ -206,7 +215,7 @@ class KernelProcedureBuilder extends KernelFunctionBuilder {
int charEndOffset,
[String nativeMethodName,
this.redirectionTarget])
- : procedure = new Procedure(null, kind, null,
+ : procedure = new KernelProcedure(null, kind, null,
fileUri: compilationUnit?.relativeFileUri)
..fileOffset = charOffset
..fileEndOffset = charEndOffset,
@@ -236,7 +245,18 @@ class KernelProcedureBuilder extends KernelFunctionBuilder {
}
}
- Procedure build(LibraryBuilder library) {
+ bool get isEligibleForGetterSetterInference {
+ if (!isInstanceMember) return false;
+ if (isGetter) {
+ return returnType == null;
+ } else if (isSetter) {
+ return formals != null && formals.length > 0 && formals[0].type == null;
+ } else {
+ return false;
+ }
+ }
+
+ Procedure build(SourceLibraryBuilder library) {
// TODO(ahe): I think we may call this twice on parts. Investigate.
if (procedure.name == null) {
procedure.function = buildFunction(library);
@@ -249,10 +269,24 @@ class KernelProcedureBuilder extends KernelFunctionBuilder {
procedure.isConst = isConst;
procedure.name = new Name(name, library.target);
}
+ if (isEligibleForGetterSetterInference) {
+ library.loader.typeInferenceEngine.recordMember(procedure);
+ }
return procedure;
}
Procedure get target => procedure;
+
+ @override
+ void prepareInitializerInference(
+ SourceLibraryBuilder library, ClassBuilder currentClass) {
+ if (isEligibleForGetterSetterInference) {
+ var typeInferenceEngine = library.loader.typeInferenceEngine;
+ var listener = new TypeInferenceListener();
+ typeInferenceEngine.createTopLevelTypeInferrer(
+ listener, procedure.enclosingClass?.thisType, procedure);
+ }
+ }
}
// TODO(ahe): Move this to own file?
@@ -297,7 +331,7 @@ class KernelConstructorBuilder extends KernelFunctionBuilder {
return isRedirectingGenerativeConstructorImplementation(constructor);
}
- Constructor build(LibraryBuilder library) {
+ Constructor build(SourceLibraryBuilder library) {
if (constructor.name == null) {
constructor.function = buildFunction(library);
constructor.function.parent = constructor;

Powered by Google App Engine
This is Rietveld 408576698