[cfe] Pass inferred initializer through InitializerInferenceResult

This prepares for using internal nodes for initializers.

Change-Id: Ic64e4ea8d6d0209556b43e7702fda9ecf8a9b6a0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/448860
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
diff --git a/pkg/front_end/lib/src/fragment/constructor/body_builder_context.dart b/pkg/front_end/lib/src/fragment/constructor/body_builder_context.dart
index 70dc43c..6f0a49d 100644
--- a/pkg/front_end/lib/src/fragment/constructor/body_builder_context.dart
+++ b/pkg/front_end/lib/src/fragment/constructor/body_builder_context.dart
@@ -103,12 +103,24 @@
   @override
   void addInitializer(
     Initializer initializer,
-    ExpressionGeneratorHelper helper, {
-    required InitializerInferenceResult? inferenceResult,
-  }) {
+    ExpressionGeneratorHelper helper,
+  ) {
     _builder.addInitializer(
       initializer,
       helper,
+      inferenceResult: null,
+      parent: _member,
+    );
+  }
+
+  @override
+  void addInferredInitializer(
+    InitializerInferenceResult inferenceResult,
+    ExpressionGeneratorHelper helper,
+  ) {
+    _builder.addInitializer(
+      inferenceResult.initializer,
+      helper,
       inferenceResult: inferenceResult,
       parent: _member,
     );
diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart
index b36509a..5cb64ed 100644
--- a/pkg/front_end/lib/src/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder.dart
@@ -1183,7 +1183,7 @@
               );
             }
             for (Initializer initializer in initializers) {
-              _context.addInitializer(initializer, this, inferenceResult: null);
+              _context.addInitializer(initializer, this);
             }
           }
         }
@@ -2106,12 +2106,8 @@
           );
 
       if (!_context.isExternalConstructor) {
-        for (int i = 0; i < initializers.length; i++) {
-          _context.addInitializer(
-            initializers[i],
-            this,
-            inferenceResult: inferenceResults[i],
-          );
+        for (InitializerInferenceResult result in inferenceResults) {
+          _context.addInferredInitializer(result, this);
         }
       }
     }
@@ -2122,7 +2118,6 @@
           buildProblem(cfe.codeConstructorNotSync, body!.fileOffset, noLength),
         ),
         this,
-        inferenceResult: null,
       );
     }
     if (needsImplicitSuperInitializer) {
@@ -2343,13 +2338,9 @@
           this,
           typeInferrer,
         );
-        _context.addInitializer(
-          initializer,
-          this,
-          inferenceResult: inferenceResult,
-        );
+        _context.addInferredInitializer(inferenceResult, this);
       } else {
-        _context.addInitializer(initializer, this, inferenceResult: null);
+        _context.addInitializer(initializer, this);
       }
     }
     if (body == null && !_context.isExternalConstructor) {
diff --git a/pkg/front_end/lib/src/kernel/body_builder_context.dart b/pkg/front_end/lib/src/kernel/body_builder_context.dart
index 313de29..f4f1b12 100644
--- a/pkg/front_end/lib/src/kernel/body_builder_context.dart
+++ b/pkg/front_end/lib/src/kernel/body_builder_context.dart
@@ -353,12 +353,20 @@
   /// Adds [initializer] to generative constructor currently being built.
   void addInitializer(
     Initializer initializer,
-    ExpressionGeneratorHelper helper, {
-    required InitializerInferenceResult? inferenceResult,
-  }) {
+    ExpressionGeneratorHelper helper,
+  ) {
     throw new UnsupportedError('${runtimeType}.addInitializer');
   }
 
+  /// Adds the inferred [Initializer] from the [inferenceResult] to generative
+  /// constructor currently being built.
+  void addInferredInitializer(
+    InitializerInferenceResult inferenceResult,
+    ExpressionGeneratorHelper helper,
+  ) {
+    throw new UnsupportedError('${runtimeType}.addInferredInitializer');
+  }
+
   /// Infers the [initializer].
   InitializerInferenceResult inferInitializer(
     Initializer initializer,
diff --git a/pkg/front_end/lib/src/type_inference/inference_results.dart b/pkg/front_end/lib/src/type_inference/inference_results.dart
index b2a3c40..16dcb75 100644
--- a/pkg/front_end/lib/src/type_inference/inference_results.dart
+++ b/pkg/front_end/lib/src/type_inference/inference_results.dart
@@ -138,6 +138,10 @@
     }
     return expression;
   }
+
+  /// Creates the [InitializerResult] corresponding to this
+  /// [InvocationInferenceResult] for the given [initializer].
+  InitializerInferenceResult toInitializerResult(Initializer initializer);
 }
 
 class SuccessfulInferenceResult implements InvocationInferenceResult {
@@ -276,6 +280,13 @@
 
   @override
   bool get isInapplicable => false;
+
+  @override
+  InitializerInferenceResult toInitializerResult(Initializer initializer) {
+    return new // force line break
+    SuccessfulInitializerInvocationInferenceResult // force line break
+    .fromSuccessfulInferenceResult(initializer, this);
+  }
 }
 
 class WrapInProblemInferenceResult implements InvocationInferenceResult {
@@ -325,31 +336,38 @@
       );
     }
   }
