Skip to content

Commit c1f4e21

Browse files
johnniwintherCommit Queue
authored andcommitted
[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 <[email protected]> Reviewed-by: Chloe Stefantsova <[email protected]>
1 parent b0e0482 commit c1f4e21

File tree

5 files changed

+80
-37
lines changed

5 files changed

+80
-37
lines changed

pkg/front_end/lib/src/fragment/constructor/body_builder_context.dart

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,24 @@ class ConstructorBodyBuilderContext extends BodyBuilderContext {
103103
@override
104104
void addInitializer(
105105
Initializer initializer,
106-
ExpressionGeneratorHelper helper, {
107-
required InitializerInferenceResult? inferenceResult,
108-
}) {
106+
ExpressionGeneratorHelper helper,
107+
) {
109108
_builder.addInitializer(
110109
initializer,
111110
helper,
111+
inferenceResult: null,
112+
parent: _member,
113+
);
114+
}
115+
116+
@override
117+
void addInferredInitializer(
118+
InitializerInferenceResult inferenceResult,
119+
ExpressionGeneratorHelper helper,
120+
) {
121+
_builder.addInitializer(
122+
inferenceResult.initializer,
123+
helper,
112124
inferenceResult: inferenceResult,
113125
parent: _member,
114126
);

pkg/front_end/lib/src/kernel/body_builder.dart

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,7 +1183,7 @@ class BodyBuilder extends StackListenerImpl
11831183
);
11841184
}
11851185
for (Initializer initializer in initializers) {
1186-
_context.addInitializer(initializer, this, inferenceResult: null);
1186+
_context.addInitializer(initializer, this);
11871187
}
11881188
}
11891189
}
@@ -2106,12 +2106,8 @@ class BodyBuilder extends StackListenerImpl
21062106
);
21072107

21082108
if (!_context.isExternalConstructor) {
2109-
for (int i = 0; i < initializers.length; i++) {
2110-
_context.addInitializer(
2111-
initializers[i],
2112-
this,
2113-
inferenceResult: inferenceResults[i],
2114-
);
2109+
for (InitializerInferenceResult result in inferenceResults) {
2110+
_context.addInferredInitializer(result, this);
21152111
}
21162112
}
21172113
}
@@ -2122,7 +2118,6 @@ class BodyBuilder extends StackListenerImpl
21222118
buildProblem(cfe.codeConstructorNotSync, body!.fileOffset, noLength),
21232119
),
21242120
this,
2125-
inferenceResult: null,
21262121
);
21272122
}
21282123
if (needsImplicitSuperInitializer) {
@@ -2343,13 +2338,9 @@ class BodyBuilder extends StackListenerImpl
23432338
this,
23442339
typeInferrer,
23452340
);
2346-
_context.addInitializer(
2347-
initializer,
2348-
this,
2349-
inferenceResult: inferenceResult,
2350-
);
2341+
_context.addInferredInitializer(inferenceResult, this);
23512342
} else {
2352-
_context.addInitializer(initializer, this, inferenceResult: null);
2343+
_context.addInitializer(initializer, this);
23532344
}
23542345
}
23552346
if (body == null && !_context.isExternalConstructor) {

pkg/front_end/lib/src/kernel/body_builder_context.dart

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -353,12 +353,20 @@ abstract class BodyBuilderContext {
353353
/// Adds [initializer] to generative constructor currently being built.
354354
void addInitializer(
355355
Initializer initializer,
356-
ExpressionGeneratorHelper helper, {
357-
required InitializerInferenceResult? inferenceResult,
358-
}) {
356+
ExpressionGeneratorHelper helper,
357+
) {
359358
throw new UnsupportedError('${runtimeType}.addInitializer');
360359
}
361360

361+
/// Adds the inferred [Initializer] from the [inferenceResult] to generative
362+
/// constructor currently being built.
363+
void addInferredInitializer(
364+
InitializerInferenceResult inferenceResult,
365+
ExpressionGeneratorHelper helper,
366+
) {
367+
throw new UnsupportedError('${runtimeType}.addInferredInitializer');
368+
}
369+
362370
/// Infers the [initializer].
363371
InitializerInferenceResult inferInitializer(
364372
Initializer initializer,

pkg/front_end/lib/src/type_inference/inference_results.dart

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ abstract class InvocationInferenceResult {
138138
}
139139
return expression;
140140
}
141+
142+
/// Creates the [InitializerResult] corresponding to this
143+
/// [InvocationInferenceResult] for the given [initializer].
144+
InitializerInferenceResult toInitializerResult(Initializer initializer);
141145
}
142146

143147
class SuccessfulInferenceResult implements InvocationInferenceResult {
@@ -276,6 +280,13 @@ class SuccessfulInferenceResult implements InvocationInferenceResult {
276280

277281
@override
278282
bool get isInapplicable => false;
283+
284+
@override
285+
InitializerInferenceResult toInitializerResult(Initializer initializer) {
286+
return new // force line break
287+
SuccessfulInitializerInvocationInferenceResult // force line break
288+
.fromSuccessfulInferenceResult(initializer, this);
289+
}
279290
}
280291

281292
class WrapInProblemInferenceResult implements InvocationInferenceResult {
@@ -325,38 +336,48 @@ class WrapInProblemInferenceResult implements InvocationInferenceResult {
325336
);
326337
}
327338
}
339+
340+
@override
341+
InitializerInferenceResult toInitializerResult(Initializer initializer) {
342+
return new // force line break
343+
WrapInProblemInitializerInferenceResult.fromWrapInProblemInferenceResult(
344+
initializer,
345+
this,
346+
);
347+
}
328348
}
329349

