Disable type inference: types of initializing formals
Change-Id: I20887336af4596ad3ed1d83e82767d27f1a4d589
Reviewed-on: https://dart-review.googlesource.com/c/86346
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
diff --git a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
index 47e75a7..0556c747 100644
--- a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
@@ -19,7 +19,7 @@
import 'builder.dart' show Declaration;
abstract class ModifierBuilder extends Declaration {
- final Declaration parent;
+ Declaration parent;
final int charOffset;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
index 999f15e..ec775ef 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
@@ -10,7 +10,10 @@
import 'kernel_builder.dart'
show
+ ClassBuilder,
+ Declaration,
FormalParameterBuilder,
+ KernelFieldBuilder,
KernelLibraryBuilder,
KernelTypeBuilder,
MetadataBuilder,
@@ -67,6 +70,17 @@
name,
null,
charOffset)
+ ..parent = parent
..declaration = declaration);
}
+
+ void finalizeInitializingFormal() {
+ Object cls = parent.parent;
+ if (cls is ClassBuilder) {
+ Declaration field = cls.scope.lookup(name, charOffset, fileUri);
+ if (field is KernelFieldBuilder) {
+ target.type = field.target.type;
+ }
+ }
+ }
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index f7a0daf..94a9cd8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -192,6 +192,8 @@
/// the error message is the corresponding value in the map.
Map<String, String> unserializableExports;
+ List<KernelFormalParameterBuilder> untypedInitializingFormals;
+
KernelLibraryBuilder(Uri uri, Uri fileUri, Loader loader, this.actualOrigin,
[Scope scope, Library target])
: library = target ??
@@ -633,6 +635,11 @@
charOpenParenOffset,
charEndOffset,
nativeMethodName);
+ if (formals != null) {
+ for (int i = 0; i < formals.length; i++) {
+ formals[i].parent = procedure;
+ }
+ }
metadataCollector?.setDocumentationComment(
procedure.target, documentationComment);
metadataCollector?.setConstructorNameOffset(procedure.target, name);
@@ -826,6 +833,10 @@
}
KernelFormalParameterBuilder formal = new KernelFormalParameterBuilder(
metadata, modifiers, type, name, this, charOffset);
+ if (disableTypeInference && hasThis && type == null) {
+ (untypedInitializingFormals ??= <KernelFormalParameterBuilder>[])
+ .add(formal);
+ }
return formal;
}
@@ -1700,6 +1711,17 @@
}
inferredTypes.clear();
}
+
+ @override
+ int finalizeInitializingFormals() {
+ if (!disableTypeInference || untypedInitializingFormals == null) return 0;
+ for (int i = 0; i < untypedInitializingFormals.length; i++) {
+ untypedInitializingFormals[i].finalizeInitializingFormal();
+ }
+ int count = untypedInitializingFormals.length;
+ untypedInitializingFormals = null;
+ return count;
+ }
}
Uri computeLibraryUri(Declaration declaration) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index b31d999..81d311a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -243,6 +243,7 @@
loader.checkSemantics(objectClassBuilder);
loader.finishTypeVariables(objectClassBuilder, dynamicType);
loader.buildComponent();
+ loader.finalizeInitializingFormals();
installDefaultSupertypes();
installSyntheticConstructors(myClasses);
loader.resolveConstructors();
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index bfb77b6..da6f860 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -899,6 +899,8 @@
}
void checkBoundsInOutline(covariant typeEnvironment);
+
+ int finalizeInitializingFormals();
}
/// Unlike [Scope], this scope is used during construction of builders to
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index db24c5f..b8f057b 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -426,6 +426,17 @@
ticker.logMs("Resolved $typeCount types");
}
+ void finalizeInitializingFormals() {
+ int formalCount = 0;
+ builders.forEach((Uri uri, LibraryBuilder library) {
+ if (library.loader == this) {
+ SourceLibraryBuilder sourceLibrary = library;
+ formalCount += sourceLibrary.finalizeInitializingFormals();
+ }
+ });
+ ticker.logMs("Finalized $formalCount initializing formals");
+ }
+
void finishDeferredLoadTearoffs() {
int count = 0;
builders.forEach((Uri uri, LibraryBuilder library) {