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) {