Skip to content

Commit 03c4a24

Browse files
johnniwintherCommit Queue
authored andcommitted
[cfe] Remove InferenceHelper
This removes the InferenceHelper interface which was implemented by the BodyBuilder and moves functions to the CheckHelper extension. This is a step towards separating BodyBuilder from inference. Change-Id: I98f441c5cfb510e39618d2023d724be6bb26ca87 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449320 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Chloe Stefantsova <[email protected]>
1 parent a1e4696 commit 03c4a24

23 files changed

+2237
-1637
lines changed

pkg/front_end/lib/src/base/incremental_compiler.dart

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ import '../builder/declaration_builders.dart'
8282
show ClassBuilder, ExtensionBuilder, ExtensionTypeDeclarationBuilder;
8383
import '../builder/library_builder.dart' show LibraryBuilder;
8484
import '../builder/member_builder.dart' show MemberBuilder;
85-
import '../codes/cfe_codes.dart';
8685
import '../dill/dill_class_builder.dart' show DillClassBuilder;
8786
import '../dill/dill_library_builder.dart' show DillLibraryBuilder;
8887
import '../dill/dill_loader.dart' show DillLoader;
@@ -91,11 +90,11 @@ import '../kernel/benchmarker.dart' show BenchmarkPhases, Benchmarker;
9190
import '../kernel/hierarchy/hierarchy_builder.dart' show ClassHierarchyBuilder;
9291
import '../kernel/internal_ast.dart' show VariableDeclarationImpl;
9392
import '../kernel/kernel_target.dart' show BuildResult, KernelTarget;
93+
import '../source/check_helper.dart';
9494
import '../source/source_compilation_unit.dart' show SourceCompilationUnitImpl;
9595
import '../source/source_library_builder.dart'
9696
show ImplicitLanguageVersion, SourceLibraryBuilder;
9797
import '../source/source_loader.dart';
98-
import '../type_inference/inference_helper.dart' show InferenceHelper;
9998
import '../type_inference/inference_visitor.dart'
10099
show ExpressionEvaluationHelper, OverwrittenInterfaceMember;
101100
import '../util/error_reporter_file_copier.dart' show saveAsGzip;
@@ -108,6 +107,7 @@ import 'compiler_context.dart' show CompilerContext;
108107
import 'hybrid_file_system.dart' show HybridFileSystem;
109108
import 'incremental_serializer.dart' show IncrementalSerializer;
110109
import 'library_graph.dart' show LibraryGraph;
110+
import 'messages.dart';
111111
import 'ticker.dart' show Ticker;
112112
import 'uri_translator.dart' show UriTranslator;
113113
import 'uris.dart' show getPartUri;
@@ -2475,10 +2475,18 @@ class ExpressionEvaluationHelperImpl implements ExpressionEvaluationHelper {
24752475
ExpressionInferenceResult? visitVariableGet(
24762476
VariableGet node,
24772477
DartType typeContext,
2478-
InferenceHelper helper,
2478+
ProblemReporting problemReporting,
2479+
CompilerContext compilerContext,
2480+
Uri fileUri,
24792481
) {
24802482
if (knownButUnavailable.contains(node.variable)) {
2481-
return _returnKnownVariableUnavailable(node, node.variable, helper);
2483+
return _returnKnownVariableUnavailable(
2484+
node,
2485+
node.variable,
2486+
problemReporting,
2487+
compilerContext,
2488+
fileUri,
2489+
);
24822490
}
24832491
return null;
24842492
}
@@ -2487,28 +2495,39 @@ class ExpressionEvaluationHelperImpl implements ExpressionEvaluationHelper {
24872495
ExpressionInferenceResult? visitVariableSet(
24882496
VariableSet node,
24892497
DartType typeContext,
2490-
InferenceHelper helper,
2498+
ProblemReporting problemReporting,
2499+
CompilerContext compilerContext,
2500+
Uri fileUri,
24912501
) {
24922502
if (knownButUnavailable.contains(node.variable)) {
2493-
return _returnKnownVariableUnavailable(node, node.variable, helper);
2503+
return _returnKnownVariableUnavailable(
2504+
node,
2505+
node.variable,
2506+
problemReporting,
2507+
compilerContext,
2508+
fileUri,
2509+
);
24942510
}
24952511
return null;
24962512
}
24972513

24982514
ExpressionInferenceResult _returnKnownVariableUnavailable(
24992515
Expression node,
25002516
VariableDeclaration variable,
2501-
InferenceHelper helper,
2517+
ProblemReporting problemReporting,
2518+
CompilerContext compilerContext,
2519+
Uri fileUri,
25022520
) {
25032521
return new ExpressionInferenceResult(
25042522
variable.type,
2505-
helper.wrapInProblem(
2506-
node,
2507-
codeExpressionEvaluationKnownVariableUnavailable.withArgumentsOld(
2508-
variable.name!,
2509-
),
2510-
node.fileOffset,
2511-
variable.name!.length,
2523+
problemReporting.wrapInProblem(
2524+
compilerContext: compilerContext,
2525+
expression: node,
2526+
message: codeExpressionEvaluationKnownVariableUnavailable
2527+
.withArgumentsOld(variable.name!),
2528+
fileUri: fileUri,
2529+
fileOffset: node.fileOffset,
2530+
length: variable.name!.length,
25122531
errorHasBeenReported: false,
25132532
includeExpression: false,
25142533
),

pkg/front_end/lib/src/builder/formal_parameter_builder.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -303,16 +303,18 @@ class FormalParameterBuilder extends NamedBuilderImpl
303303
scope,
304304
fileUri,
305305
);
306-
bodyBuilder.constantContext = ConstantContext.required;
306+
ConstantContext constantContext = ConstantContext.required;
307+
bodyBuilder.constantContext = constantContext;
307308
assert(!initializerWasInferred);
308309
Expression initializer = bodyBuilder.parseFieldInitializer(
309310
initializerToken!,
310311
);
311312
initializer = bodyBuilder.typeInferrer.inferParameterInitializer(
312-
bodyBuilder,
313-
initializer,
314-
variable!.type,
315-
hasDeclaredInitializer,
313+
fileUri: fileUri,
314+
initializer: initializer,
315+
declaredType: variable!.type,
316+
hasDeclaredInitializer: hasDeclaredInitializer,
317+
constantContext: constantContext,
316318
);
317319
variable!.initializer = initializer..parent = variable;
318320
if (initializer is InvalidExpression) {

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

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,18 @@ class ConstructorBodyBuilderContext extends BodyBuilderContext {
127127
}
128128

129129
@override
130-
InitializerInferenceResult inferInitializer(
131-
Initializer initializer,
132-
ExpressionGeneratorHelper helper,
133-
TypeInferrer typeInferrer,
134-
) {
135-
return typeInferrer.inferInitializer(helper, _builder, initializer);
130+
InitializerInferenceResult inferInitializer({
131+
required TypeInferrer typeInferrer,
132+
required Uri fileUri,
133+
required ConstantContext constantContext,
134+
required Initializer initializer,
135+
}) {
136+
return typeInferrer.inferInitializer(
137+
fileUri: fileUri,
138+
constantContext: constantContext,
139+
constructorBuilder: _builder,
140+
initializer: initializer,
141+
);
136142
}
137143

138144
@override

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -364,14 +364,15 @@ class EnumElementDeclaration
364364
// aren't provided, but required, we'll use it to infer them, and
365365
// 3) in case of erroneous code the constructor invocation should
366366
// be built via a body builder to detect potential errors.
367+
ConstantContext constantContext = ConstantContext.inferred;
367368
BodyBuilder bodyBuilder = libraryBuilder.loader
368369
.createBodyBuilderForOutlineExpression(
369370
libraryBuilder,
370371
sourceEnumBuilder.createBodyBuilderContext(),
371372
_fragment.enclosingScope,
372373
fileUri,
373374
);
374-
bodyBuilder.constantContext = ConstantContext.inferred;
375+
bodyBuilder.constantContext = constantContext;
375376

376377
ArgumentsImpl arguments;
377378
if (token != null) {
@@ -420,9 +421,10 @@ class EnumElementDeclaration
420421
);
421422
ExpressionInferenceResult inferenceResult = bodyBuilder.typeInferrer
422423
.inferFieldInitializer(
423-
bodyBuilder,
424-
const UnknownType(),
425-
initializer,
424+
fileUri: fileUri,
425+
constantContext: constantContext,
426+
declaredType: const UnknownType(),
427+
initializer: initializer,
426428
);
427429
initializer = inferenceResult.expression;
428430
inferredFieldType = inferenceResult.inferredType;

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

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ 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';
1011
import '../../base/identifiers.dart';
1112
import '../../base/lookup_result.dart';
1213
import '../../base/messages.dart';
@@ -37,7 +38,6 @@ import '../../source/source_loader.dart' show SourceLoader;
3738
import '../../source/source_member_builder.dart';
3839
import '../../source/source_type_parameter_builder.dart';
3940
import '../../source/type_parameter_factory.dart';
40-
import '../../type_inference/inference_helper.dart';
4141
import '../../type_inference/type_inferrer.dart';
4242
import '../../type_inference/type_schema.dart';
4343

@@ -246,13 +246,6 @@ class FactoryEncoding implements InferredTypeListener {
246246
_fragment.typeParameterScope,
247247
null,
248248
);
249-
InferenceHelper helper = libraryBuilder.loader
250-
.createBodyBuilderForOutlineExpression(
251-
libraryBuilder,
252-
bodyBuilderContext,
253-
_fragment.enclosingScope,
254-
_fragment.fileUri,
255-
);
256249
MemberLookupResult? result = _redirectionTarget.target;
257250
MemberBuilder? targetBuilder;
258251
if (result != null && !result.isInvalidLookup) {
@@ -281,12 +274,15 @@ class FactoryEncoding implements InferredTypeListener {
281274
}
282275

283276
typeArguments = inferrer.inferRedirectingFactoryTypeArguments(
284-
helper,
285-
_procedure.function.returnType,
286-
_procedure.function,
287-
_fragment.fullNameOffset,
288-
target,
289-
target.function!.computeFunctionType(Nullability.nonNullable),
277+
typeContext: _procedure.function.returnType,
278+
redirectingFactoryFunction: _procedure.function,
279+
fileUri: _fragment.fileUri,
280+
fileOffset: _fragment.fullNameOffset,
281+
target: target,
282+
targetType: target.function!.computeFunctionType(
283+
Nullability.nonNullable,
284+
),
285+
constantContext: ConstantContext.none,
290286
);
291287
if (typeArguments == null) {
292288
assert(

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

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import '../../source/source_library_builder.dart';
3535
import '../../source/source_member_builder.dart';
3636
import '../../source/source_property_builder.dart';
3737
import '../../source/type_parameter_factory.dart';
38-
import '../../type_inference/inference_helper.dart';
3938
import '../../type_inference/type_inference_engine.dart';
4039
import '../../type_inference/type_inferrer.dart';
4140
import '../fragment.dart';
@@ -311,16 +310,22 @@ class RegularFieldDeclaration
311310
}
312311

313312
@override
314-
void buildFieldInitializer(
315-
InferenceHelper helper,
316-
TypeInferrer typeInferrer,
317-
CoreTypes coreTypes,
313+
void buildFieldInitializer({
314+
required TypeInferrer typeInferrer,
315+
required CoreTypes coreTypes,
316+
required Uri fileUri,
317+
required ConstantContext constantContext,
318318
Expression? initializer,
319-
) {
319+
}) {
320320
if (initializer != null) {
321321
if (!hasBodyBeenBuilt) {
322322
initializer = typeInferrer
323-
.inferFieldInitializer(helper, fieldType, initializer)
323+
.inferFieldInitializer(
324+
fileUri: fileUri,
325+
constantContext: constantContext,
326+
declaredType: fieldType,
327+
initializer: initializer,
328+
)
324329
.expression;
325330
buildBody(coreTypes, initializer);
326331
}
@@ -390,14 +395,16 @@ class RegularFieldDeclaration
390395
scope,
391396
fileUri,
392397
);
393-
bodyBuilder.constantContext = _fragment.modifiers.isConst
398+
ConstantContext constantContext = _fragment.modifiers.isConst
394399
? ConstantContext.inferred
395400
: ConstantContext.required;
401+
bodyBuilder.constantContext = constantContext;
396402
Expression initializer = bodyBuilder.typeInferrer
397403
.inferFieldInitializer(
398-
bodyBuilder,
399-
fieldType,
400-
bodyBuilder.parseFieldInitializer(token),
404+
fileUri: fileUri,
405+
constantContext: constantContext,
406+
declaredType: fieldType,
407+
initializer: bodyBuilder.parseFieldInitializer(token),
401408
)
402409
.expression;
403410
buildBody(classHierarchy.coreTypes, initializer);
@@ -683,16 +690,18 @@ class RegularFieldDeclaration
683690
typeInferrer,
684691
fileUri,
685692
);
686-
bodyBuilder.constantContext = _fragment.modifiers.isConst
693+
ConstantContext constantContext = _fragment.modifiers.isConst
687694
? ConstantContext.inferred
688695
: ConstantContext.none;
696+
bodyBuilder.constantContext = constantContext;
689697
bodyBuilder.inFieldInitializer = true;
690698
bodyBuilder.inLateFieldInitializer = _fragment.modifiers.isLate;
691699
Expression initializer = bodyBuilder.parseFieldInitializer(token);
692700

693701
inferredType = typeInferrer.inferImplicitFieldType(
694-
bodyBuilder,
695-
initializer,
702+
fileUri: fileUri,
703+
constantContext: constantContext,
704+
initializer: initializer,
696705
);
697706
} else {
698707
inferredType = const DynamicType();
@@ -931,12 +940,13 @@ mixin FieldDeclarationMixin
931940
abstract class FieldFragmentDeclaration {
932941
bool get isStatic;
933942

934-
void buildFieldInitializer(
935-
InferenceHelper helper,
936-
TypeInferrer typeInferrer,
937-
CoreTypes coreTypes,
943+
void buildFieldInitializer({
944+
required TypeInferrer typeInferrer,
945+
required CoreTypes coreTypes,
946+
required Uri fileUri,
947+
required ConstantContext constantContext,
938948
Expression? initializer,
939-
);
949+
});
940950

941951
BodyBuilderContext createBodyBuilderContext();
942952

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ import '../source/source_property_builder.dart';
6161
import '../source/source_type_alias_builder.dart';
6262
import '../source/source_type_parameter_builder.dart';
6363
import '../source/type_parameter_factory.dart';
64-
import '../type_inference/inference_helper.dart';
6564
import '../type_inference/inference_results.dart';
6665
import '../type_inference/type_inference_engine.dart';
6766
import '../type_inference/type_inferrer.dart';

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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,16 +125,22 @@ class PrimaryConstructorFieldDeclaration
125125

126126
@override
127127
// Coverage-ignore(suite): Not run.
128-
void buildFieldInitializer(
129-
InferenceHelper helper,
130-
TypeInferrer typeInferrer,
131-
CoreTypes coreTypes,
128+
void buildFieldInitializer({
129+
required TypeInferrer typeInferrer,
130+
required CoreTypes coreTypes,
131+
required Uri fileUri,
132+
required ConstantContext constantContext,
132133
Expression? initializer,
133-
) {
134+
}) {
134135
if (initializer != null) {
135136
if (!hasBodyBeenBuilt) {
136137
initializer = typeInferrer
137-
.inferFieldInitializer(helper, fieldType, initializer)
138+
.inferFieldInitializer(
139+
fileUri: fileUri,
140+
constantContext: constantContext,
141+
declaredType: fieldType,
142+
initializer: initializer,
143+
)
138144
.expression;
139145
buildBody(coreTypes, initializer);
140146
}
@@ -443,14 +449,16 @@ class PrimaryConstructorFieldDeclaration
443449
typeInferrer,
444450
fileUri,
445451
);
446-
bodyBuilder.constantContext = ConstantContext.none;
452+
ConstantContext constantContext = ConstantContext.none;
453+
bodyBuilder.constantContext = constantContext;
447454
bodyBuilder.inFieldInitializer = true;
448455
bodyBuilder.inLateFieldInitializer = false;
449456
Expression initializer = bodyBuilder.parseFieldInitializer(token);
450457

451458
inferredType = typeInferrer.inferImplicitFieldType(
452-
bodyBuilder,
453-
initializer,
459+
fileUri: fileUri,
460+
constantContext: constantContext,
461+
initializer: initializer,
454462
);
455463
} else {
456464
inferredType = const DynamicType();

0 commit comments

Comments
 (0)