Version 2.18.0-188.0.dev
Merge commit 'f4bcc6d30aea14e3e7ecd70a59369f55ab361532' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/kernel/benchmarker.dart b/pkg/front_end/lib/src/fasta/kernel/benchmarker.dart
index 8008f36..63a7df3 100644
--- a/pkg/front_end/lib/src/fasta/kernel/benchmarker.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/benchmarker.dart
@@ -236,14 +236,14 @@
inferConstructorParameterTypes,
inferDeclarationType,
- inferExpression,
+ inferImplicitFieldType,
inferFieldInitializer,
inferFunctionBody,
inferInitializer,
inferMetadata,
inferMetadataKeepingHelper,
inferParameterInitializer,
- inferInvocation,
+ inferRedirectingFactoryTypeArguments,
buildOutlineExpressions,
delayedActionPerformer,
diff --git a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
index f5640ea..2a69401 100644
--- a/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/implicit_field_type.dart
@@ -17,7 +17,6 @@
import '../builder/builder.dart';
import '../source/source_field_builder.dart';
import '../type_inference/type_inferrer.dart';
-import '../type_inference/type_schema.dart';
import 'body_builder.dart';
abstract class ImplicitFieldType extends DartType {
@@ -162,10 +161,7 @@
bodyBuilder.parseFieldInitializer(initializerToken!);
initializerToken = null;
- ExpressionInferenceResult result = typeInferrer.inferExpression(
- initializer, const UnknownType(), true,
- isVoidAllowed: true);
- inferredType = typeInferrer.inferDeclarationType(result.inferredType);
+ inferredType = typeInferrer.inferImplicitFieldType(initializer);
} else {
inferredType = const DynamicType();
}
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 d52aaff..1017c52 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -50,6 +50,147 @@
InferenceVisitor(this.inferrer);
+ /// Performs type inference on the given [statement].
+ ///
+ /// Derived classes should override this method with logic that dispatches on
+ /// the statement type and calls the appropriate specialized "infer" method.
+ StatementInferenceResult inferStatement(Statement statement) {
+ inferrer.registerIfUnreachableForTesting(statement);
+
+ // For full (non-top level) inference, we need access to the
+ // ExpressionGeneratorHelper so that we can perform error recovery.
+ if (statement is InternalStatement) {
+ return statement.acceptInference(this);
+ } else {
+ return statement.accept(this);
+ }
+ }
+
+ /// Performs type inference on the given [expression].
+ ///
+ /// [typeContext] is the expected type of the expression, based on surrounding
+ /// code. [typeNeeded] indicates whether it is necessary to compute the
+ /// actual type of the expression. If [typeNeeded] is `true`,
+ /// [ExpressionInferenceResult.inferredType] is the actual type of the
+ /// expression; otherwise `null`.
+ ///
+ /// Derived classes should override this method with logic that dispatches on
+ /// the expression type and calls the appropriate specialized "infer" method.
+ ExpressionInferenceResult _inferExpression(
+ Expression expression, DartType typeContext, bool typeNeeded,
+ {bool isVoidAllowed: false, bool forEffect: false}) {
+ inferrer.registerIfUnreachableForTesting(expression);
+
+ // `null` should never be used as the type context. An instance of
+ // `UnknownType` should be used instead.
+ // ignore: unnecessary_null_comparison
+ assert(typeContext != null);
+
+ // When doing top level inference, we skip subexpressions whose type isn't
+ // needed so that we don't induce bogus dependencies on fields mentioned in
+ // those subexpressions.
+ if (!typeNeeded) {
+ return new ExpressionInferenceResult(const UnknownType(), expression);
+ }
+
+ ExpressionInferenceResult result;
+ if (expression is ExpressionJudgment) {
+ result = expression.acceptInference(this, typeContext);
+ } else if (expression is InternalExpression) {
+ result = expression.acceptInference(this, typeContext);
+ } else {
+ result = expression.accept1(this, typeContext);
+ }
+ DartType inferredType = result.inferredType;
+ // ignore: unnecessary_null_comparison
+ assert(inferredType != null,
+ "No type inferred for $expression (${expression.runtimeType}).");
+ if (inferredType is VoidType && !isVoidAllowed) {
+ if (expression.parent is! ArgumentsImpl && !inferrer.isTopLevel) {
+ inferrer.helper
+ .addProblem(messageVoidExpression, expression.fileOffset, noLength);
+ }
+ }
+ if (inferrer.coreTypes.isBottom(result.inferredType)) {
+ inferrer.flowAnalysis.handleExit();
+ if (inferrer.shouldThrowUnsoundnessException &&
+ // Don't throw on expressions that inherently return the bottom type.
+ !(result.nullAwareAction is Throw ||
+ result.nullAwareAction is Rethrow ||
+ result.nullAwareAction is InvalidExpression)) {
+ Expression replacement = createLet(
+ createVariable(result.expression, result.inferredType),
+ inferrer.createReachabilityError(expression.fileOffset,
+ messageNeverValueError, messageNeverValueWarning));
+ inferrer.flowAnalysis.forwardExpression(replacement, result.expression);
+ result =
+ new ExpressionInferenceResult(result.inferredType, replacement);
+ }
+ }
+ return result;
+ }
+
+ ExpressionInferenceResult inferExpression(
+ Expression expression, DartType typeContext, bool typeNeeded,
+ {bool isVoidAllowed: false, bool forEffect: false}) {
+ ExpressionInferenceResult result = _inferExpression(
+ expression, typeContext, typeNeeded,
+ isVoidAllowed: isVoidAllowed, forEffect: forEffect);
+ return result.stopShorting();
+ }
+
+ ExpressionInferenceResult inferNullAwareExpression(
+ Expression expression, DartType typeContext, bool typeNeeded,
+ {bool isVoidAllowed: false, bool forEffect: false}) {
+ ExpressionInferenceResult result = _inferExpression(
+ expression, typeContext, typeNeeded,
+ isVoidAllowed: isVoidAllowed, forEffect: forEffect);
+ if (inferrer.isNonNullableByDefault) {
+ return result;
+ } else {
+ return result.stopShorting();
+ }
+ }
+
+ void inferSyntheticVariable(VariableDeclarationImpl variable) {
+ assert(variable.isImplicitlyTyped);
+ assert(variable.initializer != null);
+ ExpressionInferenceResult result = inferExpression(
+ variable.initializer!, const UnknownType(), true,
+ isVoidAllowed: true);
+ variable.initializer = result.expression..parent = variable;
+ DartType inferredType = inferrer.inferDeclarationType(result.inferredType,
+ forSyntheticVariable: true);
+ inferrer.instrumentation?.record(
+ inferrer.uriForInstrumentation,
+ variable.fileOffset,
+ 'type',
+ new InstrumentationValueForType(inferredType));
+ variable.type = inferredType;
+ }
+
+ Link<NullAwareGuard> inferSyntheticVariableNullAware(
+ VariableDeclarationImpl variable) {
+ assert(variable.isImplicitlyTyped);
+ assert(variable.initializer != null);
+ ExpressionInferenceResult result = inferNullAwareExpression(
+ variable.initializer!, const UnknownType(), true,
+ isVoidAllowed: true);
+
+ Link<NullAwareGuard> nullAwareGuards = result.nullAwareGuards;
+ variable.initializer = result.nullAwareAction..parent = variable;
+
+ DartType inferredType = inferrer.inferDeclarationType(result.inferredType,
+ forSyntheticVariable: true);
+ inferrer.instrumentation?.record(
+ inferrer.uriForInstrumentation,
+ variable.fileOffset,
+ 'type',
+ new InstrumentationValueForType(inferredType));
+ variable.type = inferredType;
+ return nullAwareGuards;
+ }
+
/// Computes uri and offset for [node] for internal errors in a way that is
/// safe for both top-level and full inference.
_UriOffset _computeUriOffset(TreeNode node) {
@@ -99,12 +240,12 @@
// This is only used for error cases. The spec doesn't use this and
// therefore doesn't specify the type context for the subterms.
if (!inferrer.isTopLevel) {
- StatementInferenceResult bodyResult = inferrer.inferStatement(node.body);
+ StatementInferenceResult bodyResult = inferStatement(node.body);
if (bodyResult.hasChanged) {
node.body = (bodyResult.statement as Block)..parent = node;
}
}
- ExpressionInferenceResult valueResult = inferrer.inferExpression(
+ ExpressionInferenceResult valueResult = inferExpression(
node.value, const UnknownType(), true,
isVoidAllowed: true);
node.value = valueResult.expression..parent = node;
@@ -252,7 +393,7 @@
@override
ExpressionInferenceResult visitTypedefTearOff(
TypedefTearOff node, DartType typeContext) {
- ExpressionInferenceResult expressionResult = inferrer.inferExpression(
+ ExpressionInferenceResult expressionResult = inferExpression(
node.expression, const UnknownType(), true,
isVoidAllowed: true);
node.expression = expressionResult.expression..parent = node;
@@ -348,7 +489,7 @@
ExpressionInferenceResult visitInvalidExpression(
InvalidExpression node, DartType typeContext) {
if (node.expression != null) {
- ExpressionInferenceResult result = inferrer.inferExpression(
+ ExpressionInferenceResult result = inferExpression(
node.expression!, typeContext, !inferrer.isTopLevel,
isVoidAllowed: true);
node.expression = result.expression..parent = node;
@@ -359,7 +500,7 @@
@override
ExpressionInferenceResult visitInstantiation(
Instantiation node, DartType typeContext) {
- ExpressionInferenceResult operandResult = inferrer.inferExpression(
+ ExpressionInferenceResult operandResult = inferExpression(
node.expression, const UnknownType(), true,
isVoidAllowed: true);
Expression operand = operandResult.expression;
@@ -478,7 +619,7 @@
@override
ExpressionInferenceResult visitAsExpression(
AsExpression node, DartType typeContext) {
- ExpressionInferenceResult operandResult = inferrer.inferExpression(
+ ExpressionInferenceResult operandResult = inferExpression(
node.operand, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: true);
node.operand = operandResult.expression..parent = node;
@@ -488,7 +629,7 @@
@override
InitializerInferenceResult visitAssertInitializer(AssertInitializer node) {
- StatementInferenceResult result = inferrer.inferStatement(node.statement);
+ StatementInferenceResult result = inferStatement(node.statement);
if (result.hasChanged) {
node.statement = (result.statement as AssertStatement)..parent = node;
}
@@ -500,7 +641,7 @@
inferrer.flowAnalysis.assert_begin();
InterfaceType expectedType =
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable);
- ExpressionInferenceResult conditionResult = inferrer.inferExpression(
+ ExpressionInferenceResult conditionResult = inferExpression(
node.condition, expectedType, !inferrer.isTopLevel,
isVoidAllowed: true);
@@ -510,7 +651,7 @@
node.condition = condition..parent = node;
inferrer.flowAnalysis.assert_afterCondition(node.condition);
if (node.message != null) {
- ExpressionInferenceResult messageResult = inferrer.inferExpression(
+ ExpressionInferenceResult messageResult = inferExpression(
node.message!, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: true);
node.message = messageResult.expression..parent = node;
@@ -525,7 +666,7 @@
if (!inferrer.typeSchemaEnvironment.isEmptyContext(typeContext)) {
typeContext = inferrer.wrapFutureOrType(typeContext);
}
- ExpressionInferenceResult operandResult = inferrer.inferExpression(
+ ExpressionInferenceResult operandResult = inferExpression(
node.operand, typeContext, true,
isVoidAllowed: !inferrer.isNonNullableByDefault);
DartType inferredType =
@@ -538,8 +679,7 @@
List<Statement>? result;
for (int index = 0; index < statements.length; index++) {
T statement = statements[index];
- StatementInferenceResult statementResult =
- inferrer.inferStatement(statement);
+ StatementInferenceResult statementResult = inferStatement(statement);
if (statementResult.hasChanged) {
if (result == null) {
result = <T>[];
@@ -593,7 +733,7 @@
}
ExpressionInferenceResult visitCascade(Cascade node, DartType typeContext) {
- ExpressionInferenceResult result = inferrer.inferExpression(
+ ExpressionInferenceResult result = inferExpression(
node.variable.initializer!, typeContext, true,
isVoidAllowed: false);
if (node.isNullAware) {
@@ -611,7 +751,7 @@
List<ExpressionInferenceResult> expressionResults =
<ExpressionInferenceResult>[];
for (Expression expression in node.expressions) {
- expressionResults.add(inferrer.inferExpression(
+ expressionResults.add(inferExpression(
expression, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: true, forEffect: true));
}
@@ -660,7 +800,7 @@
inferrer.flowAnalysis.conditional_conditionBegin();
InterfaceType expectedType =
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable);
- ExpressionInferenceResult conditionResult = inferrer.inferExpression(
+ ExpressionInferenceResult conditionResult = inferExpression(
node.condition, expectedType, !inferrer.isTopLevel,
isVoidAllowed: true);
Expression condition = inferrer
@@ -669,16 +809,15 @@
node.condition = condition..parent = node;
inferrer.flowAnalysis.conditional_thenBegin(node.condition, node);
bool isThenReachable = inferrer.flowAnalysis.isReachable;
- ExpressionInferenceResult thenResult = inferrer
- .inferExpression(node.then, typeContext, true, isVoidAllowed: true);
+ ExpressionInferenceResult thenResult =
+ inferExpression(node.then, typeContext, true, isVoidAllowed: true);
node.then = thenResult.expression..parent = node;
inferrer.registerIfUnreachableForTesting(node.then,
isReachable: isThenReachable);
inferrer.flowAnalysis.conditional_elseBegin(node.then);
bool isOtherwiseReachable = inferrer.flowAnalysis.isReachable;
- ExpressionInferenceResult otherwiseResult = inferrer.inferExpression(
- node.otherwise, typeContext, true,
- isVoidAllowed: true);
+ ExpressionInferenceResult otherwiseResult =
+ inferExpression(node.otherwise, typeContext, true, isVoidAllowed: true);
node.otherwise = otherwiseResult.expression..parent = node;
inferrer.registerIfUnreachableForTesting(node.otherwise,
isReachable: isOtherwiseReachable);
@@ -697,9 +836,14 @@
bool hadExplicitTypeArguments = hasExplicitTypeArguments(node.arguments);
FunctionType functionType = node.target.function
.computeThisFunctionType(inferrer.libraryBuilder.nonNullable);
- InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
- node.fileOffset, functionType, node.arguments as ArgumentsImpl,
- isConst: node.isConst, staticTarget: node.target);
+ InvocationInferenceResult result = inferrer.inferInvocation(
+ this,
+ typeContext,
+ node.fileOffset,
+ functionType,
+ node.arguments as ArgumentsImpl,
+ isConst: node.isConst,
+ staticTarget: node.target);
if (!inferrer.isTopLevel) {
SourceLibraryBuilder library = inferrer.libraryBuilder;
if (!hadExplicitTypeArguments) {
@@ -728,8 +872,12 @@
: new FunctionType(
[], const DynamicType(), inferrer.libraryBuilder.nonNullable);
TypeArgumentsInfo typeArgumentsInfo = getTypeArgumentsInfo(node.arguments);
- InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
- node.fileOffset, calleeType, node.arguments as ArgumentsImpl,
+ InvocationInferenceResult result = inferrer.inferInvocation(
+ this,
+ typeContext,
+ node.fileOffset,
+ calleeType,
+ node.arguments as ArgumentsImpl,
staticTarget: node.target);
StaticInvocation replacement =
new StaticInvocation(node.target, node.arguments);
@@ -747,7 +895,7 @@
ExpressionInferenceResult visitExtensionSet(
ExtensionSet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer.inferExpression(
+ ExpressionInferenceResult receiverResult = inferExpression(
node.receiver, const UnknownType(), true,
isVoidAllowed: false);
@@ -768,7 +916,7 @@
DartType valueType =
inferrer.getSetterType(target, receiverResult.inferredType);
- ExpressionInferenceResult valueResult = inferrer.inferExpression(
+ ExpressionInferenceResult valueResult = inferExpression(
node.value, const UnknownType(), true,
isVoidAllowed: false);
valueResult = inferrer.ensureAssignableResult(valueType, valueResult);
@@ -817,7 +965,7 @@
ExpressionInferenceResult visitCompoundExtensionSet(
CompoundExtensionSet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer.inferExpression(
+ ExpressionInferenceResult receiverResult = inferExpression(
node.receiver, const UnknownType(), true,
isVoidAllowed: false);
@@ -933,7 +1081,7 @@
DeferredCheck node, DartType typeContext) {
// Since the variable is not used in the body we don't need to type infer
// it. We can just type infer the body.
- ExpressionInferenceResult result = inferrer.inferExpression(
+ ExpressionInferenceResult result = inferExpression(
node.expression, typeContext, true,
isVoidAllowed: true);
@@ -945,14 +1093,14 @@
@override
StatementInferenceResult visitDoStatement(DoStatement node) {
inferrer.flowAnalysis.doStatement_bodyBegin(node);
- StatementInferenceResult bodyResult = inferrer.inferStatement(node.body);
+ StatementInferenceResult bodyResult = inferStatement(node.body);
if (bodyResult.hasChanged) {
node.body = bodyResult.statement..parent = node;
}
inferrer.flowAnalysis.doStatement_conditionBegin();
InterfaceType boolType =
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable);
- ExpressionInferenceResult conditionResult = inferrer.inferExpression(
+ ExpressionInferenceResult conditionResult = inferExpression(
node.condition, boolType, !inferrer.isTopLevel,
isVoidAllowed: true);
Expression condition =
@@ -978,7 +1126,7 @@
@override
StatementInferenceResult visitExpressionStatement(ExpressionStatement node) {
- ExpressionInferenceResult result = inferrer.inferExpression(
+ ExpressionInferenceResult result = inferExpression(
node.expression, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: true, forEffect: true);
node.expression = result.expression..parent = node;
@@ -992,9 +1140,14 @@
FunctionType functionType = node.target.function
.computeThisFunctionType(inferrer.libraryBuilder.nonNullable);
- InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
- node.fileOffset, functionType, node.arguments as ArgumentsImpl,
- isConst: node.isConst, staticTarget: node.target);
+ InvocationInferenceResult result = inferrer.inferInvocation(
+ this,
+ typeContext,
+ node.fileOffset,
+ functionType,
+ node.arguments as ArgumentsImpl,
+ isConst: node.isConst,
+ staticTarget: node.target);
node.hasBeenInferred = true;
Expression resultNode = node;
if (!inferrer.isTopLevel) {
@@ -1023,9 +1176,14 @@
.computeAliasedConstructorFunctionType(
typedef, inferrer.libraryBuilder.library);
calleeType = replaceReturnType(calleeType, calleeType.returnType.unalias);
- InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
- node.fileOffset, calleeType, node.arguments as ArgumentsImpl,
- isConst: node.isConst, staticTarget: node.target);
+ InvocationInferenceResult result = inferrer.inferInvocation(
+ this,
+ typeContext,
+ node.fileOffset,
+ calleeType,
+ node.arguments as ArgumentsImpl,
+ isConst: node.isConst,
+ staticTarget: node.target);
node.hasBeenInferred = true;
Expression resultNode = node;
if (!inferrer.isTopLevel) {
@@ -1048,9 +1206,14 @@
.computeAliasedFactoryFunctionType(
typedef, inferrer.libraryBuilder.library);
calleeType = replaceReturnType(calleeType, calleeType.returnType.unalias);
- InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
- node.fileOffset, calleeType, node.arguments as ArgumentsImpl,
- isConst: node.isConst, staticTarget: node.target);
+ InvocationInferenceResult result = inferrer.inferInvocation(
+ this,
+ typeContext,
+ node.fileOffset,
+ calleeType,
+ node.arguments as ArgumentsImpl,
+ isConst: node.isConst,
+ staticTarget: node.target);
node.hasBeenInferred = true;
Expression resultNode = node;
if (!inferrer.isTopLevel) {
@@ -1068,7 +1231,7 @@
@override
InitializerInferenceResult visitFieldInitializer(FieldInitializer node) {
ExpressionInferenceResult initializerResult =
- inferrer.inferExpression(node.value, node.field.type, true);
+ inferExpression(node.value, node.field.type, true);
Expression initializer = inferrer
.ensureAssignableResult(node.field.type, initializerResult,
fileOffset: node.fileOffset)
@@ -1132,8 +1295,7 @@
variable = tempVariable;
}
if (expressionEffects != null) {
- StatementInferenceResult bodyResult =
- inferrer.inferStatement(expressionEffects);
+ StatementInferenceResult bodyResult = inferStatement(expressionEffects);
if (bodyResult.hasChanged) {
expressionEffects = bodyResult.statement;
}
@@ -1156,8 +1318,8 @@
: inferrer.coreTypes.iterableClass;
DartType context = inferrer.wrapType(
elementType, iterableClass, inferrer.libraryBuilder.nonNullable);
- ExpressionInferenceResult iterableResult = inferrer
- .inferExpression(iterable, context, typeNeeded, isVoidAllowed: false);
+ ExpressionInferenceResult iterableResult =
+ inferExpression(iterable, context, typeNeeded, isVoidAllowed: false);
DartType iterableType = iterableResult.inferredType;
iterable = iterableResult.expression;
DartType inferredExpressionType =
@@ -1227,7 +1389,7 @@
bool typeChecksNeeded = !inferrer.isTopLevel;
ForInVariable forInVariable =
computeForInVariable(syntheticAssignment, hasProblem);
- DartType elementType = forInVariable.computeElementType(inferrer);
+ DartType elementType = forInVariable.computeElementType(this);
ExpressionInferenceResult iterableResult = inferForInIterable(
iterable, elementType, typeChecksNeeded,
isAsync: isAsync);
@@ -1238,13 +1400,12 @@
// This is matched by the call to [forEach_end] in
// [inferElement], [inferMapEntry] or [inferForInStatement].
inferrer.flowAnalysis.forEach_bodyBegin(node);
- syntheticAssignment = forInVariable.inferAssignment(inferrer, inferredType);
+ syntheticAssignment = forInVariable.inferAssignment(this, inferredType);
if (syntheticAssignment is VariableSet) {
inferrer.flowAnalysis.write(node, variable, inferredType, null);
}
if (expressionEffects != null) {
- StatementInferenceResult result =
- inferrer.inferStatement(expressionEffects);
+ StatementInferenceResult result = inferStatement(expressionEffects);
expressionEffects =
result.hasChanged ? result.statement : expressionEffects;
}
@@ -1259,7 +1420,7 @@
node, node.variable, node.iterable, null,
isAsync: node.isAsync);
- StatementInferenceResult bodyResult = inferrer.inferStatement(node.body);
+ StatementInferenceResult bodyResult = inferStatement(node.body);
// This is matched by the call to [forEach_bodyBegin] in
// [handleForInWithoutVariable] or [handleForInDeclaringVariable].
@@ -1286,7 +1447,7 @@
node.iterable, node.syntheticAssignment, node.expressionEffects,
isAsync: node.isAsync, hasProblem: node.hasProblem);
- StatementInferenceResult bodyResult = inferrer.inferStatement(node.body);
+ StatementInferenceResult bodyResult = inferStatement(node.body);
// This is matched by the call to [forEach_bodyBegin] in
// [handleForInWithoutVariable] or [handleForInDeclaringVariable].
@@ -1317,15 +1478,14 @@
VariableDeclaration variable = node.variables[index];
if (variable.name == null) {
if (variable.initializer != null) {
- ExpressionInferenceResult result = inferrer.inferExpression(
+ ExpressionInferenceResult result = inferExpression(
variable.initializer!, const UnknownType(), true,
isVoidAllowed: true);
variable.initializer = result.expression..parent = variable;
variable.type = result.inferredType;
}
} else {
- StatementInferenceResult variableResult =
- inferrer.inferStatement(variable);
+ StatementInferenceResult variableResult = inferStatement(variable);
if (variableResult.hasChanged) {
if (variables == null) {
variables = <VariableDeclaration>[];
@@ -1352,7 +1512,7 @@
if (node.condition != null) {
InterfaceType expectedType =
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable);
- ExpressionInferenceResult conditionResult = inferrer.inferExpression(
+ ExpressionInferenceResult conditionResult = inferExpression(
node.condition!, expectedType, !inferrer.isTopLevel,
isVoidAllowed: true);
Expression condition = inferrer
@@ -1362,13 +1522,13 @@
}
inferrer.flowAnalysis.for_bodyBegin(node, node.condition);
- StatementInferenceResult bodyResult = inferrer.inferStatement(node.body);
+ StatementInferenceResult bodyResult = inferStatement(node.body);
if (bodyResult.hasChanged) {
node.body = bodyResult.statement..parent = node;
}
inferrer.flowAnalysis.for_updaterBegin();
for (int index = 0; index < node.updates.length; index++) {
- ExpressionInferenceResult updateResult = inferrer.inferExpression(
+ ExpressionInferenceResult updateResult = inferExpression(
node.updates[index], const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: true);
node.updates[index] = updateResult.expression..parent = node;
@@ -1379,8 +1539,8 @@
FunctionType visitFunctionNode(FunctionNode node, DartType? typeContext,
DartType? returnContext, int returnTypeInstrumentationOffset) {
- return inferrer.inferLocalFunction(
- node, typeContext, returnTypeInstrumentationOffset, returnContext);
+ return inferrer.inferLocalFunction(this, node, typeContext,
+ returnTypeInstrumentationOffset, returnContext);
}
@override
@@ -1389,7 +1549,7 @@
inferrer.flowAnalysis.declare(node.variable, true);
inferrer.flowAnalysis.functionExpression_begin(node);
inferrer.inferMetadataKeepingHelper(
- node.variable, node.variable.annotations);
+ this, node.variable, node.variable.annotations);
DartType? returnContext =
node.hasImplicitReturnType ? null : node.function.returnType;
FunctionType inferredType =
@@ -1428,7 +1588,7 @@
.withoutTypeParameters) as FunctionType,
inferrer.thisType!);
InvocationInferenceResult invocationInferenceResult =
- inferrer.inferInvocation(const UnknownType(), node.fileOffset,
+ inferrer.inferInvocation(this, const UnknownType(), node.fileOffset,
functionType, node.argumentsJudgment,
skipTypeArgumentInference: true);
return new InitializerInferenceResult.fromInvocationInferenceResult(
@@ -1439,7 +1599,7 @@
IfNullExpression node, DartType typeContext) {
// To infer `e0 ?? e1` in context K:
// - Infer e0 in context K to get T0
- ExpressionInferenceResult lhsResult = inferrer.inferExpression(
+ ExpressionInferenceResult lhsResult = inferExpression(
node.left, inferrer.computeNullable(typeContext), true,
isVoidAllowed: false);
reportNonNullableInNullAwareWarningIfNeeded(
@@ -1455,12 +1615,11 @@
// - Infer e1 in context J to get T1
ExpressionInferenceResult rhsResult;
if (typeContext is UnknownType) {
- rhsResult = inferrer.inferExpression(
- node.right, lhsResult.inferredType, true,
+ rhsResult = inferExpression(node.right, lhsResult.inferredType, true,
isVoidAllowed: true);
} else {
- rhsResult = inferrer.inferExpression(node.right, typeContext, true,
- isVoidAllowed: true);
+ rhsResult =
+ inferExpression(node.right, typeContext, true, isVoidAllowed: true);
}
inferrer.flowAnalysis.ifNullExpression_end();
@@ -1499,7 +1658,7 @@
inferrer.flowAnalysis.ifStatement_conditionBegin();
InterfaceType expectedType =
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable);
- ExpressionInferenceResult conditionResult = inferrer.inferExpression(
+ ExpressionInferenceResult conditionResult = inferExpression(
node.condition, expectedType, !inferrer.isTopLevel,
isVoidAllowed: true);
Expression condition = inferrer
@@ -1507,14 +1666,14 @@
.expression;
node.condition = condition..parent = node;
inferrer.flowAnalysis.ifStatement_thenBegin(condition, node);
- StatementInferenceResult thenResult = inferrer.inferStatement(node.then);
+ StatementInferenceResult thenResult = inferStatement(node.then);
if (thenResult.hasChanged) {
node.then = thenResult.statement..parent = node;
}
if (node.otherwise != null) {
inferrer.flowAnalysis.ifStatement_elseBegin();
StatementInferenceResult otherwiseResult =
- inferrer.inferStatement(node.otherwise!);
+ inferStatement(node.otherwise!);
if (otherwiseResult.hasChanged) {
node.otherwise = otherwiseResult.statement..parent = node;
}
@@ -1579,7 +1738,7 @@
InitializerInferenceResult visitShadowInvalidInitializer(
ShadowInvalidInitializer node) {
- ExpressionInferenceResult initializerResult = inferrer.inferExpression(
+ ExpressionInferenceResult initializerResult = inferExpression(
node.variable.initializer!, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: false);
node.variable.initializer = initializerResult.expression
@@ -1589,7 +1748,7 @@
InitializerInferenceResult visitShadowInvalidFieldInitializer(
ShadowInvalidFieldInitializer node) {
- ExpressionInferenceResult initializerResult = inferrer.inferExpression(
+ ExpressionInferenceResult initializerResult = inferExpression(
node.value, node.field.type, !inferrer.isTopLevel,
isVoidAllowed: false);
node.value = initializerResult.expression..parent = node;
@@ -1599,7 +1758,7 @@
@override
ExpressionInferenceResult visitIsExpression(
IsExpression node, DartType typeContext) {
- ExpressionInferenceResult operandResult = inferrer.inferExpression(
+ ExpressionInferenceResult operandResult = inferExpression(
node.operand, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: false);
node.operand = operandResult.expression..parent = node;
@@ -1619,7 +1778,7 @@
inferrer.flowAnalysis.labeledStatement_begin(node);
}
- StatementInferenceResult bodyResult = inferrer.inferStatement(node.body);
+ StatementInferenceResult bodyResult = inferStatement(node.body);
if (isSimpleBody) {
inferrer.flowAnalysis.labeledStatement_end();
@@ -1664,7 +1823,7 @@
bool inferenceNeeded,
bool typeChecksNeeded) {
if (element is SpreadElement) {
- ExpressionInferenceResult spreadResult = inferrer.inferExpression(
+ ExpressionInferenceResult spreadResult = inferExpression(
element.expression,
new InterfaceType(
inferrer.coreTypes.iterableClass,
@@ -1785,7 +1944,7 @@
inferrer.flowAnalysis.ifStatement_conditionBegin();
DartType boolType =
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable);
- ExpressionInferenceResult conditionResult = inferrer.inferExpression(
+ ExpressionInferenceResult conditionResult = inferExpression(
element.condition, boolType, typeChecksNeeded,
isVoidAllowed: false);
Expression condition =
@@ -1828,17 +1987,17 @@
VariableDeclaration variable = element.variables[index];
if (variable.name == null) {
if (variable.initializer != null) {
- ExpressionInferenceResult initializerResult =
- inferrer.inferExpression(variable.initializer!, variable.type,
- inferenceNeeded || typeChecksNeeded,
- isVoidAllowed: true);
+ ExpressionInferenceResult initializerResult = inferExpression(
+ variable.initializer!,
+ variable.type,
+ inferenceNeeded || typeChecksNeeded,
+ isVoidAllowed: true);
variable.initializer = initializerResult.expression
..parent = variable;
variable.type = initializerResult.inferredType;
}
} else {
- StatementInferenceResult variableResult =
- inferrer.inferStatement(variable);
+ StatementInferenceResult variableResult = inferStatement(variable);
if (variableResult.hasChanged) {
if (variables == null) {
variables = <VariableDeclaration>[];
@@ -1863,7 +2022,7 @@
}
inferrer.flowAnalysis.for_conditionBegin(element);
if (element.condition != null) {
- ExpressionInferenceResult conditionResult = inferrer.inferExpression(
+ ExpressionInferenceResult conditionResult = inferExpression(
element.condition!,
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable),
inferenceNeeded || typeChecksNeeded,
@@ -1883,7 +2042,7 @@
element.body = bodyResult.expression..parent = element;
inferrer.flowAnalysis.for_updaterBegin();
for (int index = 0; index < element.updates.length; index++) {
- ExpressionInferenceResult updateResult = inferrer.inferExpression(
+ ExpressionInferenceResult updateResult = inferExpression(
element.updates[index],
const UnknownType(),
inferenceNeeded || typeChecksNeeded,
@@ -1918,7 +2077,7 @@
result.expressionSideEffects?.parent = element;
if (element.problem != null) {
- ExpressionInferenceResult problemResult = inferrer.inferExpression(
+ ExpressionInferenceResult problemResult = inferExpression(
element.problem!,
const UnknownType(),
inferenceNeeded || typeChecksNeeded,
@@ -1938,7 +2097,7 @@
inferrer.flowAnalysis.forEach_end();
return new ExpressionInferenceResult(bodyResult.inferredType, element);
} else {
- ExpressionInferenceResult result = inferrer.inferExpression(
+ ExpressionInferenceResult result = inferExpression(
element, inferredTypeArgument, inferenceNeeded || typeChecksNeeded,
isVoidAllowed: true);
if (inferredTypeArgument is! UnknownType) {
@@ -2098,7 +2257,7 @@
InterfaceType boolType =
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable);
inferrer.flowAnalysis.logicalBinaryOp_begin();
- ExpressionInferenceResult leftResult = inferrer.inferExpression(
+ ExpressionInferenceResult leftResult = inferExpression(
node.left, boolType, !inferrer.isTopLevel,
isVoidAllowed: false);
Expression left =
@@ -2106,7 +2265,7 @@
node.left = left..parent = node;
inferrer.flowAnalysis.logicalBinaryOp_rightBegin(node.left, node,
isAnd: node.operatorEnum == LogicalExpressionOperator.AND);
- ExpressionInferenceResult rightResult = inferrer.inferExpression(
+ ExpressionInferenceResult rightResult = inferExpression(
node.right, boolType, !inferrer.isTopLevel,
isVoidAllowed: false);
Expression right =
@@ -2165,7 +2324,7 @@
bool typeChecksNeeded,
_MapLiteralEntryOffsets offsets) {
if (entry is SpreadMapEntry) {
- ExpressionInferenceResult spreadResult = inferrer.inferExpression(
+ ExpressionInferenceResult spreadResult = inferExpression(
entry.expression, spreadContext, inferenceNeeded || typeChecksNeeded,
isVoidAllowed: true);
if (entry.isNullAware) {
@@ -2389,7 +2548,7 @@
inferrer.flowAnalysis.ifStatement_conditionBegin();
DartType boolType =
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable);
- ExpressionInferenceResult conditionResult = inferrer.inferExpression(
+ ExpressionInferenceResult conditionResult = inferExpression(
entry.condition, boolType, typeChecksNeeded,
isVoidAllowed: false);
Expression condition =
@@ -2457,7 +2616,7 @@
VariableDeclaration variable = entry.variables[index];
if (variable.name == null) {
if (variable.initializer != null) {
- ExpressionInferenceResult result = inferrer.inferExpression(
+ ExpressionInferenceResult result = inferExpression(
variable.initializer!,
variable.type,
inferenceNeeded || typeChecksNeeded,
@@ -2466,8 +2625,7 @@
variable.type = result.inferredType;
}
} else {
- StatementInferenceResult variableResult =
- inferrer.inferStatement(variable);
+ StatementInferenceResult variableResult = inferStatement(variable);
if (variableResult.hasChanged) {
if (variables == null) {
variables = <VariableDeclaration>[];
@@ -2492,7 +2650,7 @@
}
inferrer.flowAnalysis.for_conditionBegin(entry);
if (entry.condition != null) {
- ExpressionInferenceResult conditionResult = inferrer.inferExpression(
+ ExpressionInferenceResult conditionResult = inferExpression(
entry.condition!,
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable),
inferenceNeeded || typeChecksNeeded,
@@ -2519,7 +2677,7 @@
entry.body = body..parent = entry;
inferrer.flowAnalysis.for_updaterBegin();
for (int index = 0; index < entry.updates.length; index++) {
- ExpressionInferenceResult updateResult = inferrer.inferExpression(
+ ExpressionInferenceResult updateResult = inferExpression(
entry.updates[index],
const UnknownType(),
inferenceNeeded || typeChecksNeeded,
@@ -2548,7 +2706,7 @@
entry.expressionEffects = result.expressionSideEffects;
result.expressionSideEffects?.parent = entry;
if (entry.problem != null) {
- ExpressionInferenceResult problemResult = inferrer.inferExpression(
+ ExpressionInferenceResult problemResult = inferExpression(
entry.problem!,
const UnknownType(),
inferenceNeeded || typeChecksNeeded,
@@ -2575,7 +2733,7 @@
inferrer.flowAnalysis.forEach_end();
return entry;
} else {
- ExpressionInferenceResult keyResult = inferrer.inferExpression(
+ ExpressionInferenceResult keyResult = inferExpression(
entry.key, inferredKeyType, true,
isVoidAllowed: true);
Expression key = inferrer
@@ -2583,7 +2741,7 @@
isVoidAllowed: inferredKeyType is VoidType)
.expression;
entry.key = key..parent = entry;
- ExpressionInferenceResult valueResult = inferrer.inferExpression(
+ ExpressionInferenceResult valueResult = inferExpression(
entry.value, inferredValueType, true,
isVoidAllowed: true);
Expression value = inferrer
@@ -2903,12 +3061,13 @@
ExpressionInferenceResult visitMethodInvocation(
MethodInvocation node, DartType typeContext) {
assert(node.name != unaryMinusName);
- ExpressionInferenceResult result = inferrer.inferNullAwareExpression(
- node.receiver, const UnknownType(), true);
+ ExpressionInferenceResult result =
+ inferNullAwareExpression(node.receiver, const UnknownType(), true);
Link<NullAwareGuard> nullAwareGuards = result.nullAwareGuards;
Expression receiver = result.nullAwareAction;
DartType receiverType = result.nullAwareActionType;
return inferrer.inferMethodInvocation(
+ this,
node.fileOffset,
nullAwareGuards,
receiver,
@@ -2922,12 +3081,13 @@
ExpressionInferenceResult visitExpressionInvocation(
ExpressionInvocation node, DartType typeContext) {
- ExpressionInferenceResult result = inferrer.inferNullAwareExpression(
- node.expression, const UnknownType(), true);
+ ExpressionInferenceResult result =
+ inferNullAwareExpression(node.expression, const UnknownType(), true);
Link<NullAwareGuard> nullAwareGuards = result.nullAwareGuards;
Expression receiver = result.nullAwareAction;
DartType receiverType = result.nullAwareActionType;
return inferrer.inferMethodInvocation(
+ this,
node.fileOffset,
nullAwareGuards,
receiver,
@@ -2944,7 +3104,7 @@
InterfaceType boolType =
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable);
ExpressionInferenceResult operandResult =
- inferrer.inferExpression(node.operand, boolType, !inferrer.isTopLevel);
+ inferExpression(node.operand, boolType, !inferrer.isTopLevel);
Expression operand = inferrer
.ensureAssignableResult(boolType, operandResult,
fileOffset: node.fileOffset)
@@ -2957,7 +3117,7 @@
@override
ExpressionInferenceResult visitNullCheck(
NullCheck node, DartType typeContext) {
- ExpressionInferenceResult operandResult = inferrer.inferNullAwareExpression(
+ ExpressionInferenceResult operandResult = inferNullAwareExpression(
node.operand, inferrer.computeNullable(typeContext), true);
Link<NullAwareGuard> nullAwareGuards = operandResult.nullAwareGuards;
@@ -2976,12 +3136,12 @@
ExpressionInferenceResult visitNullAwareMethodInvocation(
NullAwareMethodInvocation node, DartType typeContext) {
Link<NullAwareGuard> nullAwareGuards =
- inferrer.inferSyntheticVariableNullAware(node.variable);
+ inferSyntheticVariableNullAware(node.variable);
reportNonNullableInNullAwareWarningIfNeeded(
node.variable.type, "?.", node.variable.fileOffset);
NullAwareGuard nullAwareGuard =
inferrer.createNullAwareGuard(node.variable);
- ExpressionInferenceResult invocationResult = inferrer.inferExpression(
+ ExpressionInferenceResult invocationResult = inferExpression(
node.invocation, typeContext, true,
isVoidAllowed: true);
return inferrer.createNullAwareExpressionInferenceResult(
@@ -2993,13 +3153,13 @@
ExpressionInferenceResult visitNullAwarePropertyGet(
NullAwarePropertyGet node, DartType typeContext) {
Link<NullAwareGuard> nullAwareGuards =
- inferrer.inferSyntheticVariableNullAware(node.variable);
+ inferSyntheticVariableNullAware(node.variable);
reportNonNullableInNullAwareWarningIfNeeded(
node.variable.type, "?.", node.variable.fileOffset);
NullAwareGuard nullAwareGuard =
inferrer.createNullAwareGuard(node.variable);
ExpressionInferenceResult readResult =
- inferrer.inferExpression(node.read, typeContext, true);
+ inferExpression(node.read, typeContext, true);
return inferrer.createNullAwareExpressionInferenceResult(
readResult.inferredType,
readResult.expression,
@@ -3009,13 +3169,13 @@
ExpressionInferenceResult visitNullAwarePropertySet(
NullAwarePropertySet node, DartType typeContext) {
Link<NullAwareGuard> nullAwareGuards =
- inferrer.inferSyntheticVariableNullAware(node.variable);
+ inferSyntheticVariableNullAware(node.variable);
reportNonNullableInNullAwareWarningIfNeeded(
node.variable.type, "?.", node.variable.fileOffset);
NullAwareGuard nullAwareGuard =
inferrer.createNullAwareGuard(node.variable);
ExpressionInferenceResult writeResult =
- inferrer.inferExpression(node.write, typeContext, true);
+ inferExpression(node.write, typeContext, true);
return inferrer.createNullAwareExpressionInferenceResult(
writeResult.inferredType,
writeResult.expression,
@@ -3024,13 +3184,13 @@
ExpressionInferenceResult visitNullAwareExtension(
NullAwareExtension node, DartType typeContext) {
- inferrer.inferSyntheticVariable(node.variable);
+ inferSyntheticVariable(node.variable);
reportNonNullableInNullAwareWarningIfNeeded(
node.variable.type, "?.", node.variable.fileOffset);
NullAwareGuard nullAwareGuard =
inferrer.createNullAwareGuard(node.variable);
ExpressionInferenceResult expressionResult =
- inferrer.inferExpression(node.expression, const UnknownType(), true);
+ inferExpression(node.expression, const UnknownType(), true);
return inferrer.createNullAwareExpressionInferenceResult(
expressionResult.inferredType,
expressionResult.expression,
@@ -3039,8 +3199,8 @@
ExpressionInferenceResult visitStaticPostIncDec(
StaticPostIncDec node, DartType typeContext) {
- inferrer.inferSyntheticVariable(node.read);
- inferrer.inferSyntheticVariable(node.write);
+ inferSyntheticVariable(node.read);
+ inferSyntheticVariable(node.write);
DartType inferredType = node.read.type;
Expression replacement =
@@ -3051,8 +3211,8 @@
ExpressionInferenceResult visitSuperPostIncDec(
SuperPostIncDec node, DartType typeContext) {
- inferrer.inferSyntheticVariable(node.read);
- inferrer.inferSyntheticVariable(node.write);
+ inferSyntheticVariable(node.read);
+ inferSyntheticVariable(node.write);
DartType inferredType = node.read.type;
Expression replacement =
@@ -3063,8 +3223,8 @@
ExpressionInferenceResult visitLocalPostIncDec(
LocalPostIncDec node, DartType typeContext) {
- inferrer.inferSyntheticVariable(node.read);
- inferrer.inferSyntheticVariable(node.write);
+ inferSyntheticVariable(node.read);
+ inferSyntheticVariable(node.write);
DartType inferredType = node.read.type;
Expression replacement =
new Let(node.read, createLet(node.write, createVariableGet(node.read)))
@@ -3075,10 +3235,10 @@
ExpressionInferenceResult visitPropertyPostIncDec(
PropertyPostIncDec node, DartType typeContext) {
if (node.variable != null) {
- inferrer.inferSyntheticVariable(node.variable!);
+ inferSyntheticVariable(node.variable!);
}
- inferrer.inferSyntheticVariable(node.read);
- inferrer.inferSyntheticVariable(node.write);
+ inferSyntheticVariable(node.read);
+ inferSyntheticVariable(node.write);
DartType inferredType = node.read.type;
Expression replacement;
@@ -3098,9 +3258,9 @@
ExpressionInferenceResult visitCompoundPropertySet(
CompoundPropertySet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer
- .inferNullAwareExpression(node.receiver, const UnknownType(), true,
- isVoidAllowed: false);
+ ExpressionInferenceResult receiverResult = inferNullAwareExpression(
+ node.receiver, const UnknownType(), true,
+ isVoidAllowed: false);
Link<NullAwareGuard> nullAwareGuards = receiverResult.nullAwareGuards;
Expression receiver = receiverResult.nullAwareAction;
@@ -3166,9 +3326,9 @@
ExpressionInferenceResult visitIfNullPropertySet(
IfNullPropertySet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer
- .inferNullAwareExpression(node.receiver, const UnknownType(), true,
- isVoidAllowed: false);
+ ExpressionInferenceResult receiverResult = inferNullAwareExpression(
+ node.receiver, const UnknownType(), true,
+ isVoidAllowed: false);
Link<NullAwareGuard> nullAwareGuards = receiverResult.nullAwareGuards;
Expression receiver = receiverResult.nullAwareAction;
@@ -3202,8 +3362,8 @@
DartType writeContext = inferrer.getSetterType(writeTarget, receiverType);
inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
- ExpressionInferenceResult rhsResult = inferrer
- .inferExpression(node.rhs, writeContext, true, isVoidAllowed: true);
+ ExpressionInferenceResult rhsResult =
+ inferExpression(node.rhs, writeContext, true, isVoidAllowed: true);
inferrer.flowAnalysis.ifNullExpression_end();
rhsResult = inferrer.ensureAssignableResult(writeContext, rhsResult);
@@ -3260,7 +3420,7 @@
ExpressionInferenceResult visitIfNullSet(
IfNullSet node, DartType typeContext) {
ExpressionInferenceResult readResult =
- inferrer.inferNullAwareExpression(node.read, const UnknownType(), true);
+ inferNullAwareExpression(node.read, const UnknownType(), true);
reportNonNullableInNullAwareWarningIfNeeded(
readResult.inferredType, "??=", node.read.fileOffset);
@@ -3269,8 +3429,8 @@
DartType readType = readResult.nullAwareActionType;
inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
- ExpressionInferenceResult writeResult = inferrer
- .inferExpression(node.write, typeContext, true, isVoidAllowed: true);
+ ExpressionInferenceResult writeResult =
+ inferExpression(node.write, typeContext, true, isVoidAllowed: true);
inferrer.flowAnalysis.ifNullExpression_end();
DartType originalReadType = readType;
@@ -3316,9 +3476,9 @@
}
ExpressionInferenceResult visitIndexGet(IndexGet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer
- .inferNullAwareExpression(node.receiver, const UnknownType(), true,
- isVoidAllowed: true);
+ ExpressionInferenceResult receiverResult = inferNullAwareExpression(
+ node.receiver, const UnknownType(), true,
+ isVoidAllowed: true);
Link<NullAwareGuard> nullAwareGuards = receiverResult.nullAwareGuards;
Expression receiver = receiverResult.nullAwareAction;
@@ -3335,8 +3495,8 @@
inferrer.preCheckInvocationContravariance(receiverType, indexGetTarget,
isThisReceiver: node.receiver is ThisExpression);
- ExpressionInferenceResult indexResult = inferrer
- .inferExpression(node.index, indexType, true, isVoidAllowed: true);
+ ExpressionInferenceResult indexResult =
+ inferExpression(node.index, indexType, true, isVoidAllowed: true);
Expression index =
inferrer.ensureAssignableResult(indexType, indexResult).expression;
@@ -3354,9 +3514,9 @@
}
ExpressionInferenceResult visitIndexSet(IndexSet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer
- .inferNullAwareExpression(node.receiver, const UnknownType(), true,
- isVoidAllowed: true);
+ ExpressionInferenceResult receiverResult = inferNullAwareExpression(
+ node.receiver, const UnknownType(), true,
+ isVoidAllowed: true);
Link<NullAwareGuard> nullAwareGuards = receiverResult.nullAwareGuards;
Expression receiver = receiverResult.nullAwareAction;
@@ -3377,8 +3537,8 @@
DartType valueType =
inferrer.getIndexSetValueType(indexSetTarget, receiverType);
- ExpressionInferenceResult indexResult = inferrer
- .inferExpression(node.index, indexType, true, isVoidAllowed: true);
+ ExpressionInferenceResult indexResult =
+ inferExpression(node.index, indexType, true, isVoidAllowed: true);
Expression index =
inferrer.ensureAssignableResult(indexType, indexResult).expression;
@@ -3389,8 +3549,8 @@
index = createVariableGet(indexVariable);
}
- ExpressionInferenceResult valueResult = inferrer
- .inferExpression(node.value, valueType, true, isVoidAllowed: true);
+ ExpressionInferenceResult valueResult =
+ inferExpression(node.value, valueType, true, isVoidAllowed: true);
valueResult = inferrer.ensureAssignableResult(valueType, valueResult);
Expression value = valueResult.expression;
@@ -3446,8 +3606,8 @@
DartType valueType =
inferrer.getIndexSetValueType(indexSetTarget, inferrer.thisType!);
- ExpressionInferenceResult indexResult = inferrer
- .inferExpression(node.index, indexType, true, isVoidAllowed: true);
+ ExpressionInferenceResult indexResult =
+ inferExpression(node.index, indexType, true, isVoidAllowed: true);
Expression index =
inferrer.ensureAssignableResult(indexType, indexResult).expression;
@@ -3458,8 +3618,8 @@
index = createVariableGet(indexVariable);
}
- ExpressionInferenceResult valueResult = inferrer
- .inferExpression(node.value, valueType, true, isVoidAllowed: true);
+ ExpressionInferenceResult valueResult =
+ inferExpression(node.value, valueType, true, isVoidAllowed: true);
valueResult = inferrer.ensureAssignableResult(valueType, valueResult);
Expression value = valueResult.expression;
@@ -3509,7 +3669,7 @@
ExpressionInferenceResult visitExtensionIndexSet(
ExtensionIndexSet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer.inferExpression(
+ ExpressionInferenceResult receiverResult = inferExpression(
node.receiver, const UnknownType(), true,
isVoidAllowed: false);
@@ -3536,14 +3696,14 @@
DartType indexType = inferrer.getIndexKeyType(target, receiverType);
DartType valueType = inferrer.getIndexSetValueType(target, receiverType);
- ExpressionInferenceResult indexResult = inferrer
- .inferExpression(node.index, indexType, true, isVoidAllowed: true);
+ ExpressionInferenceResult indexResult =
+ inferExpression(node.index, indexType, true, isVoidAllowed: true);
Expression index =
inferrer.ensureAssignableResult(indexType, indexResult).expression;
- ExpressionInferenceResult valueResult = inferrer
- .inferExpression(node.value, valueType, true, isVoidAllowed: true);
+ ExpressionInferenceResult valueResult =
+ inferExpression(node.value, valueType, true, isVoidAllowed: true);
valueResult = inferrer.ensureAssignableResult(valueType, valueResult);
Expression value = valueResult.expression;
@@ -3580,9 +3740,9 @@
ExpressionInferenceResult visitIfNullIndexSet(
IfNullIndexSet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer
- .inferNullAwareExpression(node.receiver, const UnknownType(), true,
- isVoidAllowed: true);
+ ExpressionInferenceResult receiverResult = inferNullAwareExpression(
+ node.receiver, const UnknownType(), true,
+ isVoidAllowed: true);
Link<NullAwareGuard> nullAwareGuards = receiverResult.nullAwareGuards;
Expression receiver = receiverResult.nullAwareAction;
@@ -3620,8 +3780,8 @@
DartType valueType =
inferrer.getIndexSetValueType(writeTarget, receiverType);
- ExpressionInferenceResult indexResult = inferrer
- .inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
+ ExpressionInferenceResult indexResult =
+ inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
VariableDeclaration? indexVariable;
Expression readIndex = indexResult.expression;
@@ -3658,8 +3818,8 @@
writeIndexType, indexResult.inferredType, writeIndex,
whyNotPromoted: whyNotPromotedIndex);
- ExpressionInferenceResult valueResult = inferrer
- .inferExpression(node.value, valueType, true, isVoidAllowed: true);
+ ExpressionInferenceResult valueResult =
+ inferExpression(node.value, valueType, true, isVoidAllowed: true);
valueResult = inferrer.ensureAssignableResult(valueType, valueResult);
Expression value = valueResult.expression;
inferrer.flowAnalysis.ifNullExpression_end();
@@ -3793,8 +3953,8 @@
DartType valueType =
inferrer.getIndexSetValueType(writeTarget, inferrer.thisType!);
- ExpressionInferenceResult indexResult = inferrer
- .inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
+ ExpressionInferenceResult indexResult =
+ inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
VariableDeclaration? indexVariable;
Expression readIndex = indexResult.expression;
@@ -3835,8 +3995,8 @@
}
inferrer.flowAnalysis.ifNullExpression_rightBegin(read, readType);
- ExpressionInferenceResult valueResult = inferrer
- .inferExpression(node.value, valueType, true, isVoidAllowed: true);
+ ExpressionInferenceResult valueResult =
+ inferExpression(node.value, valueType, true, isVoidAllowed: true);
valueResult = inferrer.ensureAssignableResult(valueType, valueResult);
Expression value = valueResult.expression;
inferrer.flowAnalysis.ifNullExpression_end();
@@ -3929,7 +4089,7 @@
ExpressionInferenceResult visitIfNullExtensionIndexSet(
IfNullExtensionIndexSet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer.inferExpression(
+ ExpressionInferenceResult receiverResult = inferExpression(
node.receiver, const UnknownType(), true,
isVoidAllowed: false);
@@ -3973,8 +4133,8 @@
DartType valueType =
inferrer.getIndexSetValueType(writeTarget, receiverType);
- ExpressionInferenceResult indexResult = inferrer
- .inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
+ ExpressionInferenceResult indexResult =
+ inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
VariableDeclaration? indexVariable;
Expression readIndex = indexResult.expression;
@@ -4007,8 +4167,8 @@
writeIndex = inferrer.ensureAssignable(
writeIndexType, indexResult.inferredType, writeIndex);
- ExpressionInferenceResult valueResult = inferrer
- .inferExpression(node.value, valueType, true, isVoidAllowed: true);
+ ExpressionInferenceResult valueResult =
+ inferExpression(node.value, valueType, true, isVoidAllowed: true);
valueResult = inferrer.ensureAssignableResult(valueType, valueResult);
Expression value = valueResult.expression;
inferrer.flowAnalysis.ifNullExpression_end();
@@ -4117,7 +4277,7 @@
bool typeNeeded = !inferrer.isTopLevel;
Expression? equals;
- ExpressionInferenceResult rightResult = inferrer.inferExpression(
+ ExpressionInferenceResult rightResult = inferExpression(
right, const UnknownType(), typeNeeded,
isVoidAllowed: false);
@@ -4258,7 +4418,7 @@
isNonNullableByDefault: inferrer.isNonNullableByDefault);
}
- ExpressionInferenceResult rightResult = inferrer.inferExpression(
+ ExpressionInferenceResult rightResult = inferExpression(
right, rightContextType, typeNeeded,
isVoidAllowed: true);
if (identical(rightResult.inferredType, noInferredType)) {
@@ -5047,9 +5207,9 @@
ExpressionInferenceResult visitCompoundIndexSet(
CompoundIndexSet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer
- .inferNullAwareExpression(node.receiver, const UnknownType(), true,
- isVoidAllowed: true);
+ ExpressionInferenceResult receiverResult = inferNullAwareExpression(
+ node.receiver, const UnknownType(), true,
+ isVoidAllowed: true);
Link<NullAwareGuard> nullAwareGuards = receiverResult.nullAwareGuards;
Expression receiver = receiverResult.nullAwareAction;
@@ -5077,8 +5237,8 @@
DartType readIndexType = inferrer.getIndexKeyType(readTarget, receiverType);
- ExpressionInferenceResult indexResult = inferrer
- .inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
+ ExpressionInferenceResult indexResult =
+ inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
VariableDeclaration? indexVariable;
Expression readIndex = indexResult.expression;
@@ -5226,9 +5386,9 @@
ExpressionInferenceResult visitNullAwareCompoundSet(
NullAwareCompoundSet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer
- .inferNullAwareExpression(node.receiver, const UnknownType(), true,
- isVoidAllowed: true);
+ ExpressionInferenceResult receiverResult = inferNullAwareExpression(
+ node.receiver, const UnknownType(), true,
+ isVoidAllowed: true);
reportNonNullableInNullAwareWarningIfNeeded(
receiverResult.inferredType, "?.", node.receiver.fileOffset);
@@ -5371,8 +5531,8 @@
DartType readIndexType =
inferrer.getIndexKeyType(readTarget, inferrer.thisType!);
- ExpressionInferenceResult indexResult = inferrer
- .inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
+ ExpressionInferenceResult indexResult =
+ inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
VariableDeclaration? indexVariable;
Expression readIndex = indexResult.expression;
@@ -5522,7 +5682,7 @@
ExpressionInferenceResult visitCompoundExtensionIndexSet(
CompoundExtensionIndexSet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer.inferExpression(
+ ExpressionInferenceResult receiverResult = inferExpression(
node.receiver, const UnknownType(), true,
isVoidAllowed: false);
@@ -5556,8 +5716,8 @@
DartType readIndexType = inferrer.getIndexKeyType(readTarget, receiverType);
- ExpressionInferenceResult indexResult = inferrer
- .inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
+ ExpressionInferenceResult indexResult =
+ inferExpression(node.index, readIndexType, true, isVoidAllowed: true);
VariableDeclaration? indexVariable;
Expression readIndex = indexResult.expression;
@@ -5708,13 +5868,13 @@
@override
ExpressionInferenceResult visitLet(Let node, DartType typeContext) {
DartType variableType = node.variable.type;
- ExpressionInferenceResult initializerResult = inferrer.inferExpression(
+ ExpressionInferenceResult initializerResult = inferExpression(
node.variable.initializer!, variableType, true,
isVoidAllowed: true);
node.variable.initializer = initializerResult.expression
..parent = node.variable;
- ExpressionInferenceResult bodyResult = inferrer
- .inferExpression(node.body, typeContext, true, isVoidAllowed: true);
+ ExpressionInferenceResult bodyResult =
+ inferExpression(node.body, typeContext, true, isVoidAllowed: true);
node.body = bodyResult.expression..parent = node;
DartType inferredType = bodyResult.inferredType;
return new ExpressionInferenceResult(inferredType, node);
@@ -5722,9 +5882,9 @@
ExpressionInferenceResult visitPropertySet(
PropertySet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer
- .inferNullAwareExpression(node.receiver, const UnknownType(), true,
- isVoidAllowed: false);
+ ExpressionInferenceResult receiverResult = inferNullAwareExpression(
+ node.receiver, const UnknownType(), true,
+ isVoidAllowed: false);
Link<NullAwareGuard> nullAwareGuards = receiverResult.nullAwareGuards;
Expression receiver = receiverResult.nullAwareAction;
@@ -5746,8 +5906,8 @@
}
}
DartType writeContext = inferrer.getSetterType(target, receiverType);
- ExpressionInferenceResult rhsResult = inferrer
- .inferExpression(node.value, writeContext, true, isVoidAllowed: true);
+ ExpressionInferenceResult rhsResult =
+ inferExpression(node.value, writeContext, true, isVoidAllowed: true);
rhsResult = inferrer.ensureAssignableResult(writeContext, rhsResult,
fileOffset: node.fileOffset, isVoidAllowed: writeContext is VoidType);
Expression rhs = rhsResult.expression;
@@ -5763,9 +5923,9 @@
ExpressionInferenceResult visitNullAwareIfNullSet(
NullAwareIfNullSet node, DartType typeContext) {
- ExpressionInferenceResult receiverResult = inferrer
- .inferNullAwareExpression(node.receiver, const UnknownType(), true,
- isVoidAllowed: false);
+ ExpressionInferenceResult receiverResult = inferNullAwareExpression(
+ node.receiver, const UnknownType(), true,
+ isVoidAllowed: false);
reportNonNullableInNullAwareWarningIfNeeded(
receiverResult.inferredType, "?.", node.receiver.fileOffset);
@@ -5803,8 +5963,8 @@
DartType valueType =
inferrer.getSetterType(writeTarget, nonNullReceiverType);
- ExpressionInferenceResult valueResult = inferrer
- .inferExpression(node.value, valueType, true, isVoidAllowed: true);
+ ExpressionInferenceResult valueResult =
+ inferExpression(node.value, valueType, true, isVoidAllowed: true);
valueResult = inferrer.ensureAssignableResult(valueType, valueResult);
Expression value = valueResult.expression;
@@ -5865,8 +6025,8 @@
ExpressionInferenceResult visitPropertyGet(
PropertyGet node, DartType typeContext) {
- ExpressionInferenceResult result = inferrer.inferNullAwareExpression(
- node.receiver, const UnknownType(), true);
+ ExpressionInferenceResult result =
+ inferNullAwareExpression(node.receiver, const UnknownType(), true);
Link<NullAwareGuard> nullAwareGuards = result.nullAwareGuards;
Expression receiver = result.nullAwareAction;
@@ -5907,6 +6067,7 @@
inferrer.coreTypes.thisInterfaceType(
node.target.enclosingClass, inferrer.libraryBuilder.nonNullable));
InvocationInferenceResult inferenceResult = inferrer.inferInvocation(
+ this,
const UnknownType(),
node.fileOffset,
functionType,
@@ -5936,7 +6097,7 @@
DartType typeContext = closureContext.returnContext;
DartType inferredType;
if (node.expression != null) {
- ExpressionInferenceResult expressionResult = inferrer.inferExpression(
+ ExpressionInferenceResult expressionResult = inferExpression(
node.expression!, typeContext, true,
isVoidAllowed: true);
node.expression = expressionResult.expression..parent = node;
@@ -6048,8 +6209,8 @@
Member writeMember = node.target;
DartType writeContext = writeMember.setterType;
TypeInferenceEngine.resolveInferenceNode(writeMember);
- ExpressionInferenceResult rhsResult = inferrer
- .inferExpression(node.value, writeContext, true, isVoidAllowed: true);
+ ExpressionInferenceResult rhsResult =
+ inferExpression(node.value, writeContext, true, isVoidAllowed: true);
rhsResult = inferrer.ensureAssignableResult(writeContext, rhsResult,
fileOffset: node.fileOffset, isVoidAllowed: writeContext is VoidType);
Expression rhs = rhsResult.expression;
@@ -6088,8 +6249,12 @@
: new FunctionType(
[], const DynamicType(), inferrer.libraryBuilder.nonNullable);
TypeArgumentsInfo typeArgumentsInfo = getTypeArgumentsInfo(node.arguments);
- InvocationInferenceResult result = inferrer.inferInvocation(typeContext,
- node.fileOffset, calleeType, node.arguments as ArgumentsImpl,
+ InvocationInferenceResult result = inferrer.inferInvocation(
+ this,
+ typeContext,
+ node.fileOffset,
+ calleeType,
+ node.arguments as ArgumentsImpl,
staticTarget: node.target);
// ignore: unnecessary_null_comparison
if (!inferrer.isTopLevel && node.target != null) {
@@ -6108,7 +6273,7 @@
StringConcatenation node, DartType typeContext) {
if (!inferrer.isTopLevel) {
for (int index = 0; index < node.expressions.length; index++) {
- ExpressionInferenceResult result = inferrer.inferExpression(
+ ExpressionInferenceResult result = inferExpression(
node.expressions[index], const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: false);
node.expressions[index] = result.expression..parent = node;
@@ -6139,6 +6304,7 @@
.withoutTypeParameters) as FunctionType,
inferrer.thisType!);
InvocationInferenceResult inferenceResult = inferrer.inferInvocation(
+ this,
const UnknownType(),
node.fileOffset,
functionType,
@@ -6160,7 +6326,7 @@
new InstrumentationValueForMember(node.interfaceTarget!));
}
assert(node.interfaceTarget == null || node.interfaceTarget is Procedure);
- return inferrer.inferSuperMethodInvocation(node, node.name,
+ return inferrer.inferSuperMethodInvocation(this, node, node.name,
node.arguments as ArgumentsImpl, typeContext, node.interfaceTarget);
}
@@ -6175,7 +6341,7 @@
new InstrumentationValueForMember(node.interfaceTarget!));
}
assert(node.interfaceTarget == null || node.interfaceTarget is Procedure);
- return inferrer.inferSuperMethodInvocation(node, node.name,
+ return inferrer.inferSuperMethodInvocation(this, node, node.name,
node.arguments as ArgumentsImpl, typeContext, node.interfaceTarget);
}
@@ -6224,8 +6390,8 @@
writeContext = inferrer.computeTypeFromSuperClass(
node.interfaceTarget!.enclosingClass!, writeContext);
}
- ExpressionInferenceResult rhsResult = inferrer
- .inferExpression(node.value, writeContext, true, isVoidAllowed: true);
+ ExpressionInferenceResult rhsResult =
+ inferExpression(node.value, writeContext, true, isVoidAllowed: true);
rhsResult = inferrer.ensureAssignableResult(writeContext, rhsResult,
fileOffset: node.fileOffset, isVoidAllowed: writeContext is VoidType);
Expression rhs = rhsResult.expression;
@@ -6250,8 +6416,8 @@
writeContext = inferrer.computeTypeFromSuperClass(
node.interfaceTarget!.enclosingClass!, writeContext);
}
- ExpressionInferenceResult rhsResult = inferrer
- .inferExpression(node.value, writeContext, true, isVoidAllowed: true);
+ ExpressionInferenceResult rhsResult =
+ inferExpression(node.value, writeContext, true, isVoidAllowed: true);
rhsResult = inferrer.ensureAssignableResult(writeContext, rhsResult,
fileOffset: node.fileOffset, isVoidAllowed: writeContext is VoidType);
Expression rhs = rhsResult.expression;
@@ -6261,7 +6427,7 @@
@override
StatementInferenceResult visitSwitchStatement(SwitchStatement node) {
- ExpressionInferenceResult expressionResult = inferrer.inferExpression(
+ ExpressionInferenceResult expressionResult = inferExpression(
node.expression, const UnknownType(), true,
isVoidAllowed: false);
node.expression = expressionResult.expression..parent = node;
@@ -6288,10 +6454,9 @@
inferrer.flowAnalysis
.switchStatement_beginCase(switchCase.hasLabel, node);
for (int index = 0; index < switchCase.expressions.length; index++) {
- ExpressionInferenceResult caseExpressionResult =
- inferrer.inferExpression(
- switchCase.expressions[index], expressionType, true,
- isVoidAllowed: false);
+ ExpressionInferenceResult caseExpressionResult = inferExpression(
+ switchCase.expressions[index], expressionType, true,
+ isVoidAllowed: false);
Expression caseExpression = caseExpressionResult.expression;
switchCase.expressions[index] = caseExpression..parent = switchCase;
DartType caseExpressionType = caseExpressionResult.inferredType;
@@ -6342,8 +6507,7 @@
}
}
}
- StatementInferenceResult bodyResult =
- inferrer.inferStatement(switchCase.body);
+ StatementInferenceResult bodyResult = inferStatement(switchCase.body);
if (bodyResult.hasChanged) {
switchCase.body = bodyResult.statement..parent = switchCase;
}
@@ -6417,7 +6581,7 @@
@override
ExpressionInferenceResult visitThrow(Throw node, DartType typeContext) {
- ExpressionInferenceResult expressionResult = inferrer.inferExpression(
+ ExpressionInferenceResult expressionResult = inferExpression(
node.expression, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: false);
node.expression = expressionResult.expression..parent = node;
@@ -6444,7 +6608,7 @@
}
void visitCatch(Catch node) {
- StatementInferenceResult bodyResult = inferrer.inferStatement(node.body);
+ StatementInferenceResult bodyResult = inferStatement(node.body);
if (bodyResult.hasChanged) {
node.body = bodyResult.statement..parent = node;
}
@@ -6459,8 +6623,7 @@
inferrer.flowAnalysis.tryCatchStatement_bodyBegin();
}
- StatementInferenceResult tryBlockResult =
- inferrer.inferStatement(node.tryBlock);
+ StatementInferenceResult tryBlockResult = inferStatement(node.tryBlock);
if (node.catchBlocks.isNotEmpty) {
inferrer.flowAnalysis.tryCatchStatement_bodyEnd(tryBodyWithAssignedInfo);
@@ -6480,7 +6643,7 @@
// otherwise it uses the assigned variables for the
inferrer.flowAnalysis.tryFinallyStatement_finallyBegin(
node.catchBlocks.isNotEmpty ? node : tryBodyWithAssignedInfo);
- finalizerResult = inferrer.inferStatement(node.finallyBlock!);
+ finalizerResult = inferStatement(node.finallyBlock!);
inferrer.flowAnalysis.tryFinallyStatement_end();
}
Statement result =
@@ -6524,7 +6687,7 @@
if (inferrer.isNonNullableByDefault) {
promotedType = inferrer.flowAnalysis.promotedType(variable);
}
- ExpressionInferenceResult rhsResult = inferrer.inferExpression(
+ ExpressionInferenceResult rhsResult = inferExpression(
node.value, promotedType ?? declaredOrInferredType, true,
isVoidAllowed: true);
rhsResult = inferrer.ensureAssignableResult(
@@ -6596,8 +6759,8 @@
if (node.isLate && node.hasDeclaredInitializer) {
inferrer.flowAnalysis.lateInitializer_begin(node);
}
- initializerResult = inferrer.inferExpression(node.initializer!,
- declaredType, !inferrer.isTopLevel || node.isImplicitlyTyped,
+ initializerResult = inferExpression(node.initializer!, declaredType,
+ !inferrer.isTopLevel || node.isImplicitlyTyped,
isVoidAllowed: true);
if (node.isLate && node.hasDeclaredInitializer) {
inferrer.flowAnalysis.lateInitializer_end();
@@ -6894,7 +7057,7 @@
inferrer.flowAnalysis.whileStatement_conditionBegin(node);
InterfaceType expectedType =
inferrer.coreTypes.boolRawType(inferrer.libraryBuilder.nonNullable);
- ExpressionInferenceResult conditionResult = inferrer.inferExpression(
+ ExpressionInferenceResult conditionResult = inferExpression(
node.condition, expectedType, !inferrer.isTopLevel,
isVoidAllowed: false);
Expression condition = inferrer
@@ -6902,7 +7065,7 @@
.expression;
node.condition = condition..parent = node;
inferrer.flowAnalysis.whileStatement_bodyBegin(node, node.condition);
- StatementInferenceResult bodyResult = inferrer.inferStatement(node.body);
+ StatementInferenceResult bodyResult = inferStatement(node.body);
if (bodyResult.hasChanged) {
node.body = bodyResult.statement..parent = node;
}
@@ -6923,8 +7086,7 @@
: inferrer.coreTypes.iterableClass,
inferrer.libraryBuilder.nonNullable);
}
- expressionResult = inferrer.inferExpression(
- node.expression, typeContext, true,
+ expressionResult = inferExpression(node.expression, typeContext, true,
isVoidAllowed: true);
closureContext.handleYield(inferrer, node, expressionResult);
return const StatementInferenceResult();
@@ -6938,7 +7100,7 @@
if (node.arguments != null) {
FunctionType calleeType = new FunctionType(
[], inferredType, inferrer.libraryBuilder.nonNullable);
- inferrer.inferInvocation(typeContext, node.fileOffset, calleeType,
+ inferrer.inferInvocation(this, typeContext, node.fileOffset, calleeType,
node.arguments! as ArgumentsImpl);
}
return new ExpressionInferenceResult(inferredType, node);
@@ -6968,7 +7130,7 @@
ExpressionInferenceResult visitEquals(
EqualsExpression node, DartType typeContext) {
ExpressionInferenceResult leftResult =
- inferrer.inferExpression(node.left, const UnknownType(), true);
+ inferExpression(node.left, const UnknownType(), true);
return _computeEqualsExpression(node.fileOffset, leftResult.expression,
leftResult.inferredType, node.right,
isNot: node.isNot);
@@ -6977,7 +7139,7 @@
ExpressionInferenceResult visitBinary(
BinaryExpression node, DartType typeContext) {
ExpressionInferenceResult leftResult =
- inferrer.inferExpression(node.left, const UnknownType(), true);
+ inferExpression(node.left, const UnknownType(), true);
Map<DartType, NonPromotionReason> Function() whyNotPromoted =
inferrer.flowAnalysis.whyNotPromoted(leftResult.expression);
return _computeBinaryExpression(
@@ -7061,7 +7223,7 @@
}
if (expressionResult == null) {
expressionResult =
- inferrer.inferExpression(node.expression, const UnknownType(), true);
+ inferExpression(node.expression, const UnknownType(), true);
}
Map<DartType, NonPromotionReason> Function() whyNotPromoted =
inferrer.flowAnalysis.whyNotPromoted(expressionResult.expression);
@@ -7071,7 +7233,7 @@
ExpressionInferenceResult visitParenthesized(
ParenthesizedExpression node, DartType typeContext) {
- return inferrer.inferExpression(node.expression, typeContext, true,
+ return inferExpression(node.expression, typeContext, true,
isVoidAllowed: true);
}
@@ -7107,11 +7269,11 @@
abstract class ForInVariable {
/// Computes the type of the elements expected for this for-in variable.
- DartType computeElementType(TypeInferrerImpl inferrer);
+ DartType computeElementType(InferenceVisitor visitor);
/// Infers the assignment to this for-in variable with a value of type
/// [rhsType]. The resulting expression is returned.
- Expression? inferAssignment(TypeInferrerImpl inferrer, DartType rhsType);
+ Expression? inferAssignment(InferenceVisitor visitor, DartType rhsType);
}
class LocalForInVariable implements ForInVariable {
@@ -7120,20 +7282,20 @@
LocalForInVariable(this.variableSet);
@override
- DartType computeElementType(TypeInferrerImpl inferrer) {
+ DartType computeElementType(InferenceVisitor visitor) {
VariableDeclaration variable = variableSet.variable;
DartType? promotedType;
- if (inferrer.isNonNullableByDefault) {
- promotedType = inferrer.flowAnalysis.promotedType(variable);
+ if (visitor.inferrer.isNonNullableByDefault) {
+ promotedType = visitor.inferrer.flowAnalysis.promotedType(variable);
}
return promotedType ?? variable.type;
}
@override
- Expression inferAssignment(TypeInferrerImpl inferrer, DartType rhsType) {
+ Expression inferAssignment(InferenceVisitor visitor, DartType rhsType) {
DartType variableType =
- inferrer.computeGreatestClosure(variableSet.variable.type);
- Expression rhs = inferrer.ensureAssignable(
+ visitor.inferrer.computeGreatestClosure(variableSet.variable.type);
+ Expression rhs = visitor.inferrer.ensureAssignable(
variableType, rhsType, variableSet.value,
errorTemplate: templateForInLoopElementTypeNotAssignable,
nullabilityErrorTemplate:
@@ -7143,7 +7305,7 @@
isVoidAllowed: true);
variableSet.value = rhs..parent = variableSet;
- inferrer.flowAnalysis
+ visitor.inferrer.flowAnalysis
.write(variableSet, variableSet.variable, rhsType, null);
return variableSet;
}
@@ -7159,19 +7321,19 @@
PropertyForInVariable(this.propertySet);
@override
- DartType computeElementType(TypeInferrerImpl inferrer) {
- ExpressionInferenceResult receiverResult = inferrer.inferExpression(
+ DartType computeElementType(InferenceVisitor visitor) {
+ ExpressionInferenceResult receiverResult = visitor.inferExpression(
propertySet.receiver, const UnknownType(), true);
propertySet.receiver = receiverResult.expression..parent = propertySet;
DartType receiverType = receiverResult.inferredType;
- ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
+ ObjectAccessTarget writeTarget = visitor.inferrer.findInterfaceMember(
receiverType, propertySet.name, propertySet.fileOffset,
callSiteAccessKind: CallSiteAccessKind.setterInvocation,
instrumented: true,
includeExtensionMethods: true);
DartType elementType =
- _writeType = inferrer.getSetterType(writeTarget, receiverType);
- Expression? error = inferrer.reportMissingInterfaceMember(
+ _writeType = visitor.inferrer.getSetterType(writeTarget, receiverType);
+ Expression? error = visitor.inferrer.reportMissingInterfaceMember(
writeTarget,
receiverType,
propertySet.name,
@@ -7181,10 +7343,10 @@
_rhs = error;
} else {
if (writeTarget.isInstanceMember || writeTarget.isObjectMember) {
- if (inferrer.instrumentation != null &&
+ if (visitor.inferrer.instrumentation != null &&
receiverType == const DynamicType()) {
- inferrer.instrumentation!.record(
- inferrer.uriForInstrumentation,
+ visitor.inferrer.instrumentation!.record(
+ visitor.inferrer.uriForInstrumentation,
propertySet.fileOffset,
'target',
new InstrumentationValueForMember(writeTarget.member!));
@@ -7196,9 +7358,9 @@
}
@override
- Expression inferAssignment(TypeInferrerImpl inferrer, DartType rhsType) {
- Expression rhs = inferrer.ensureAssignable(
- inferrer.computeGreatestClosure(_writeType!), rhsType, _rhs!,
+ Expression inferAssignment(InferenceVisitor visitor, DartType rhsType) {
+ Expression rhs = visitor.inferrer.ensureAssignable(
+ visitor.inferrer.computeGreatestClosure(_writeType!), rhsType, _rhs!,
errorTemplate: templateForInLoopElementTypeNotAssignable,
nullabilityErrorTemplate:
templateForInLoopElementTypeNotAssignableNullability,
@@ -7207,8 +7369,8 @@
isVoidAllowed: true);
propertySet.value = rhs..parent = propertySet;
- ExpressionInferenceResult result = inferrer.inferExpression(
- propertySet, const UnknownType(), !inferrer.isTopLevel,
+ ExpressionInferenceResult result = visitor.inferExpression(
+ propertySet, const UnknownType(), !visitor.inferrer.isTopLevel,
isVoidAllowed: true);
return result.expression;
}
@@ -7222,22 +7384,23 @@
AbstractSuperPropertyForInVariable(this.superPropertySet);
@override
- DartType computeElementType(TypeInferrerImpl inferrer) {
- DartType receiverType = inferrer.thisType!;
- ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
+ DartType computeElementType(InferenceVisitor visitor) {
+ DartType receiverType = visitor.inferrer.thisType!;
+ ObjectAccessTarget writeTarget = visitor.inferrer.findInterfaceMember(
receiverType, superPropertySet.name, superPropertySet.fileOffset,
callSiteAccessKind: CallSiteAccessKind.setterInvocation,
instrumented: true);
if (writeTarget.isInstanceMember || writeTarget.isObjectMember) {
superPropertySet.interfaceTarget = writeTarget.member;
}
- return _writeType = inferrer.getSetterType(writeTarget, receiverType);
+ return _writeType =
+ visitor.inferrer.getSetterType(writeTarget, receiverType);
}
@override
- Expression inferAssignment(TypeInferrerImpl inferrer, DartType rhsType) {
- Expression rhs = inferrer.ensureAssignable(
- inferrer.computeGreatestClosure(_writeType!),
+ Expression inferAssignment(InferenceVisitor visitor, DartType rhsType) {
+ Expression rhs = visitor.inferrer.ensureAssignable(
+ visitor.inferrer.computeGreatestClosure(_writeType!),
rhsType,
superPropertySet.value,
errorTemplate: templateForInLoopElementTypeNotAssignable,
@@ -7247,8 +7410,8 @@
templateForInLoopElementTypeNotAssignablePartNullability,
isVoidAllowed: true);
superPropertySet.value = rhs..parent = superPropertySet;
- ExpressionInferenceResult result = inferrer.inferExpression(
- superPropertySet, const UnknownType(), !inferrer.isTopLevel,
+ ExpressionInferenceResult result = visitor.inferExpression(
+ superPropertySet, const UnknownType(), !visitor.inferrer.isTopLevel,
isVoidAllowed: true);
return result.expression;
}
@@ -7262,22 +7425,23 @@
SuperPropertyForInVariable(this.superPropertySet);
@override
- DartType computeElementType(TypeInferrerImpl inferrer) {
- DartType receiverType = inferrer.thisType!;
- ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
+ DartType computeElementType(InferenceVisitor visitor) {
+ DartType receiverType = visitor.inferrer.thisType!;
+ ObjectAccessTarget writeTarget = visitor.inferrer.findInterfaceMember(
receiverType, superPropertySet.name, superPropertySet.fileOffset,
callSiteAccessKind: CallSiteAccessKind.setterInvocation,
instrumented: true);
if (writeTarget.isInstanceMember || writeTarget.isObjectMember) {
superPropertySet.interfaceTarget = writeTarget.member;
}
- return _writeType = inferrer.getSetterType(writeTarget, receiverType);
+ return _writeType =
+ visitor.inferrer.getSetterType(writeTarget, receiverType);
}
@override
- Expression inferAssignment(TypeInferrerImpl inferrer, DartType rhsType) {
- Expression rhs = inferrer.ensureAssignable(
- inferrer.computeGreatestClosure(_writeType!),
+ Expression inferAssignment(InferenceVisitor visitor, DartType rhsType) {
+ Expression rhs = visitor.inferrer.ensureAssignable(
+ visitor.inferrer.computeGreatestClosure(_writeType!),
rhsType,
superPropertySet.value,
errorTemplate: templateForInLoopElementTypeNotAssignable,
@@ -7287,8 +7451,8 @@
templateForInLoopElementTypeNotAssignablePartNullability,
isVoidAllowed: true);
superPropertySet.value = rhs..parent = superPropertySet;
- ExpressionInferenceResult result = inferrer.inferExpression(
- superPropertySet, const UnknownType(), !inferrer.isTopLevel,
+ ExpressionInferenceResult result = visitor.inferExpression(
+ superPropertySet, const UnknownType(), !visitor.inferrer.isTopLevel,
isVoidAllowed: true);
return result.expression;
}
@@ -7300,14 +7464,14 @@
StaticForInVariable(this.staticSet);
@override
- DartType computeElementType(TypeInferrerImpl inferrer) =>
+ DartType computeElementType(InferenceVisitor visitor) =>
staticSet.target.setterType;
@override
- Expression inferAssignment(TypeInferrerImpl inferrer, DartType rhsType) {
+ Expression inferAssignment(InferenceVisitor visitor, DartType rhsType) {
DartType setterType =
- inferrer.computeGreatestClosure(staticSet.target.setterType);
- Expression rhs = inferrer.ensureAssignable(
+ visitor.inferrer.computeGreatestClosure(staticSet.target.setterType);
+ Expression rhs = visitor.inferrer.ensureAssignable(
setterType, rhsType, staticSet.value,
errorTemplate: templateForInLoopElementTypeNotAssignable,
nullabilityErrorTemplate:
@@ -7317,8 +7481,8 @@
isVoidAllowed: true);
staticSet.value = rhs..parent = staticSet;
- ExpressionInferenceResult result = inferrer.inferExpression(
- staticSet, const UnknownType(), !inferrer.isTopLevel,
+ ExpressionInferenceResult result = visitor.inferExpression(
+ staticSet, const UnknownType(), !visitor.inferrer.isTopLevel,
isVoidAllowed: true);
return result.expression;
}
@@ -7330,10 +7494,10 @@
InvalidForInVariable(this.expression);
@override
- DartType computeElementType(TypeInferrerImpl inferrer) => const UnknownType();
+ DartType computeElementType(InferenceVisitor visitor) => const UnknownType();
@override
- Expression? inferAssignment(TypeInferrerImpl inferrer, DartType rhsType) =>
+ Expression? inferAssignment(InferenceVisitor visitor, DartType rhsType) =>
expression;
}
diff --git a/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart b/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
index 0b88f34..86e3ca3 100644
--- a/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart
@@ -16,15 +16,14 @@
import '../builder/type_variable_builder.dart';
import '../dill/dill_member_builder.dart';
import '../kernel/constructor_tearoff_lowering.dart';
-import '../kernel/forest.dart';
import '../kernel/hierarchy/class_member.dart';
-import '../kernel/internal_ast.dart';
import '../kernel/kernel_helper.dart';
import '../kernel/redirecting_factory_body.dart'
show getRedirectingFactoryBody, RedirectingFactoryBody;
import '../messages.dart'
show messageConstFactoryRedirectionToNonConst, noLength;
import '../problems.dart' show unexpected, unhandled;
+import '../type_inference/inference_helper.dart';
import '../type_inference/type_inferrer.dart';
import '../type_inference/type_schema.dart';
import '../util/helpers.dart';
@@ -401,7 +400,7 @@
TypeInferrer inferrer = libraryBuilder.loader.typeInferenceEngine
.createLocalTypeInferrer(
fileUri, classBuilder!.thisType, libraryBuilder, null);
- inferrer.helper = libraryBuilder.loader
+ InferenceHelper helper = libraryBuilder.loader
.createBodyBuilderForOutlineExpression(
libraryBuilder, classBuilder, this, classBuilder!.scope, fileUri);
Builder? targetBuilder = redirectionTarget.target;
@@ -418,37 +417,14 @@
unhandled("${targetBuilder.runtimeType}", "buildOutlineExpressions",
charOffset, fileUri);
}
- ArgumentsImpl targetInvocationArguments;
- {
- List<Expression> positionalArguments = <Expression>[];
- for (VariableDeclaration parameter
- in _procedure.function.positionalParameters) {
- inferrer.flowAnalysis.declare(parameter, true);
- positionalArguments
- .add(new VariableGetImpl(parameter, forNullGuardedAccess: false));
- }
- List<NamedExpression> namedArguments = <NamedExpression>[];
- for (VariableDeclaration parameter
- in _procedure.function.namedParameters) {
- inferrer.flowAnalysis.declare(parameter, true);
- namedArguments.add(new NamedExpression(parameter.name!,
- new VariableGetImpl(parameter, forNullGuardedAccess: false)));
- }
- // If arguments are created using [Forest.createArguments], and the
- // type arguments are omitted, they are to be inferred.
- targetInvocationArguments = const Forest().createArguments(
- _procedure.fileOffset, positionalArguments,
- named: namedArguments);
- }
- InvocationInferenceResult result = inferrer.inferInvocation(
+ typeArguments = inferrer.inferRedirectingFactoryTypeArguments(
+ helper,
function.returnType,
+ _procedure.function,
charOffset,
- target.function!.computeFunctionType(Nullability.nonNullable),
- targetInvocationArguments,
- staticTarget: target);
- if (result.inferredType is InterfaceType) {
- typeArguments = (result.inferredType as InterfaceType).typeArguments;
- } else {
+ target,
+ target.function!.computeFunctionType(Nullability.nonNullable));
+ if (typeArguments == null) {
// Assume that the error is reported elsewhere, use 'dynamic' for
// recovery.
typeArguments = new List<DartType>.filled(
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 116a327..49d5866 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
@@ -175,13 +175,15 @@
InferenceHelper get helper;
- void set helper(InferenceHelper helper);
-
/// Indicates whether the construct we are currently performing inference for
/// is outside of a method body, and hence top level type inference rules
/// should apply.
bool get isTopLevel;
+ /// Performs top level type inference on the given field initializer and
+ /// returns the computed field type.
+ DartType inferImplicitFieldType(Expression initializer);
+
/// Performs full type inference on the given field initializer.
ExpressionInferenceResult inferFieldInitializer(
InferenceHelper helper, DartType declaredType, Expression initializer);
@@ -191,11 +193,6 @@
/// [initializerType].
DartType inferDeclarationType(DartType initializerType);
- /// Performs type inference on [expression].
- ExpressionInferenceResult inferExpression(
- Expression expression, DartType typeContext, bool typeNeeded,
- {bool isVoidAllowed: false, bool forEffect: false});
-
/// Performs type inference on the given function body.
InferredFunctionBody inferFunctionBody(InferenceHelper helper, int fileOffset,
DartType returnType, AsyncMarker asyncMarker, Statement body);
@@ -208,11 +205,6 @@
void inferMetadata(
InferenceHelper helper, TreeNode? parent, List<Expression>? annotations);
- /// Performs type inference on the given metadata annotations keeping the
- /// existing helper if possible.
- void inferMetadataKeepingHelper(
- TreeNode parent, List<Expression> annotations);
-
/// Performs type inference on the given function parameter initializer
/// expression.
Expression inferParameterInitializer(
@@ -226,18 +218,14 @@
// application constructors.
void inferConstructorParameterTypes(Constructor constructor);
- InvocationInferenceResult inferInvocation(DartType typeContext, int offset,
- FunctionType calleeType, ArgumentsImpl arguments,
- {List<VariableDeclaration>? hoistedExpressions,
- bool isSpecialCasedBinaryOperator: false,
- bool isSpecialCasedTernaryOperator: false,
- DartType? receiverType,
- bool skipTypeArgumentInference: false,
- bool isConst: false,
- bool isImplicitExtensionMember: false,
- bool isImplicitCall: false,
- Member? staticTarget,
- bool isExtensionMemberInvocation = false});
+ /// Infers the type arguments a redirecting factory target reference.
+ List<DartType>? inferRedirectingFactoryTypeArguments(
+ InferenceHelper helper,
+ DartType typeContext,
+ FunctionNode redirectingFactoryFunction,
+ int fileOffset,
+ Member target,
+ FunctionType targetType);
}
/// Concrete implementation of [TypeInferrer] specialized to work with kernel
@@ -311,7 +299,6 @@
@override
InferenceHelper get helper => _helper!;
- @override
void set helper(InferenceHelper helper) {
if (isTopLevel) {
throw new StateError("Attempting to assign TypeInferrerImpl.helper "
@@ -320,6 +307,14 @@
_helper = helper;
}
+ InferenceVisitor _createInferenceVisitor() {
+ // For full (non-top level) inference, we need access to the
+ // ExpressionGeneratorHelper so that we can perform error recovery.
+ assert(isTopLevel || _helper != null,
+ "Helper hasn't been set up for full inference.");
+ return new InferenceVisitor(this);
+ }
+
CoreTypes get coreTypes => engine.coreTypes;
bool get isInferenceUpdate1Enabled =>
@@ -505,16 +500,18 @@
InitializerInferenceResult inferInitializer(
InferenceHelper helper, Initializer initializer) {
this.helper = helper;
+
// Use polymorphic dispatch on [KernelInitializer] to perform whatever
// kind of type inference is correct for this kind of initializer.
// TODO(paulberry): experiment to see if dynamic dispatch would be better,
// so that the type hierarchy will be simpler (which may speed up "is"
// checks).
+ InferenceVisitor visitor = _createInferenceVisitor();
InitializerInferenceResult inferenceResult;
if (initializer is InitializerJudgment) {
- inferenceResult = initializer.acceptInference(new InferenceVisitor(this));
+ inferenceResult = initializer.acceptInference(visitor);
} else {
- inferenceResult = initializer.accept(new InferenceVisitor(this));
+ inferenceResult = initializer.accept(visitor);
}
_helper = null;
return inferenceResult;
@@ -2005,39 +2002,6 @@
}
}
- void inferSyntheticVariable(VariableDeclarationImpl variable) {
- assert(variable.isImplicitlyTyped);
- assert(variable.initializer != null);
- ExpressionInferenceResult result = inferExpression(
- variable.initializer!, const UnknownType(), true,
- isVoidAllowed: true);
- variable.initializer = result.expression..parent = variable;
- DartType inferredType =
- inferDeclarationType(result.inferredType, forSyntheticVariable: true);
- instrumentation?.record(uriForInstrumentation, variable.fileOffset, 'type',
- new InstrumentationValueForType(inferredType));
- variable.type = inferredType;
- }
-
- Link<NullAwareGuard> inferSyntheticVariableNullAware(
- VariableDeclarationImpl variable) {
- assert(variable.isImplicitlyTyped);
- assert(variable.initializer != null);
- ExpressionInferenceResult result = inferNullAwareExpression(
- variable.initializer!, const UnknownType(), true,
- isVoidAllowed: true);
-
- Link<NullAwareGuard> nullAwareGuards = result.nullAwareGuards;
- variable.initializer = result.nullAwareAction..parent = variable;
-
- DartType inferredType =
- inferDeclarationType(result.inferredType, forSyntheticVariable: true);
- instrumentation?.record(uriForInstrumentation, variable.fileOffset, 'type',
- new InstrumentationValueForType(inferredType));
- variable.type = inferredType;
- return nullAwareGuards;
- }
-
NullAwareGuard createNullAwareGuard(VariableDeclaration variable) {
return new NullAwareGuard(variable, variable.fileOffset, this);
}
@@ -2071,110 +2035,24 @@
}
}
- /// Performs type inference on the given [expression].
- ///
- /// [typeContext] is the expected type of the expression, based on surrounding
- /// code. [typeNeeded] indicates whether it is necessary to compute the
- /// actual type of the expression. If [typeNeeded] is `true`,
- /// [ExpressionInferenceResult.inferredType] is the actual type of the
- /// expression; otherwise `null`.
- ///
- /// Derived classes should override this method with logic that dispatches on
- /// the expression type and calls the appropriate specialized "infer" method.
- ExpressionInferenceResult _inferExpression(
- Expression expression, DartType typeContext, bool typeNeeded,
- {bool isVoidAllowed: false, bool forEffect: false}) {
- registerIfUnreachableForTesting(expression);
-
- // `null` should never be used as the type context. An instance of
- // `UnknownType` should be used instead.
- // ignore: unnecessary_null_comparison
- assert(typeContext != null);
-
- // For full (non-top level) inference, we need access to the
- // ExpressionGeneratorHelper so that we can perform error recovery.
- assert(isTopLevel || _helper != null,
- "Helper hasn't been set up for full inference.");
-
- // When doing top level inference, we skip subexpressions whose type isn't
- // needed so that we don't induce bogus dependencies on fields mentioned in
- // those subexpressions.
- if (!typeNeeded) {
- return new ExpressionInferenceResult(const UnknownType(), expression);
- }
-
- InferenceVisitor visitor = new InferenceVisitor(this);
- ExpressionInferenceResult result;
- if (expression is ExpressionJudgment) {
- result = expression.acceptInference(visitor, typeContext);
- } else if (expression is InternalExpression) {
- result = expression.acceptInference(visitor, typeContext);
- } else {
- result = expression.accept1(visitor, typeContext);
- }
- DartType inferredType = result.inferredType;
- // ignore: unnecessary_null_comparison
- assert(inferredType != null,
- "No type inferred for $expression (${expression.runtimeType}).");
- if (inferredType is VoidType && !isVoidAllowed) {
- if (expression.parent is! ArgumentsImpl && !isTopLevel) {
- helper.addProblem(
- messageVoidExpression, expression.fileOffset, noLength);
- }
- }
- if (coreTypes.isBottom(result.inferredType)) {
- flowAnalysis.handleExit();
- if (shouldThrowUnsoundnessException &&
- // Don't throw on expressions that inherently return the bottom type.
- !(result.nullAwareAction is Throw ||
- result.nullAwareAction is Rethrow ||
- result.nullAwareAction is InvalidExpression)) {
- Expression replacement = createLet(
- createVariable(result.expression, result.inferredType),
- createReachabilityError(expression.fileOffset,
- messageNeverValueError, messageNeverValueWarning));
- flowAnalysis.forwardExpression(replacement, result.expression);
- result =
- new ExpressionInferenceResult(result.inferredType, replacement);
- }
- }
- return result;
- }
-
@override
- ExpressionInferenceResult inferExpression(
- Expression expression, DartType typeContext, bool typeNeeded,
- {bool isVoidAllowed: false, bool forEffect: false}) {
- ExpressionInferenceResult result = _inferExpression(
- expression, typeContext, typeNeeded,
- isVoidAllowed: isVoidAllowed, forEffect: forEffect);
- return result.stopShorting();
- }
-
- ExpressionInferenceResult inferNullAwareExpression(
- Expression expression, DartType typeContext, bool typeNeeded,
- {bool isVoidAllowed: false, bool forEffect: false}) {
- ExpressionInferenceResult result = _inferExpression(
- expression, typeContext, typeNeeded,
- isVoidAllowed: isVoidAllowed, forEffect: forEffect);
- if (isNonNullableByDefault) {
- return result;
- } else {
- return result.stopShorting();
- }
+ DartType inferImplicitFieldType(Expression initializer) {
+ InferenceVisitor visitor = _createInferenceVisitor();
+ ExpressionInferenceResult result = visitor.inferExpression(
+ initializer, const UnknownType(), true,
+ isVoidAllowed: true);
+ return inferDeclarationType(result.inferredType);
}
@override
ExpressionInferenceResult inferFieldInitializer(
- InferenceHelper helper,
- DartType declaredType,
- Expression initializer,
- ) {
+ InferenceHelper helper, DartType declaredType, Expression initializer) {
assert(closureContext == null);
assert(!isTopLevel);
this.helper = helper;
- ExpressionInferenceResult initializerResult =
- inferExpression(initializer, declaredType, true, isVoidAllowed: true);
+ InferenceVisitor visitor = _createInferenceVisitor();
+ ExpressionInferenceResult initializerResult = visitor
+ .inferExpression(initializer, declaredType, true, isVoidAllowed: true);
initializerResult = ensureAssignableResult(declaredType, initializerResult,
isVoidAllowed: declaredType is VoidType);
_helper = null;
@@ -2190,7 +2068,8 @@
assert(closureContext == null);
this.helper = helper;
closureContext = new ClosureContext(this, asyncMarker, returnType, false);
- StatementInferenceResult result = inferStatement(body);
+ InferenceVisitor visitor = _createInferenceVisitor();
+ StatementInferenceResult result = visitor.inferStatement(body);
if (dataForTesting != null) {
if (!flowAnalysis.isReachable) {
dataForTesting!.flowAnalysisResult.functionBodiesThatDontComplete
@@ -2210,8 +2089,53 @@
}
@override
- InvocationInferenceResult inferInvocation(DartType typeContext, int offset,
- FunctionType calleeType, ArgumentsImpl arguments,
+ List<DartType>? inferRedirectingFactoryTypeArguments(
+ InferenceHelper helper,
+ DartType typeContext,
+ FunctionNode redirectingFactoryFunction,
+ int fileOffset,
+ Member target,
+ FunctionType targetType) {
+ this.helper = helper;
+ InferenceVisitor visitor = _createInferenceVisitor();
+ List<Expression> positionalArguments = <Expression>[];
+ for (VariableDeclaration parameter
+ in redirectingFactoryFunction.positionalParameters) {
+ flowAnalysis.declare(parameter, true);
+ positionalArguments
+ .add(new VariableGetImpl(parameter, forNullGuardedAccess: false));
+ }
+ List<NamedExpression> namedArguments = <NamedExpression>[];
+ for (VariableDeclaration parameter
+ in redirectingFactoryFunction.namedParameters) {
+ flowAnalysis.declare(parameter, true);
+ namedArguments.add(new NamedExpression(parameter.name!,
+ new VariableGetImpl(parameter, forNullGuardedAccess: false)));
+ }
+ // If arguments are created using [Forest.createArguments], and the
+ // type arguments are omitted, they are to be inferred.
+ ArgumentsImpl targetInvocationArguments = engine.forest.createArguments(
+ fileOffset, positionalArguments,
+ named: namedArguments);
+
+ InvocationInferenceResult result = inferInvocation(
+ visitor, typeContext, fileOffset, targetType, targetInvocationArguments,
+ staticTarget: target);
+ DartType resultType = result.inferredType;
+ _helper = null;
+ if (resultType is InterfaceType) {
+ return resultType.typeArguments;
+ } else {
+ return null;
+ }
+ }
+
+ InvocationInferenceResult inferInvocation(
+ InferenceVisitor visitor,
+ DartType typeContext,
+ int offset,
+ FunctionType calleeType,
+ ArgumentsImpl arguments,
{List<VariableDeclaration>? hoistedExpressions,
bool isSpecialCasedBinaryOperator: false,
bool isSpecialCasedTernaryOperator: false,
@@ -2224,8 +2148,14 @@
bool isExtensionMemberInvocation = false}) {
int extensionTypeParameterCount = getExtensionTypeParameterCount(arguments);
if (extensionTypeParameterCount != 0) {
- return _inferGenericExtensionMethodInvocation(extensionTypeParameterCount,
- typeContext, offset, calleeType, arguments, hoistedExpressions,
+ return _inferGenericExtensionMethodInvocation(
+ visitor,
+ extensionTypeParameterCount,
+ typeContext,
+ offset,
+ calleeType,
+ arguments,
+ hoistedExpressions,
isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator,
receiverType: receiverType,
@@ -2234,7 +2164,7 @@
isImplicitExtensionMember: isImplicitExtensionMember);
}
return _inferInvocation(
- typeContext, offset, calleeType, arguments, hoistedExpressions,
+ visitor, typeContext, offset, calleeType, arguments, hoistedExpressions,
isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator,
receiverType: receiverType,
@@ -2247,6 +2177,7 @@
}
InvocationInferenceResult _inferGenericExtensionMethodInvocation(
+ InferenceVisitor visitor,
int extensionTypeParameterCount,
DartType typeContext,
int offset,
@@ -2272,8 +2203,8 @@
ArgumentsImpl extensionArguments = engine.forest.createArguments(
arguments.fileOffset, [arguments.positional.first],
types: getExplicitExtensionTypeArguments(arguments));
- _inferInvocation(const UnknownType(), offset, extensionFunctionType,
- extensionArguments, hoistedExpressions,
+ _inferInvocation(visitor, const UnknownType(), offset,
+ extensionFunctionType, extensionArguments, hoistedExpressions,
skipTypeArgumentInference: skipTypeArgumentInference,
receiverType: receiverType,
isImplicitExtensionMember: isImplicitExtensionMember,
@@ -2300,8 +2231,8 @@
ArgumentsImpl targetArguments = engine.forest.createArguments(
arguments.fileOffset, arguments.positional.skip(1).toList(),
named: arguments.named, types: getExplicitTypeArguments(arguments));
- InvocationInferenceResult result = _inferInvocation(typeContext, offset,
- targetFunctionType, targetArguments, hoistedExpressions,
+ InvocationInferenceResult result = _inferInvocation(visitor, typeContext,
+ offset, targetFunctionType, targetArguments, hoistedExpressions,
isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator,
skipTypeArgumentInference: skipTypeArgumentInference,
@@ -2324,6 +2255,7 @@
/// Performs the type inference steps that are shared by all kinds of
/// invocations (constructors, instance methods, and static methods).
InvocationInferenceResult _inferInvocation(
+ InferenceVisitor visitor,
DartType typeContext,
int offset,
FunctionType calleeType,
@@ -2491,7 +2423,7 @@
isNonNullableByDefault: isNonNullableByDefault);
}
}
- return inferExpression(
+ return visitor.inferExpression(
argumentExpression,
isNonNullableByDefault
? inferredFormalType
@@ -2813,8 +2745,12 @@
inferredReceiverType: receiverType);
}
- FunctionType inferLocalFunction(FunctionNode function, DartType? typeContext,
- int fileOffset, DartType? returnContext) {
+ FunctionType inferLocalFunction(
+ InferenceVisitor visitor,
+ FunctionNode function,
+ DartType? typeContext,
+ int fileOffset,
+ DartType? returnContext) {
bool hasImplicitReturnType = false;
if (returnContext == null) {
hasImplicitReturnType = true;
@@ -2827,9 +2763,9 @@
for (int i = 0; i < positionalParameters.length; i++) {
VariableDeclaration parameter = positionalParameters[i];
flowAnalysis.declare(parameter, true);
- inferMetadataKeepingHelper(parameter, parameter.annotations);
+ inferMetadataKeepingHelper(visitor, parameter, parameter.annotations);
if (parameter.initializer != null) {
- ExpressionInferenceResult initializerResult = inferExpression(
+ ExpressionInferenceResult initializerResult = visitor.inferExpression(
parameter.initializer!, parameter.type, !isTopLevel);
parameter.initializer = initializerResult.expression
..parent = parameter;
@@ -2837,8 +2773,8 @@
}
for (VariableDeclaration parameter in function.namedParameters) {
flowAnalysis.declare(parameter, true);
- inferMetadataKeepingHelper(parameter, parameter.annotations);
- ExpressionInferenceResult initializerResult = inferExpression(
+ inferMetadataKeepingHelper(visitor, parameter, parameter.annotations);
+ ExpressionInferenceResult initializerResult = visitor.inferExpression(
parameter.initializer!, parameter.type, !isTopLevel);
parameter.initializer = initializerResult.expression
..parent = parameter;
@@ -2981,7 +2917,8 @@
ClosureContext closureContext = new ClosureContext(
this, function.asyncMarker, returnContext, needToSetReturnType);
this.closureContext = closureContext;
- StatementInferenceResult bodyResult = inferStatement(function.body!);
+ StatementInferenceResult bodyResult =
+ visitor.inferStatement(function.body!);
// If the closure is declared with `async*` or `sync*`, let `M` be the
// least upper bound of the types of the `yield` expressions in `B’`, or
@@ -3022,17 +2959,17 @@
// inference and use `_helper = helper` instead of `this.helper = helper`
// because inference on metadata requires the helper.
_helper = helper;
- inferMetadataKeepingHelper(parent, annotations);
+ InferenceVisitor visitor = _createInferenceVisitor();
+ inferMetadataKeepingHelper(visitor, parent, annotations);
_helper = null;
}
}
- @override
- void inferMetadataKeepingHelper(
- TreeNode? parent, List<Expression>? annotations) {
+ void inferMetadataKeepingHelper(InferenceVisitor visitor, TreeNode? parent,
+ List<Expression>? annotations) {
if (annotations != null) {
for (int index = 0; index < annotations.length; index++) {
- ExpressionInferenceResult result = inferExpression(
+ ExpressionInferenceResult result = visitor.inferExpression(
annotations[index], const UnknownType(), !isTopLevel);
annotations[index] = result.expression..parent = parent;
}
@@ -3059,6 +2996,7 @@
}
ExpressionInferenceResult _inferDynamicInvocation(
+ InferenceVisitor visitor,
int fileOffset,
Link<NullAwareGuard> nullAwareGuards,
Expression receiver,
@@ -3070,7 +3008,7 @@
// ignore: unnecessary_null_comparison
assert(isImplicitCall != null);
InvocationInferenceResult result = inferInvocation(
- typeContext, fileOffset, unknownFunction, arguments,
+ visitor, typeContext, fileOffset, unknownFunction, arguments,
hoistedExpressions: hoistedExpressions,
receiverType: const DynamicType(),
isImplicitCall: isImplicitCall);
@@ -3083,6 +3021,7 @@
}
ExpressionInferenceResult _inferNeverInvocation(
+ InferenceVisitor visitor,
int fileOffset,
Link<NullAwareGuard> nullAwareGuards,
Expression receiver,
@@ -3095,7 +3034,7 @@
// ignore: unnecessary_null_comparison
assert(isImplicitCall != null);
InvocationInferenceResult result = inferInvocation(
- typeContext, fileOffset, unknownFunction, arguments,
+ visitor, typeContext, fileOffset, unknownFunction, arguments,
hoistedExpressions: hoistedExpressions,
receiverType: receiverType,
isImplicitCall: isImplicitCall);
@@ -3110,6 +3049,7 @@
}
ExpressionInferenceResult _inferMissingInvocation(
+ InferenceVisitor visitor,
int fileOffset,
Link<NullAwareGuard> nullAwareGuards,
Expression receiver,
@@ -3134,7 +3074,7 @@
extensionAccessCandidates:
target.isAmbiguous ? target.candidates : null);
InvocationInferenceResult inferenceResult = inferInvocation(
- typeContext, fileOffset, unknownFunction, arguments,
+ visitor, typeContext, fileOffset, unknownFunction, arguments,
hoistedExpressions: hoistedExpressions,
receiverType: receiverType,
isImplicitCall: isExpressionInvocation || isImplicitCall);
@@ -3146,6 +3086,7 @@
}
ExpressionInferenceResult _inferExtensionInvocation(
+ InferenceVisitor visitor,
int fileOffset,
Link<NullAwareGuard> nullAwareGuards,
Expression receiver,
@@ -3166,6 +3107,7 @@
StaticInvocation staticInvocation = transformExtensionMethodInvocation(
fileOffset, target, receiver, new Arguments.empty());
ExpressionInferenceResult result = inferMethodInvocation(
+ visitor,
fileOffset,
nullAwareGuards,
staticInvocation,
@@ -3203,7 +3145,7 @@
} else {
StaticInvocation staticInvocation = transformExtensionMethodInvocation(
fileOffset, target, receiver, arguments);
- InvocationInferenceResult result = inferInvocation(typeContext,
+ InvocationInferenceResult result = inferInvocation(visitor, typeContext,
fileOffset, functionType, staticInvocation.arguments as ArgumentsImpl,
hoistedExpressions: hoistedExpressions,
receiverType: receiverType,
@@ -3259,6 +3201,7 @@
}
ExpressionInferenceResult _inferFunctionInvocation(
+ InferenceVisitor visitor,
int fileOffset,
Link<NullAwareGuard> nullAwareGuards,
Expression receiver,
@@ -3273,7 +3216,7 @@
assert(target.isCallFunction || target.isNullableCallFunction);
FunctionType declaredFunctionType = getFunctionType(target, receiverType);
InvocationInferenceResult result = inferInvocation(
- typeContext, fileOffset, declaredFunctionType, arguments,
+ visitor, typeContext, fileOffset, declaredFunctionType, arguments,
hoistedExpressions: hoistedExpressions,
receiverType: receiverType,
isImplicitCall: isImplicitCall);
@@ -3362,6 +3305,7 @@
}
ExpressionInferenceResult _inferInstanceMethodInvocation(
+ InferenceVisitor visitor,
int fileOffset,
Link<NullAwareGuard> nullAwareGuards,
Expression receiver,
@@ -3417,8 +3361,8 @@
method.enclosingClass!, method.function.returnType)) {
contravariantCheck = true;
}
- InvocationInferenceResult result = inferInvocation(typeContext, fileOffset,
- declaredFunctionType, arguments as ArgumentsImpl,
+ InvocationInferenceResult result = inferInvocation(visitor, typeContext,
+ fileOffset, declaredFunctionType, arguments as ArgumentsImpl,
hoistedExpressions: hoistedExpressions,
receiverType: receiverType,
isImplicitCall: isImplicitCall,
@@ -3528,6 +3472,7 @@
}
ExpressionInferenceResult _inferInstanceGetterInvocation(
+ InferenceVisitor visitor,
int fileOffset,
Link<NullAwareGuard> nullAwareGuards,
Expression receiver,
@@ -3637,6 +3582,7 @@
}
ExpressionInferenceResult invocationResult = inferMethodInvocation(
+ visitor,
arguments.fileOffset,
const Link<NullAwareGuard>(),
propertyGet,
@@ -3738,6 +3684,7 @@
}
ExpressionInferenceResult _inferInstanceFieldInvocation(
+ InferenceVisitor visitor,
int fileOffset,
Link<NullAwareGuard> nullAwareGuards,
Expression receiver,
@@ -3834,6 +3781,7 @@
}
ExpressionInferenceResult invocationResult = inferMethodInvocation(
+ visitor,
arguments.fileOffset,
const Link<NullAwareGuard>(),
propertyGet,
@@ -3913,6 +3861,7 @@
/// Performs the core type inference algorithm for method invocations.
ExpressionInferenceResult inferMethodInvocation(
+ InferenceVisitor visitor,
int fileOffset,
Link<NullAwareGuard> nullAwareGuards,
Expression receiver,
@@ -3943,6 +3892,7 @@
if (member is Procedure) {
if (member.kind == ProcedureKind.Getter) {
return _inferInstanceGetterInvocation(
+ visitor,
fileOffset,
nullAwareGuards,
receiver,
@@ -3957,6 +3907,7 @@
isSpecialCasedBinaryOperatorForReceiverType(
target, receiverType);
return _inferInstanceMethodInvocation(
+ visitor,
fileOffset,
nullAwareGuards,
receiver,
@@ -3972,6 +3923,7 @@
}
} else {
return _inferInstanceFieldInvocation(
+ visitor,
fileOffset,
nullAwareGuards,
receiver,
@@ -3984,12 +3936,21 @@
}
case ObjectAccessTargetKind.callFunction:
case ObjectAccessTargetKind.nullableCallFunction:
- return _inferFunctionInvocation(fileOffset, nullAwareGuards, receiver,
- receiverType, target, arguments, typeContext, hoistedExpressions,
+ return _inferFunctionInvocation(
+ visitor,
+ fileOffset,
+ nullAwareGuards,
+ receiver,
+ receiverType,
+ target,
+ arguments,
+ typeContext,
+ hoistedExpressions,
isImplicitCall: isImplicitCall);
case ObjectAccessTargetKind.extensionMember:
case ObjectAccessTargetKind.nullableExtensionMember:
return _inferExtensionInvocation(
+ visitor,
fileOffset,
nullAwareGuards,
receiver,
@@ -4003,6 +3964,7 @@
case ObjectAccessTargetKind.ambiguous:
case ObjectAccessTargetKind.missing:
return _inferMissingInvocation(
+ visitor,
fileOffset,
nullAwareGuards,
receiver,
@@ -4017,11 +3979,12 @@
implicitInvocationPropertyName: implicitInvocationPropertyName);
case ObjectAccessTargetKind.dynamic:
case ObjectAccessTargetKind.invalid:
- return _inferDynamicInvocation(fileOffset, nullAwareGuards, receiver,
- name, arguments, typeContext, hoistedExpressions,
+ return _inferDynamicInvocation(visitor, fileOffset, nullAwareGuards,
+ receiver, name, arguments, typeContext, hoistedExpressions,
isImplicitCall: isExpressionInvocation || isImplicitCall);
case ObjectAccessTargetKind.never:
return _inferNeverInvocation(
+ visitor,
fileOffset,
nullAwareGuards,
receiver,
@@ -4132,6 +4095,7 @@
/// Performs the core type inference algorithm for super method invocations.
ExpressionInferenceResult inferSuperMethodInvocation(
+ InferenceVisitor visitor,
Expression expression,
Name methodName,
ArgumentsImpl arguments,
@@ -4164,7 +4128,7 @@
], functionType.returnType, functionType.declaredNullability);
}
InvocationInferenceResult result = inferInvocation(
- typeContext, fileOffset, functionType, arguments,
+ visitor, typeContext, fileOffset, functionType, arguments,
isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
receiverType: receiverType,
isImplicitExtensionMember: false);
@@ -4189,8 +4153,9 @@
this.helper = helper;
// ignore: unnecessary_null_comparison
assert(declaredType != null);
+ InferenceVisitor visitor = _createInferenceVisitor();
ExpressionInferenceResult result =
- inferExpression(initializer, declaredType, true);
+ visitor.inferExpression(initializer, declaredType, true);
if (hasDeclaredInitializer) {
initializer = ensureAssignableResult(declaredType, result).expression;
}
@@ -4219,23 +4184,6 @@
return new ExpressionInferenceResult(inferredType, expression);
}
- /// Performs type inference on the given [statement].
- ///
- /// Derived classes should override this method with logic that dispatches on
- /// the statement type and calls the appropriate specialized "infer" method.
- StatementInferenceResult inferStatement(Statement statement) {
- registerIfUnreachableForTesting(statement);
-
- // For full (non-top level) inference, we need access to the
- // ExpressionGeneratorHelper so that we can perform error recovery.
- InferenceVisitor visitor = new InferenceVisitor(this);
- if (statement is InternalStatement) {
- return statement.acceptInference(visitor);
- } else {
- return statement.accept(visitor);
- }
- }
-
/// Computes the implicit instantiation from an expression of [tearOffType]
/// to the [context] type. Return `null` if an implicit instantiation is not
/// necessary or possible.
@@ -4950,13 +4898,9 @@
}
@override
- ExpressionInferenceResult inferExpression(
- Expression expression, DartType typeContext, bool typeNeeded,
- {bool isVoidAllowed = false, bool forEffect = false}) {
- benchmarker.beginSubdivide(BenchmarkSubdivides.inferExpression);
- ExpressionInferenceResult result = impl.inferExpression(
- expression, typeContext, typeNeeded,
- isVoidAllowed: isVoidAllowed, forEffect: forEffect);
+ DartType inferImplicitFieldType(Expression initializer) {
+ benchmarker.beginSubdivide(BenchmarkSubdivides.inferImplicitFieldType);
+ DartType result = impl.inferImplicitFieldType(initializer);
benchmarker.endSubdivide();
return result;
}
@@ -5000,14 +4944,6 @@
}
@override
- void inferMetadataKeepingHelper(
- TreeNode parent, List<Expression> annotations) {
- benchmarker.beginSubdivide(BenchmarkSubdivides.inferMetadataKeepingHelper);
- impl.inferMetadataKeepingHelper(parent, annotations);
- benchmarker.endSubdivide();
- }
-
- @override
Expression inferParameterInitializer(
InferenceHelper helper,
Expression initializer,
@@ -5021,44 +4957,28 @@
}
@override
- InvocationInferenceResult inferInvocation(DartType typeContext, int offset,
- FunctionType calleeType, ArgumentsImpl arguments,
- {List<VariableDeclaration>? hoistedExpressions,
- bool isSpecialCasedBinaryOperator = false,
- bool isSpecialCasedTernaryOperator = false,
- DartType? receiverType,
- bool skipTypeArgumentInference = false,
- bool isConst = false,
- bool isImplicitExtensionMember = false,
- bool isImplicitCall = false,
- Member? staticTarget,
- bool isExtensionMemberInvocation = false}) {
- benchmarker.beginSubdivide(BenchmarkSubdivides.inferInvocation);
- InvocationInferenceResult result = impl.inferInvocation(
- typeContext,
- offset,
- calleeType,
- arguments,
- hoistedExpressions: hoistedExpressions,
- isSpecialCasedBinaryOperator: isSpecialCasedBinaryOperator,
- isSpecialCasedTernaryOperator: isSpecialCasedTernaryOperator,
- receiverType: receiverType,
- skipTypeArgumentInference: skipTypeArgumentInference,
- isConst: isConst,
- isImplicitExtensionMember: isImplicitExtensionMember,
- isImplicitCall: isImplicitCall,
- staticTarget: staticTarget,
- isExtensionMemberInvocation: isExtensionMemberInvocation,
- );
+ List<DartType>? inferRedirectingFactoryTypeArguments(
+ InferenceHelper helper,
+ DartType typeContext,
+ FunctionNode redirectingFactoryFunction,
+ int fileOffset,
+ Member target,
+ FunctionType targetType) {
+ benchmarker.beginSubdivide(
+ BenchmarkSubdivides.inferRedirectingFactoryTypeArguments);
+ List<DartType>? result = impl.inferRedirectingFactoryTypeArguments(
+ helper,
+ typeContext,
+ redirectingFactoryFunction,
+ fileOffset,
+ target,
+ targetType);
benchmarker.endSubdivide();
return result;
}
@override
InferenceHelper get helper => impl.helper;
-
- @override
- void set helper(InferenceHelper helper) => impl.helper = helper;
}
abstract class MixinInferrer {
diff --git a/tools/VERSION b/tools/VERSION
index db41934..1b33d07 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 18
PATCH 0
-PRERELEASE 187
+PRERELEASE 188
PRERELEASE_PATCH 0
\ No newline at end of file