Skip to content

Commit 4f8af89

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Remove the need for TypeInferrer.constantContext
This changes the body builder to create an InvalidExpression for new expressions in constant contexts, thus avoiding the need to handle this case in the inference, avoiding the need for passing constantContext to the inferrer. Change-Id: Ia8d5b3a6462e7a1570a092d5808bf262345b424b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/451021 Reviewed-by: Chloe Stefantsova <[email protected]> Reviewed-by: Erik Ernst <[email protected]> Commit-Queue: Johnni Winther <[email protected]>
1 parent 952d768 commit 4f8af89

29 files changed

+203
-372
lines changed

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,10 @@ class ConstructorBodyBuilderContext extends BodyBuilderContext {
139139
InitializerInferenceResult inferInitializer({
140140
required TypeInferrer typeInferrer,
141141
required Uri fileUri,
142-
required ConstantContext constantContext,
143142
required Initializer initializer,
144143
}) {
145144
return typeInferrer.inferInitializer(
146145
fileUri: fileUri,
147-
constantContext: constantContext,
148146
constructorBuilder: _builder,
149147
initializer: initializer,
150148
);

pkg/front_end/lib/src/fragment/factory/encoding.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import 'package:kernel/class_hierarchy.dart';
77
import 'package:kernel/type_algebra.dart';
88
import 'package:kernel/type_environment.dart';
99

10-
import '../../base/constant_context.dart';
1110
import '../../base/identifiers.dart';
1211
import '../../base/lookup_result.dart';
1312
import '../../base/messages.dart';
@@ -282,7 +281,6 @@ class FactoryEncoding implements InferredTypeListener {
282281
targetType: target.function!.computeFunctionType(
283282
Nullability.nonNullable,
284283
),
285-
constantContext: ConstantContext.none,
286284
);
287285
if (typeArguments == null) {
288286
assert(

pkg/front_end/lib/src/fragment/field/declaration.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import 'package:kernel/core_types.dart';
1010
import 'package:kernel/type_environment.dart';
1111

1212
import '../../api_prototype/experimental_flags.dart';
13-
import '../../base/constant_context.dart';
1413
import '../../base/messages.dart';
1514
import '../../base/problems.dart';
1615
import '../../base/scope.dart';
@@ -314,15 +313,13 @@ class RegularFieldDeclaration
314313
required TypeInferrer typeInferrer,
315314
required CoreTypes coreTypes,
316315
required Uri fileUri,
317-
required ConstantContext constantContext,
318316
Expression? initializer,
319317
}) {
320318
if (initializer != null) {
321319
if (!hasBodyBeenBuilt) {
322320
initializer = typeInferrer
323321
.inferFieldInitializer(
324322
fileUri: fileUri,
325-
constantContext: constantContext,
326323
declaredType: fieldType,
327324
initializer: initializer,
328325
)
@@ -920,7 +917,6 @@ abstract class FieldFragmentDeclaration {
920917
required TypeInferrer typeInferrer,
921918
required CoreTypes coreTypes,
922919
required Uri fileUri,
923-
required ConstantContext constantContext,
924920
Expression? initializer,
925921
});
926922

pkg/front_end/lib/src/fragment/primary_constructor_field.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,15 +130,13 @@ class PrimaryConstructorFieldDeclaration
130130
required TypeInferrer typeInferrer,
131131
required CoreTypes coreTypes,
132132
required Uri fileUri,
133-
required ConstantContext constantContext,
134133
Expression? initializer,
135134
}) {
136135
if (initializer != null) {
137136
if (!hasBodyBeenBuilt) {
138137
initializer = typeInferrer
139138
.inferFieldInitializer(
140139
fileUri: fileUri,
141-
constantContext: constantContext,
142140
declaredType: fieldType,
143141
initializer: initializer,
144142
)

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

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ class BodyBuilderImpl extends StackListenerImpl
365365
required this.uri,
366366
required this.assignedVariables,
367367
required this.typeEnvironment,
368-
required this.constantContext,
368+
required ConstantContext constantContext,
369369
}) : _context = context,
370370
forest = const Forest(),
371371
enableNative = libraryBuilder.loader.target.backendTarget.enableNative(
@@ -377,6 +377,7 @@ class BodyBuilderImpl extends StackListenerImpl
377377
benchmarker = libraryBuilder.loader.target.benchmarker,
378378
_localScopes = new LocalStack([enclosingScope]),
379379
_labelScopes = new LocalStack([new LabelScopeImpl()]) {
380+
this.constantContext = constantContext;
380381
if (formalParameterScope != null) {
381382
for (VariableBuilder builder in formalParameterScope!.localVariables) {
382383
assignedVariables.declare(builder.variable!);
@@ -6368,13 +6369,6 @@ class BodyBuilderImpl extends StackListenerImpl
63686369
void beginNewExpression(Token token) {
63696370
debugEvent("beginNewExpression");
63706371
super.push(constantContext);
6371-
if (constantContext != ConstantContext.none) {
6372-
addProblem(
6373-
cfe.codeNotConstantExpression.withArgumentsOld('New expression'),
6374-
token.charOffset,
6375-
token.length,
6376-
);
6377-
}
63786372
constantContext = ConstantContext.none;
63796373
}
63806374

@@ -6416,6 +6410,19 @@ class BodyBuilderImpl extends StackListenerImpl
64166410
inMetadata: false,
64176411
inImplicitCreationContext: false,
64186412
);
6413+
if (constantContext != ConstantContext.none) {
6414+
pop(); // Pop the created new expression.
6415+
push(
6416+
buildProblem(
6417+
message: cfe.codeNotConstantExpression.withArgumentsOld(
6418+
'New expression',
6419+
),
6420+
fileUri: uri,
6421+
fileOffset: token.charOffset,
6422+
length: token.length,
6423+
),
6424+
);
6425+
}
64196426
}
64206427

64216428
void _buildConstructorReferenceInvocation(

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,6 @@ abstract class BodyBuilderContext {
375375
InitializerInferenceResult inferInitializer({
376376
required TypeInferrer typeInferrer,
377377
required Uri fileUri,
378-
required ConstantContext constantContext,
379378
required Initializer initializer,
380379
}) {
381380
throw new UnsupportedError('${runtimeType}.inferInitializer');

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ import 'package:kernel/ast.dart';
66
import 'package:kernel/src/printer.dart';
77

88
import '../base/problems.dart' show unsupported;
9-
109
import '../type_inference/type_schema.dart';
11-
1210
import 'collections.dart'
1311
show
1412
ForElement,
@@ -24,7 +22,6 @@ import 'collections.dart'
2422
PatternForElement,
2523
PatternForMapEntry,
2624
SpreadElement;
27-
2825
import 'internal_ast.dart';
2926

3027
/// A shadow tree factory.

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -453,12 +453,14 @@ class FactoryConstructorInvocation extends InternalExpression {
453453
bool hasBeenInferred = false;
454454
final Procedure target;
455455
ArgumentsImpl arguments;
456+
457+
/// If `true`, this invocation is constant, either explicit or inferred.
456458
final bool isConst;
457459

458460
FactoryConstructorInvocation(
459461
this.target,
460462
this.arguments, {
461-
this.isConst = false,
463+
required this.isConst,
462464
}) {
463465
arguments.parent = this;
464466
}
@@ -548,13 +550,15 @@ class TypeAliasedFactoryInvocation extends InternalExpression {
548550
final TypeAliasBuilder typeAliasBuilder;
549551
final Procedure target;
550552
ArgumentsImpl arguments;
553+
554+
/// If `true`, this invocation is constant, either explicit or inferred.
551555
final bool isConst;
552556

553557
TypeAliasedFactoryInvocation(
554558
this.typeAliasBuilder,
555559
this.target,
556560
this.arguments, {
557-
this.isConst = false,
561+
required this.isConst,
558562
}) {
559563
arguments.parent = this;
560564
}
@@ -4456,6 +4460,8 @@ class DotShorthandInvocation extends InternalExpression {
44564460
final Name name;
44574461
final int nameOffset;
44584462
final ArgumentsImpl arguments;
4463+
4464+
/// If `true`, this invocation is constant, either explicit or inferred.
44594465
final bool isConst;
44604466

44614467
DotShorthandInvocation(

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

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,13 @@ class Resolver {
122122
annotatable.addAnnotation(expression);
123123
}
124124
context.inferSingleTargetAnnotation(
125-
constantContext: constantContext,
126125
singleTarget: new SingleTargetAnnotations(
127126
annotatable,
128127
indicesOfAnnotationsToBeInferred,
129128
),
130129
);
131130
// TODO(johnniwinther): We need to process annotations within annotations.
132-
context.performBacklog(null, constantContext);
131+
context.performBacklog(null);
133132

134133
for (Annotation annotation in annotations) {
135134
annotation.expression =
@@ -211,7 +210,6 @@ class Resolver {
211210
problemReporting: problemReporting,
212211
libraryFeatures: libraryFeatures,
213212
typeEnvironment: context.typeEnvironment,
214-
constantContext: constantContext,
215213
target: constructorBuilder.invokeTarget,
216214
arguments: arguments,
217215
fileUri: fileUri,
@@ -220,14 +218,13 @@ class Resolver {
220218
ExpressionInferenceResult inferenceResult = context.typeInferrer
221219
.inferFieldInitializer(
222220
fileUri: fileUri,
223-
constantContext: constantContext,
224221
declaredType: const UnknownType(),
225222
initializer: initializer,
226223
);
227224
initializer = inferenceResult.expression;
228225
fieldType = inferenceResult.inferredType;
229226
}
230-
context.performBacklog(result?.annotations, constantContext);
227+
context.performBacklog(result?.annotations);
231228

232229
return (initializer, fieldType);
233230
}
@@ -267,7 +264,6 @@ class Resolver {
267264
);
268265
DartType inferredType = context.typeInferrer.inferImplicitFieldType(
269266
fileUri: fileUri,
270-
constantContext: constantContext,
271267
initializer: result.initializer,
272268
);
273269
// TODO(johnniwinther): We through away the initializer and don't process
@@ -307,12 +303,11 @@ class Resolver {
307303
Expression initializer = context.typeInferrer
308304
.inferFieldInitializer(
309305
fileUri: fileUri,
310-
constantContext: constantContext,
311306
declaredType: fieldType,
312307
initializer: result.initializer,
313308
)
314309
.expression;
315-
context.performBacklog(result.annotations, constantContext);
310+
context.performBacklog(result.annotations);
316311
return initializer;
317312
}
318313

@@ -359,11 +354,10 @@ class Resolver {
359354
typeInferrer: context.typeInferrer,
360355
coreTypes: _coreTypes,
361356
fileUri: fileUri,
362-
constantContext: constantContext,
363357
initializer: initializer,
364358
);
365359
}
366-
context.performBacklog(result.annotations, constantContext);
360+
context.performBacklog(result.annotations);
367361
}
368362

369363
void buildFunctionBody({
@@ -430,7 +424,7 @@ class Resolver {
430424
constantContext: constantContext,
431425
needsImplicitSuperInitializer: result.needsImplicitSuperInitializer,
432426
);
433-
context.performBacklog(result.annotations, constantContext);
427+
context.performBacklog(result.annotations);
434428
}
435429
// Coverage-ignore(suite): Not run.
436430
on DebugAbort {
@@ -510,7 +504,7 @@ class Resolver {
510504
initializers: initializers,
511505
);
512506
}
513-
context.performBacklog(result.annotations, constantContext);
507+
context.performBacklog(result.annotations);
514508
}
515509

516510
List<Initializer>? buildInitializersUnfinished({
@@ -581,11 +575,10 @@ class Resolver {
581575
annotatable.addAnnotation(expression);
582576
}
583577
context.inferSingleTargetAnnotation(
584-
constantContext: constantContext,
585578
singleTarget: new SingleTargetAnnotations(annotatable),
586579
);
587580
List<Expression> expressions = annotatable.annotations;
588-
context.performBacklog(result.annotations, constantContext);
581+
context.performBacklog(result.annotations);
589582
return expressions;
590583
}
591584

@@ -620,9 +613,8 @@ class Resolver {
620613
initializer: result.initializer,
621614
declaredType: declaredType,
622615
hasDeclaredInitializer: hasDeclaredInitializer,
623-
constantContext: constantContext,
624616
);
625-
context.performBacklog(result.annotations, constantContext);
617+
context.performBacklog(result.annotations);
626618
return initializer;
627619
}
628620

@@ -686,7 +678,7 @@ class Resolver {
686678
needsImplicitSuperInitializer: bodyBuilderContext
687679
.needsImplicitSuperInitializer(_coreTypes),
688680
);
689-
context.performBacklog(result.annotations, constantContext);
681+
context.performBacklog(result.annotations);
690682
}
691683
// Coverage-ignore(suite): Not run.
692684
on DebugAbort {
@@ -739,7 +731,7 @@ class Resolver {
739731
);
740732
BuildRedirectingFactoryMethodResult result = bodyBuilder
741733
.buildRedirectingFactoryMethod(token: token, metadata: metadata);
742-
context.performBacklog(result.annotations, constantContext);
734+
context.performBacklog(result.annotations);
743735
_benchmarker
744736
// Coverage-ignore(suite): Not run.
745737
?.endSubdivide();
@@ -854,7 +846,6 @@ class Resolver {
854846
fileUri: fileUri,
855847
fileOffset: fileOffset,
856848
returnType: const DynamicType(),
857-
constantContext: constantContext,
858849
asyncMarker: AsyncMarker.Sync,
859850
body: fakeReturn,
860851
expressionEvaluationHelper: expressionEvaluationHelper,
@@ -864,7 +855,7 @@ class Resolver {
864855
"Previously implicit assumption about inferFunctionBody "
865856
"not returning anything different.",
866857
);
867-
context.performBacklog(result.annotations, constantContext);
858+
context.performBacklog(result.annotations);
868859
return fakeReturn.expression!;
869860
}
870861

@@ -873,7 +864,6 @@ class Resolver {
873864
required ProblemReporting problemReporting,
874865
required LibraryFeatures libraryFeatures,
875866
required TypeEnvironment typeEnvironment,
876-
required ConstantContext constantContext,
877867
required Member target,
878868
required ArgumentsImpl arguments,
879869
required Uri fileUri,
@@ -1308,7 +1298,6 @@ class Resolver {
13081298
initializers.length,
13091299
(index) => bodyBuilderContext.inferInitializer(
13101300
typeInferrer: context.typeInferrer,
1311-
constantContext: constantContext,
13121301
fileUri: fileUri,
13131302
initializer: initializers[index],
13141303
),
@@ -1585,7 +1574,6 @@ class Resolver {
15851574
.inferInitializer(
15861575
typeInferrer: context.typeInferrer,
15871576
fileUri: fileUri,
1588-
constantContext: constantContext,
15891577
initializer: initializer,
15901578
);
15911579
if (!bodyBuilderContext.addInferredInitializer(
@@ -1700,7 +1688,6 @@ class Resolver {
17001688
initializer: initializer,
17011689
declaredType: originParameter.type,
17021690
hasDeclaredInitializer: parameter.hasDeclaredInitializer,
1703-
constantContext: constantContext,
17041691
);
17051692
originParameter.initializer = initializer..parent = originParameter;
17061693
if (initializer is InvalidExpression) {
@@ -1749,7 +1736,6 @@ class Resolver {
17491736
fileUri: fileUri,
17501737
fileOffset: bodyBuilderContext.memberNameOffset,
17511738
returnType: bodyBuilderContext.returnTypeContext,
1752-
constantContext: constantContext,
17531739
asyncMarker: asyncModifier,
17541740
body: body,
17551741
);

0 commit comments

Comments
 (0)