+
+  @override
+  InitializerInferenceResult toInitializerResult(Initializer initializer) {
+    return new // force line break
+    WrapInProblemInitializerInferenceResult.fromWrapInProblemInferenceResult(
+      initializer,
+      this,
+    );
+  }
 }
 
 abstract class InitializerInferenceResult {
+  /// The inferred initializer.
+  Initializer get initializer;
+
   /// Modifies list of initializers in-place to apply the inference result.
   void applyResult(List<Initializer> initializers, TreeNode? parent);
 
   factory InitializerInferenceResult.fromInvocationInferenceResult(
+    Initializer initializer,
     InvocationInferenceResult invocationInferenceResult,
   ) {
-    if (invocationInferenceResult is SuccessfulInferenceResult) {
-      return new // force line break
-      SuccessfulInitializerInvocationInferenceResult // force line break
-      .fromSuccessfulInferenceResult(invocationInferenceResult);
-    } else {
-      return new WrapInProblemInitializerInferenceResult // force line break
-      .fromWrapInProblemInferenceResult(
-        invocationInferenceResult as WrapInProblemInferenceResult,
-      );
-    }
+    return invocationInferenceResult.toInitializerResult(initializer);
   }
 }
 
 class SuccessfulInitializerInferenceResult
     implements InitializerInferenceResult {
-  const SuccessfulInitializerInferenceResult();
+  @override
+  final Initializer initializer;
+
+  SuccessfulInitializerInferenceResult(this.initializer);
 
   @override
   void applyResult(List<Initializer> initializers, TreeNode? parent) {}
@@ -357,6 +375,9 @@
 
 class SuccessfulInitializerInvocationInferenceResult
     implements InitializerInferenceResult {
+  @override
+  final Initializer initializer;
+
   final DartType inferredType;
 
   final FunctionType functionType;
@@ -366,6 +387,7 @@
   final DartType? inferredReceiverType;
 
   SuccessfulInitializerInvocationInferenceResult({
+    required this.initializer,
     required this.inferredType,
     required this.functionType,
     required this.hoistedArguments,
@@ -373,8 +395,10 @@
   });
 
   SuccessfulInitializerInvocationInferenceResult.fromSuccessfulInferenceResult(
+    Initializer initializer,
     SuccessfulInferenceResult successfulInferenceResult,
   ) : this(
+        initializer: initializer,
         inferredType: successfulInferenceResult.inferredType,
         functionType: successfulInferenceResult.functionType,
         hoistedArguments: successfulInferenceResult.hoistedArguments,
@@ -398,8 +422,13 @@
 
 class WrapInProblemInitializerInferenceResult
     implements InitializerInferenceResult {
+  @override
+  final Initializer initializer;
+  final WrapInProblemInferenceResult wrapInProblemInferenceResult;
+
   WrapInProblemInitializerInferenceResult.fromWrapInProblemInferenceResult(
-    WrapInProblemInferenceResult wrapInProblemInferenceResult,
+    this.initializer,
+    this.wrapInProblemInferenceResult,
   );
 
   @override
diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor.dart b/pkg/front_end/lib/src/type_inference/inference_visitor.dart
index dd4fdbd..f04debc 100644
--- a/pkg/front_end/lib/src/type_inference/inference_visitor.dart
+++ b/pkg/front_end/lib/src/type_inference/inference_visitor.dart
@@ -1035,7 +1035,7 @@
       // Coverage-ignore-block(suite): Not run.
       node.statement = (result.statement as AssertStatement)..parent = node;
     }
-    return const SuccessfulInitializerInferenceResult();
+    return new SuccessfulInitializerInferenceResult(node);
   }
 
   @override
@@ -2929,7 +2929,7 @@
       fileOffset: node.fileOffset,
     ).expression;
     node.value = initializer..parent = node;
-    return const SuccessfulInitializerInferenceResult();
+    return new SuccessfulInitializerInferenceResult(node);
   }
 
   ForInResult handleForInDeclaringVariable(
@@ -3770,7 +3770,7 @@
     );
     node.variable.initializer = initializerResult.expression
       ..parent = node.variable;
-    return const SuccessfulInitializerInferenceResult();
+    return new SuccessfulInitializerInferenceResult(node);
   }
 
   InitializerInferenceResult visitShadowInvalidFieldInitializer(
@@ -3782,7 +3782,7 @@
       isVoidAllowed: false,
     );
     node.value = initializerResult.expression..parent = node;
-    return const SuccessfulInitializerInferenceResult();
+    return new SuccessfulInitializerInferenceResult(node);
   }
 
   @override
@@ -12148,6 +12148,7 @@
     );
     arguments.resetExplicitTypeArguments();
     return new InitializerInferenceResult.fromInvocationInferenceResult(
+      node,
       inferenceResult,
     );
   }
@@ -12186,6 +12187,7 @@
       staticTarget: node.target,
     );
     return new InitializerInferenceResult.fromInvocationInferenceResult(
+      node,
       inferenceResult,
     );
   }
@@ -12205,7 +12207,7 @@
       fileOffset: node.fileOffset,
     ).expression;
     node.value = initializer..parent = node;
-    return const SuccessfulInitializerInferenceResult();
+    return new SuccessfulInitializerInferenceResult(node);
   }
 
   @override
@@ -12548,6 +12550,7 @@
       staticTarget: node.target,
     );
     return new InitializerInferenceResult.fromInvocationInferenceResult(
+      node,
       inferenceResult,
     );
   }