330350
abstract class InitializerInferenceResult {
351+
/// The inferred initializer.
352+
Initializer get initializer;
353+
331354
/// Modifies list of initializers in-place to apply the inference result.
332355
void applyResult(List<Initializer> initializers, TreeNode? parent);
333356

334357
factory InitializerInferenceResult.fromInvocationInferenceResult(
358+
Initializer initializer,
335359
InvocationInferenceResult invocationInferenceResult,
336360
) {
337-
if (invocationInferenceResult is SuccessfulInferenceResult) {
338-
return new // force line break
339-
SuccessfulInitializerInvocationInferenceResult // force line break
340-
.fromSuccessfulInferenceResult(invocationInferenceResult);
341-
} else {
342-
return new WrapInProblemInitializerInferenceResult // force line break
343-
.fromWrapInProblemInferenceResult(
344-
invocationInferenceResult as WrapInProblemInferenceResult,
345-
);
346-
}
361+
return invocationInferenceResult.toInitializerResult(initializer);
347362
}
348363
}
349364

350365
class SuccessfulInitializerInferenceResult
351366
implements InitializerInferenceResult {
352-
const SuccessfulInitializerInferenceResult();
367+
@override
368+
final Initializer initializer;
369+
370+
SuccessfulInitializerInferenceResult(this.initializer);
353371

354372
@override
355373
void applyResult(List<Initializer> initializers, TreeNode? parent) {}
356374
}
357375

358376
class SuccessfulInitializerInvocationInferenceResult
359377
implements InitializerInferenceResult {
378+
@override
379+
final Initializer initializer;
380+
360381
final DartType inferredType;
361382

362383
final FunctionType functionType;
@@ -366,15 +387,18 @@ class SuccessfulInitializerInvocationInferenceResult
366387
final DartType? inferredReceiverType;
367388

368389
SuccessfulInitializerInvocationInferenceResult({
390+
required this.initializer,
369391
required this.inferredType,
370392
required this.functionType,
371393
required this.hoistedArguments,
372394
required this.inferredReceiverType,
373395
});
374396

375397
SuccessfulInitializerInvocationInferenceResult.fromSuccessfulInferenceResult(
398+
Initializer initializer,
376399
SuccessfulInferenceResult successfulInferenceResult,
377400
) : this(
401+
initializer: initializer,
378402
inferredType: successfulInferenceResult.inferredType,
379403
functionType: successfulInferenceResult.functionType,
380404
hoistedArguments: successfulInferenceResult.hoistedArguments,
@@ -398,8 +422,13 @@ class SuccessfulInitializerInvocationInferenceResult
398422

399423
class WrapInProblemInitializerInferenceResult
400424
implements InitializerInferenceResult {
425+
@override
426+
final Initializer initializer;
427+
final WrapInProblemInferenceResult wrapInProblemInferenceResult;
428+
401429
WrapInProblemInitializerInferenceResult.fromWrapInProblemInferenceResult(
402-
WrapInProblemInferenceResult wrapInProblemInferenceResult,
430+
this.initializer,
431+
this.wrapInProblemInferenceResult,
403432
);
404433

405434
@override

pkg/front_end/lib/src/type_inference/inference_visitor.dart

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
10351035
// Coverage-ignore-block(suite): Not run.
10361036
node.statement = (result.statement as AssertStatement)..parent = node;
10371037
}
1038-
return const SuccessfulInitializerInferenceResult();
1038+
return new SuccessfulInitializerInferenceResult(node);
10391039
}
10401040

10411041
@override
@@ -2929,7 +2929,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
29292929
fileOffset: node.fileOffset,
29302930
).expression;
29312931
node.value = initializer..parent = node;
2932-
return const SuccessfulInitializerInferenceResult();
2932+
return new SuccessfulInitializerInferenceResult(node);
29332933
}
29342934

29352935
ForInResult handleForInDeclaringVariable(
@@ -3770,7 +3770,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
37703770
);
37713771
node.variable.initializer = initializerResult.expression
37723772
..parent = node.variable;
3773-
return const SuccessfulInitializerInferenceResult();
3773+
return new SuccessfulInitializerInferenceResult(node);
37743774
}
37753775

37763776
InitializerInferenceResult visitShadowInvalidFieldInitializer(
@@ -3782,7 +3782,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
37823782
isVoidAllowed: false,
37833783
);
37843784
node.value = initializerResult.expression..parent = node;
3785-
return const SuccessfulInitializerInferenceResult();
3785+
return new SuccessfulInitializerInferenceResult(node);
37863786
}
37873787

37883788
@override
@@ -12148,6 +12148,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1214812148
);
1214912149
arguments.resetExplicitTypeArguments();
1215012150
return new InitializerInferenceResult.fromInvocationInferenceResult(
12151+
node,
1215112152
inferenceResult,
1215212153
);
1215312154
}
@@ -12186,6 +12187,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1218612187
staticTarget: node.target,
1218712188
);
1218812189
return new InitializerInferenceResult.fromInvocationInferenceResult(
12190+
node,
1218912191
inferenceResult,
1219012192
);
1219112193
}
@@ -12205,7 +12207,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1220512207
fileOffset: node.fileOffset,
1220612208
).expression;
1220712209
node.value = initializer..parent = node;
12208-
return const SuccessfulInitializerInferenceResult();
12210+
return new SuccessfulInitializerInferenceResult(node);
1220912211
}
1221012212

1221112213
@override
@@ -12548,6 +12550,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1254812550
staticTarget: node.target,
1254912551
);
1255012552
return new InitializerInferenceResult.fromInvocationInferenceResult(
12553+
node,
1255112554
inferenceResult,
1255212555
);
1255312556
}

0 commit comments

Comments
 (0)