Skip to content

Commit 2b97a2f

Browse files
johnniwintherCommit Bot
authored and
Commit Bot
committed
[cfe] Remove state from InferenceVisitor
This adds a _MapLiteralEntryOffsets class used to collect information during map entry inferences instead of passing it through fields on the visitor itself. Change-Id: Id575bc56b8fce707fb038a695bfe347ca4d6432d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/247964 Commit-Queue: Johnni Winther <[email protected]> Reviewed-by: Chloe Stefantsova <[email protected]>
1 parent 2aa637a commit 2b97a2f

File tree

1 file changed

+55
-45
lines changed

1 file changed

+55
-45
lines changed

pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart

+55-45
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,6 @@ class InferenceVisitor
4848

4949
Class? mapEntryClass;
5050

51-
// Stores the offset of the map entry found by inferMapEntry.
52-
int? mapEntryOffset = null;
53-
54-
// Stores the offset of the map spread found by inferMapEntry.
55-
int? mapSpreadOffset = null;
56-
57-
// Stores the offset of the iterable spread found by inferMapEntry.
58-
int? iterableSpreadOffset = null;
59-
60-
// Stores the type of the iterable spread found by inferMapEntry.
61-
DartType? iterableSpreadType = null;
62-
6351
InferenceVisitor(this.inferrer);
6452

