TypeInferrer.library is null iff topLevel
Change-Id: I6164a0d0334d6a4300fd683dbdd31c8eb81398c0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/96654
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Peter von der Ahé <ahe@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 79389b1..0fc7dd4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -165,11 +165,13 @@
node.arguments,
isConst: node.isConst);
inferrer.storeInferredType(node, inferenceResult.type);
- KernelLibraryBuilder inferrerLibrary = inferrer.library;
- if (!hasExplicitTypeArguments && inferrerLibrary is KernelLibraryBuilder) {
- inferrerLibrary.checkBoundsInConstructorInvocation(
- node, inferrer.typeSchemaEnvironment,
- inferred: true);
+ if (!inferrer.isTopLevel) {
+ KernelLibraryBuilder library = inferrer.library;
+ if (!hasExplicitTypeArguments) {
+ library.checkBoundsInConstructorInvocation(
+ node, inferrer.typeSchemaEnvironment,
+ inferred: true);
+ }
}
}
@@ -224,11 +226,13 @@
node.argumentJudgments,
isConst: node.isConst);
node.inferredType = inferenceResult.type;
- KernelLibraryBuilder inferrerLibrary = inferrer.library;
- if (!hadExplicitTypeArguments && inferrerLibrary is KernelLibraryBuilder) {
- inferrerLibrary.checkBoundsInFactoryInvocation(
- node, inferrer.typeSchemaEnvironment,
- inferred: true);
+ if (!inferrer.isTopLevel) {
+ KernelLibraryBuilder library = inferrer.library;
+ if (!hadExplicitTypeArguments) {
+ library.checkBoundsInFactoryInvocation(
+ node, inferrer.typeSchemaEnvironment,
+ inferred: true);
+ }
}
return null;
}
@@ -772,11 +776,12 @@
}
}
node.inferredType = new InterfaceType(listClass, [inferredTypeArgument]);
- KernelLibraryBuilder inferrerLibrary = inferrer.library;
- if (inferenceNeeded && inferrerLibrary is KernelLibraryBuilder) {
- inferrerLibrary.checkBoundsInListLiteral(
- node, inferrer.typeSchemaEnvironment,
- inferred: true);
+ if (!inferrer.isTopLevel) {
+ KernelLibraryBuilder library = inferrer.library;
+ if (inferenceNeeded) {
+ library.checkBoundsInListLiteral(node, inferrer.typeSchemaEnvironment,
+ inferred: true);
+ }
}
return null;
@@ -832,28 +837,29 @@
KernelLibraryBuilder library = inferrer.library;
bool typeContextIsMap = false;
bool typeContextIsIterable = false;
- if (library != null &&
- library.loader.target.enableSetLiterals &&
- inferenceNeeded) {
- // Ambiguous set/map literal
- DartType context =
- inferrer.typeSchemaEnvironment.unfutureType(typeContext);
- if (context is InterfaceType) {
- typeContextIsMap = inferrer.classHierarchy
- .isSubtypeOf(context.classNode, inferrer.coreTypes.mapClass);
- typeContextIsIterable = inferrer.classHierarchy
- .isSubtypeOf(context.classNode, inferrer.coreTypes.iterableClass);
- if (node.entries.isEmpty &&
- typeContextIsIterable &&
- !typeContextIsMap) {
- // Set literal
- SetLiteralJudgment setLiteral = new SetLiteralJudgment([],
- typeArgument: const ImplicitTypeArgument(), isConst: node.isConst)
- ..fileOffset = node.fileOffset;
- node.parent.replaceChild(node, setLiteral);
- visitSetLiteralJudgment(setLiteral, typeContext);
- node.inferredType = setLiteral.inferredType;
- return;
+ if (!inferrer.isTopLevel) {
+ if (library.loader.target.enableSetLiterals && inferenceNeeded) {
+ // Ambiguous set/map literal
+ DartType context =
+ inferrer.typeSchemaEnvironment.unfutureType(typeContext);
+ if (context is InterfaceType) {
+ typeContextIsMap = inferrer.classHierarchy
+ .isSubtypeOf(context.classNode, inferrer.coreTypes.mapClass);
+ typeContextIsIterable = inferrer.classHierarchy
+ .isSubtypeOf(context.classNode, inferrer.coreTypes.iterableClass);
+ if (node.entries.isEmpty &&
+ typeContextIsIterable &&
+ !typeContextIsMap) {
+ // Set literal
+ SetLiteralJudgment setLiteral = new SetLiteralJudgment([],
+ typeArgument: const ImplicitTypeArgument(),
+ isConst: node.isConst)
+ ..fileOffset = node.fileOffset;
+ node.parent.replaceChild(node, setLiteral);
+ visitSetLiteralJudgment(setLiteral, typeContext);
+ node.inferredType = setLiteral.inferredType;
+ return;
+ }
}
}
}
@@ -976,24 +982,26 @@
return;
}
if (!canBeSet && !canBeMap) {
- LocatedMessage iterableContextMessage = messageSpreadElement
- .withLocation(library.uri, iterableSpreadOffset, 1);
- LocatedMessage mapContextMessage = messageSpreadMapElement.withLocation(
- library.uri, mapSpreadOffset, 1);
- List<LocatedMessage> context = <LocatedMessage>[];
- if (iterableSpreadOffset < mapSpreadOffset) {
- context.add(iterableContextMessage);
- context.add(mapContextMessage);
- } else {
- context.add(mapContextMessage);
- context.add(iterableContextMessage);
+ if (!inferrer.isTopLevel) {
+ LocatedMessage iterableContextMessage = messageSpreadElement
+ .withLocation(library.uri, iterableSpreadOffset, 1);
+ LocatedMessage mapContextMessage = messageSpreadMapElement
+ .withLocation(library.uri, mapSpreadOffset, 1);
+ List<LocatedMessage> context = <LocatedMessage>[];
+ if (iterableSpreadOffset < mapSpreadOffset) {
+ context.add(iterableContextMessage);
+ context.add(mapContextMessage);
+ } else {
+ context.add(mapContextMessage);
+ context.add(iterableContextMessage);
+ }
+ node.parent.replaceChild(
+ node,
+ inferrer.helper.desugarSyntheticExpression(inferrer.helper
+ .buildProblem(messageCantDisambiguateAmbiguousInformation,
+ node.fileOffset, 1,
+ context: context)));
}
- node.parent.replaceChild(
- node,
- inferrer.helper.desugarSyntheticExpression(inferrer.helper
- .buildProblem(messageCantDisambiguateAmbiguousInformation,
- node.fileOffset, 1,
- context: context)));
node.inferredType = const BottomType();
return;
}
@@ -1098,13 +1106,14 @@
}
node.inferredType =
new InterfaceType(mapClass, [inferredKeyType, inferredValueType]);
- KernelLibraryBuilder inferrerLibrary = inferrer.library;
- // Either both [_declaredKeyType] and [_declaredValueType] are omitted or
- // none of them, so we may just check one.
- if (inferenceNeeded && inferrerLibrary is KernelLibraryBuilder) {
- inferrerLibrary.checkBoundsInMapLiteral(
- node, inferrer.typeSchemaEnvironment,
- inferred: true);
+ if (!inferrer.isTopLevel) {
+ KernelLibraryBuilder library = inferrer.library;
+ // Either both [_declaredKeyType] and [_declaredValueType] are omitted or
+ // none of them, so we may just check one.
+ if (inferenceNeeded) {
+ library.checkBoundsInMapLiteral(node, inferrer.typeSchemaEnvironment,
+ inferred: true);
+ }
}
}
@@ -1441,17 +1450,16 @@
}
}
node.inferredType = new InterfaceType(setClass, [inferredTypeArgument]);
- KernelLibraryBuilder inferrerLibrary = inferrer.library;
- if (inferenceNeeded && inferrerLibrary is KernelLibraryBuilder) {
- inferrerLibrary.checkBoundsInSetLiteral(
- node, inferrer.typeSchemaEnvironment,
- inferred: true);
- }
+ if (!inferrer.isTopLevel) {
+ KernelLibraryBuilder library = inferrer.library;
+ if (inferenceNeeded) {
+ library.checkBoundsInSetLiteral(node, inferrer.typeSchemaEnvironment,
+ inferred: true);
+ }
- KernelLibraryBuilder library = inferrer.library;
- if (library != null &&
- !library.loader.target.backendTarget.supportsSetLiterals) {
- inferrer.helper.transformSetLiterals = true;
+ if (!library.loader.target.backendTarget.supportsSetLiterals) {
+ inferrer.helper.transformSetLiterals = true;
+ }
}
}
@@ -1706,11 +1714,13 @@
node.initializer = replacedInitializer;
}
}
- KernelLibraryBuilder inferrerLibrary = inferrer.library;
- if (node._implicitlyTyped && inferrerLibrary is KernelLibraryBuilder) {
- inferrerLibrary.checkBoundsInVariableDeclaration(
- node, inferrer.typeSchemaEnvironment,
- inferred: true);
+ if (!inferrer.isTopLevel) {
+ KernelLibraryBuilder library = inferrer.library;
+ if (node._implicitlyTyped) {
+ library.checkBoundsInVariableDeclaration(
+ node, inferrer.typeSchemaEnvironment,
+ inferred: true);
+ }
}
}
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 262e8c3..98cbf73 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -544,7 +544,8 @@
TypeInferrerImpl.private(
this.engine, this.uri, bool topLevel, this.thisType, this.library)
- : classHierarchy = engine.classHierarchy,
+ : assert((topLevel && library == null) || (!topLevel && library != null)),
+ classHierarchy = engine.classHierarchy,
instrumentation = topLevel ? null : engine.instrumentation,
typeSchemaEnvironment = engine.typeSchemaEnvironment,
isTopLevel = topLevel,