[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,
);
}