6553
/// Computes uri and offset for [node] for internal errors in a way that is
@@ -2174,7 +2162,8 @@ class InferenceVisitor
21742162
Map<TreeNode, DartType> inferredSpreadTypes,
21752163
Map<Expression, DartType> inferredConditionTypes,
21762164
bool inferenceNeeded,
2177-
bool typeChecksNeeded) {
2165+
bool typeChecksNeeded,
2166+
_MapLiteralEntryOffsets offsets) {
21782167
if (entry is SpreadMapEntry) {
21792168
ExpressionInferenceResult spreadResult = inferrer.inferExpression(
21802169
entry.expression, spreadContext, inferenceNeeded || typeChecksNeeded,
@@ -2230,7 +2219,7 @@ class InferenceVisitor
22302219

22312220
// Don't report the error here, it might be an ambiguous Set. The
22322221
// error is reported in checkMapEntry if it's disambiguated as map.
2233-
iterableSpreadType = spreadType;
2222+
offsets.iterableSpreadType = spreadType;
22342223
} else {
22352224
Expression receiver = entry.expression;
22362225
Expression problem = inferrer.helper.buildProblem(
@@ -2389,10 +2378,10 @@ class InferenceVisitor
23892378
inferrer.coreTypes.iterableRawType(inferrer.libraryBuilder.nullable),
23902379
SubtypeCheckMode.withNullabilities);
23912380
if (isMap && !isIterable) {
2392-
mapSpreadOffset = entry.fileOffset;
2381+
offsets.mapSpreadOffset = entry.fileOffset;
23932382
}
23942383
if (!isMap && isIterable) {
2395-
iterableSpreadOffset = entry.expression.fileOffset;
2384+
offsets.iterableSpreadOffset = entry.expression.fileOffset;
23962385
}
23972386

23982387
return replacement;
@@ -2421,17 +2410,17 @@ class InferenceVisitor
24212410
inferredSpreadTypes,
24222411
inferredConditionTypes,
24232412
inferenceNeeded,
2424-
typeChecksNeeded);
2413+
typeChecksNeeded,
2414+
offsets);
24252415
entry.then = then..parent = entry;
2426-
MapLiteralEntry otherwise;
24272416
if (entry.otherwise != null) {
24282417
inferrer.flowAnalysis.ifStatement_elseBegin();
24292418
// We need to modify the actual types added in the recursive call to
24302419
// inferMapEntry.
24312420
DartType? actualValueType = actualTypes.removeLast();
24322421
DartType? actualKeyType = actualTypes.removeLast();
24332422
DartType actualTypeForSet = actualTypesForSet.removeLast();
2434-
otherwise = inferMapEntry(
2423+
MapLiteralEntry otherwise = inferMapEntry(
24352424
entry.otherwise!,
24362425
entry,
24372426
inferredKeyType,
@@ -2442,7 +2431,8 @@ class InferenceVisitor
24422431
inferredSpreadTypes,
24432432
inferredConditionTypes,
24442433
inferenceNeeded,
2445-
typeChecksNeeded);
2434+
typeChecksNeeded,
2435+
offsets);
24462436
int length = actualTypes.length;
24472437
actualTypes[length - 2] = inferrer.typeSchemaEnvironment
24482438
.getStandardUpperBound(actualKeyType, actualTypes[length - 2],
@@ -2524,7 +2514,8 @@ class InferenceVisitor
25242514
inferredSpreadTypes,
25252515
inferredConditionTypes,
25262516
inferenceNeeded,
2527-
typeChecksNeeded);
2517+
typeChecksNeeded,
2518+
offsets);
25282519
entry.body = body..parent = entry;
25292520
inferrer.flowAnalysis.for_updaterBegin();
25302521
for (int index = 0; index < entry.updates.length; index++) {
@@ -2576,7 +2567,8 @@ class InferenceVisitor
25762567
inferredSpreadTypes,
25772568
inferredConditionTypes,
25782569
inferenceNeeded,
2579-
typeChecksNeeded);
2570+
typeChecksNeeded,
2571+
offsets);
25802572
entry.body = body..parent = entry;
25812573
// This is matched by the call to [forEach_bodyBegin] in
25822574
// [handleForInWithoutVariable] or [handleForInDeclaringVariable].
@@ -2603,7 +2595,7 @@ class InferenceVisitor
26032595
actualTypes.add(valueResult.inferredType);
26042596
// Use 'dynamic' for error recovery.
26052597
actualTypesForSet.add(const DynamicType());
2606-
mapEntryOffset = entry.fileOffset;
2598+
offsets.mapEntryOffset = entry.fileOffset;
26072599
return entry;
26082600
}
26092601
}
@@ -2613,18 +2605,19 @@ class InferenceVisitor
26132605
DartType keyType,
26142606
DartType valueType,
26152607
Map<TreeNode, DartType> inferredSpreadTypes,
2616-
Map<Expression, DartType> inferredConditionTypes) {
2608+
Map<Expression, DartType> inferredConditionTypes,
2609+
_MapLiteralEntryOffsets offsets) {
26172610
// It's disambiguated as a map literal.
26182611
MapLiteralEntry replacement = entry;
2619-
if (iterableSpreadOffset != null) {
2612+
if (offsets.iterableSpreadOffset != null) {
26202613
replacement = new MapLiteralEntry(
26212614
inferrer.helper.buildProblem(
26222615
templateSpreadMapEntryTypeMismatch.withArguments(
2623-
iterableSpreadType!, inferrer.isNonNullableByDefault),
2624-
iterableSpreadOffset!,
2616+
offsets.iterableSpreadType!, inferrer.isNonNullableByDefault),
2617+
offsets.iterableSpreadOffset!,
26252618
1),
26262619
new NullLiteral())
2627-
..fileOffset = iterableSpreadOffset!;
2620+
..fileOffset = offsets.iterableSpreadOffset!;
26282621
}
26292622
if (entry is SpreadMapEntry) {
26302623
DartType? spreadType = inferredSpreadTypes[entry.expression];
@@ -2638,11 +2631,11 @@ class InferenceVisitor
26382631
}
26392632
} else if (entry is IfMapEntry) {
26402633
MapLiteralEntry then = checkMapEntry(entry.then, keyType, valueType,
2641-
inferredSpreadTypes, inferredConditionTypes);
2634+
inferredSpreadTypes, inferredConditionTypes, offsets);
26422635
entry.then = then..parent = entry;
26432636
if (entry.otherwise != null) {
26442637
MapLiteralEntry otherwise = checkMapEntry(entry.otherwise!, keyType,
2645-
valueType, inferredSpreadTypes, inferredConditionTypes);
2638+
valueType, inferredSpreadTypes, inferredConditionTypes, offsets);
26462639
entry.otherwise = otherwise..parent = entry;
26472640
}
26482641
} else if (entry is ForMapEntry) {
@@ -2655,11 +2648,11 @@ class InferenceVisitor
26552648
entry.condition = condition..parent = entry;
26562649
}
26572650
MapLiteralEntry body = checkMapEntry(entry.body, keyType, valueType,
2658-
inferredSpreadTypes, inferredConditionTypes);
2651+
inferredSpreadTypes, inferredConditionTypes, offsets);
26592652
entry.body = body..parent = entry;
26602653
} else if (entry is ForInMapEntry) {
26612654
MapLiteralEntry body = checkMapEntry(entry.body, keyType, valueType,
2662-
inferredSpreadTypes, inferredConditionTypes);
2655+
inferredSpreadTypes, inferredConditionTypes, offsets);
26632656
entry.body = body..parent = entry;
26642657
} else {
26652658
// Do nothing. Assignability checks are done during type inference.
@@ -2735,11 +2728,8 @@ class InferenceVisitor
27352728
bool hasMapEntry = false;
27362729
bool hasMapSpread = false;
27372730
bool hasIterableSpread = false;
2731+
_MapLiteralEntryOffsets offsets = new _MapLiteralEntryOffsets();
27382732
if (inferenceNeeded || typeChecksNeeded) {
2739-
mapEntryOffset = null;
2740-
mapSpreadOffset = null;
2741-
iterableSpreadOffset = null;
2742-
iterableSpreadType = null;
27432733
DartType spreadTypeContext = const UnknownType();
27442734
if (typeContextIsIterable && !typeContextIsMap) {
27452735
spreadTypeContext = inferrer.typeSchemaEnvironment.getTypeAsInstanceOf(
@@ -2754,9 +2744,8 @@ class InferenceVisitor
27542744
<DartType>[inferredKeyType, inferredValueType]);
27552745
}
27562746
for (int index = 0; index < node.entries.length; ++index) {
2757-
MapLiteralEntry entry = node.entries[index];
2758-
entry = inferMapEntry(
2759-
entry,
2747+
MapLiteralEntry entry = inferMapEntry(
2748+
node.entries[index],
27602749
node,
27612750
inferredKeyType,
27622751
inferredValueType,
@@ -2766,16 +2755,17 @@ class InferenceVisitor
27662755
inferredSpreadTypes!,
27672756
inferredConditionTypes!,
27682757
inferenceNeeded,
2769-
typeChecksNeeded);
2758+
typeChecksNeeded,
2759+
offsets);
27702760
node.entries[index] = entry..parent = node;
27712761
if (inferenceNeeded) {
27722762
formalTypes!.add(mapType.typeArguments[0]);
27732763
formalTypes.add(mapType.typeArguments[1]);
27742764
}
27752765
}
2776-
hasMapEntry = mapEntryOffset != null;
2777-
hasMapSpread = mapSpreadOffset != null;
2778-
hasIterableSpread = iterableSpreadOffset != null;
2766+
hasMapEntry = offsets.mapEntryOffset != null;
2767+
hasMapSpread = offsets.mapSpreadOffset != null;
2768+
hasIterableSpread = offsets.iterableSpreadOffset != null;
27792769
}
27802770
if (inferenceNeeded) {
27812771
bool canBeSet = !hasMapSpread && !hasMapEntry && !typeContextIsMap;
@@ -2880,8 +2870,13 @@ class InferenceVisitor
28802870
}
28812871
if (typeChecksNeeded) {
28822872
for (int index = 0; index < node.entries.length; ++index) {
2883-
MapLiteralEntry entry = checkMapEntry(node.entries[index], node.keyType,
2884-
node.valueType, inferredSpreadTypes!, inferredConditionTypes!);
2873+
MapLiteralEntry entry = checkMapEntry(
2874+
node.entries[index],
2875+
node.keyType,
2876+
node.valueType,
2877+
inferredSpreadTypes!,
2878+
inferredConditionTypes!,
2879+
offsets);
28852880
node.entries[index] = entry..parent = node;
28862881
}
28872882
}
@@ -7348,3 +7343,18 @@ class _UriOffset {
73487343

73497344
_UriOffset(this.uri, this.fileOffset);
73507345
}
7346+
7347+
/// Offset and type information collection in [InferenceVisitor.inferMapEntry].
7348+
class _MapLiteralEntryOffsets {
7349+
// Stores the offset of the map entry found by inferMapEntry.
7350+
int? mapEntryOffset;
7351+
7352+
// Stores the offset of the map spread found by inferMapEntry.
7353+
int? mapSpreadOffset;
7354+
7355+
// Stores the offset of the iterable spread found by inferMapEntry.
7356+
int? iterableSpreadOffset;
7357+
7358+
// Stores the type of the iterable spread found by inferMapEntry.
7359+
DartType? iterableSpreadType;
7360+
}

0 commit comments

Comments
 (0)