Make ResolutionStorer implement the Factory API.

Change-Id: I9cf78ef8b595e845a6e47fb30cbce162f45dc91d
Reviewed-on: https://dart-review.googlesource.com/61420
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Paul Berry <paulberry@google.com>
This commit is contained in:
Paul Berry 2018-06-21 13:22:34 +00:00 committed by commit-bot@chromium.org
parent e2ce88dfcc
commit ee19f2804a
4 changed files with 524 additions and 221 deletions

View file

@ -3,8 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/src/fasta/resolution_applier.dart';
import 'package:front_end/src/fasta/kernel/factory.dart';
import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart';
import 'package:front_end/src/fasta/type_inference/type_inference_listener.dart';
import 'package:front_end/src/scanner/token.dart';
import 'package:kernel/ast.dart';
import 'package:kernel/type_algebra.dart';
@ -39,7 +41,10 @@ class ResolutionData<Type, Declaration, Reference, PrefixInfo> {
/// Type inference listener that records inferred types for later use by
/// [ResolutionApplier].
class ResolutionStorer extends _ResolutionStorer<int, int, Node, int> {
class ResolutionStorer extends _ResolutionStorer<int, int, Node, int>
implements
TypeInferenceListener<int, int, Node, int>,
Factory<void, void, void, void> {
ResolutionStorer(Map<int, ResolutionData<DartType, int, Node, int>> data)
: super(data);
}
@ -48,9 +53,7 @@ class ResolutionStorer extends _ResolutionStorer<int, int, Node, int> {
/// accidentally peeking into kernel internals.
///
/// TODO(paulberry): when the time is right, fuse this with [ResolutionStorer].
class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
implements
TypeInferenceListener<Location, Declaration, Reference, PrefixInfo> {
class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo> {
final Map<Location,
ResolutionData<DartType, Declaration, Reference, PrefixInfo>> _data;
@ -92,35 +95,51 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
_data.remove(location) == null;
}
@override
void asExpression(
ExpressionJudgment judgment, Location location, DartType inferredType) {
ExpressionJudgment judgment,
Location location,
void expression,
Token asOperator,
void literalType,
DartType inferredType) {
_store(location, literalType: inferredType, inferredType: inferredType);
}
@override
void assertInitializer(InitializerJudgment judgment, Location location) {}
void assertInitializer(
InitializerJudgment judgment,
Location location,
Token assertKeyword,
Token leftParenthesis,
void condition,
Token comma,
void message,
Token rightParenthesis) {}
@override
void assertStatement(StatementJudgment judgment, Location location) {}
void assertStatement(
StatementJudgment judgment,
Location location,
Token assertKeyword,
Token leftParenthesis,
void condition,
Token comma,
void message,
Token rightParenthesis,
Token semicolon) {}
@override
void awaitExpression(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
Token awaitKeyword, void expression, DartType inferredType) =>
genericExpression("awaitExpression", location, inferredType);
@override
void block(StatementJudgment judgment, Location location) {}
void block(StatementJudgment judgment, Location location, Token leftBracket,
List<void> statements, Token rightBracket) {}
@override
void boolLiteral(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
Token literal, bool value, DartType inferredType) =>
genericExpression("boolLiteral", location, inferredType);
@override
void breakStatement(StatementJudgment judgment, Location location) {}
void breakStatement(StatementJudgment judgment, Location location,
Token breakKeyword, void label, Token semicolon) {}
@override
void cascadeExpression(
ExpressionJudgment judgment, Location location, DartType inferredType) {
// Overridden so that the type of the expression will not be recorded. We
@ -129,10 +148,18 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
// correctly apply the type even if we recorded it.
}
@override
void catchStatement(
Catch judgment,
Location location,
Token onKeyword,
void type,
Token catchKeyword,
Token leftParenthesis,
Token exceptionParameter,
Token comma,
Token stackTraceParameter,
Token rightParenthesis,
void body,
DartType guardType,
Location exceptionLocation,
DartType exceptionType,
@ -149,12 +176,17 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
}
}
@override
void conditionalExpression(ExpressionJudgment judgment, Location location,
void conditionalExpression(
ExpressionJudgment judgment,
Location location,
void condition,
Token question,
void thenExpression,
Token colon,
void elseExpression,
DartType inferredType) =>
genericExpression("conditionalExpression", location, inferredType);
@override
void constructorInvocation(ExpressionJudgment judgment, Location location,
Reference expressionTarget, DartType inferredType) {
// A class reference may have already been stored at this location by
@ -164,32 +196,46 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
_store(location, inferredType: inferredType, reference: expressionTarget);
}
@override
void continueSwitchStatement(StatementJudgment judgment, Location location) {}
void continueStatement(StatementJudgment judgment, Location location,
Token continueKeyword, void label, Token semicolon) {}
void continueSwitchStatement(StatementJudgment judgment, Location location,
Token continueKeyword, void label, Token semicolon) {}
@override
void deferredCheck(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
genericExpression("deferredCheck", location, inferredType);
@override
void doStatement(StatementJudgment judgment, Location location) {}
void doStatement(
StatementJudgment judgment,
Location location,
Token doKeyword,
void body,
Token whileKeyword,
Token leftParenthesis,
void condition,
Token rightParenthesis,
Token semicolon) {}
@override
void doubleLiteral(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
Token literal, double value, DartType inferredType) =>
genericExpression("doubleLiteral", location, inferredType);
@override
void expressionStatement(StatementJudgment judgment, Location location) {}
void expressionStatement(StatementJudgment judgment, Location location,
void expression, Token semicolon) {}
@override
void fieldInitializer(InitializerJudgment judgment, Location location,
void fieldInitializer(
InitializerJudgment judgment,
Location location,
Token thisKeyword,
Token period,
Token fieldName,
Token equals,
void expression,
Reference initializerField) {
_store(location, reference: initializerField);
}
@override
void forInStatement(
StatementJudgment judgment,
Location location,
@ -214,16 +260,13 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
}
}
@override
void forStatement(StatementJudgment judgment, Location location) {}
@override
void functionDeclaration(StatementJudgment judgment, Location location,
FunctionType inferredType) {
_store(location, inferredType: inferredType);
}
@override
void functionExpression(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
genericExpression("functionExpression", location, inferredType);
@ -233,76 +276,89 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
_store(location, inferredType: inferredType);
}
@override
void ifNull(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
void ifNull(ExpressionJudgment judgment, Location location, void leftOperand,
Token operator, void rightOperand, DartType inferredType) =>
genericExpression('ifNull', location, inferredType);
@override
void ifStatement(StatementJudgment judgment, Location location) {}
void ifStatement(
StatementJudgment judgment,
Location location,
Token ifKeyword,
Token leftParenthesis,
void condition,
Token rightParenthesis,
void thenStatement,
Token elseKeyword,
void elseStatement) {}
@override
void intLiteral(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
void intLiteral(ExpressionJudgment judgment, Location location, Token literal,
num value, DartType inferredType) =>
genericExpression("intLiteral", location, inferredType);
@override
void invalidInitializer(InitializerJudgment judgment, Location location) {}
@override
void labeledStatement(StatementJudgment judgment, Location location) {}
@override
void listLiteral(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
genericExpression("listLiteral", location, inferredType);
@override
void logicalExpression(ExpressionJudgment judgment, Location location,
void logicalExpression(
ExpressionJudgment judgment,
Location location,
void leftOperand,
Token operator,
void rightOperand,
DartType inferredType) =>
genericExpression("logicalExpression", location, inferredType);
@override
void mapLiteral(ExpressionJudgment judgment, Location location,
DartType typeContext) =>
genericExpression("mapLiteral", location, typeContext);
@override
void namedFunctionExpression(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
genericExpression("namedFunctionExpression", location, inferredType);
@override
void not(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
void not(ExpressionJudgment judgment, Location location, Token operator,
void operand, DartType inferredType) =>
genericExpression("not", location, inferredType);
@override
void nullLiteral(ExpressionJudgment judgment, Location location,
bool isSynthetic, DartType inferredType) {
Token literal, bool isSynthetic, DartType inferredType) {
if (isSynthetic) return null;
genericExpression("nullLiteral", location, inferredType);
}
@override
void indexAssign(ExpressionJudgment judgment, Location location,
Reference writeMember, Reference combiner, DartType inferredType) {
_store(location,
reference: writeMember, inferredType: inferredType, combiner: combiner);
}
@override
void isExpression(ExpressionJudgment judgment, Location location,
DartType testedType, DartType inferredType) {
void isExpression(
ExpressionJudgment judgment,
Location location,
void expression,
Token isOperator,
void literalType,
DartType testedType,
DartType inferredType) {
_store(location, literalType: testedType, inferredType: inferredType);
}
void isNotExpression(ExpressionJudgment judgment, Location location,
DartType type, DartType inferredType) {
void isNotExpression(
ExpressionJudgment judgment,
Location location,
void expression,
Token isOperator,
Token notOperator,
void literalType,
DartType type,
DartType inferredType) {
_store(location, literalType: type, inferredType: inferredType);
}
@override
void methodInvocation(
ExpressionJudgment judgment,
Location resultOffset,
@ -324,7 +380,6 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
reference: interfaceMember);
}
@override
void methodInvocationCall(
ExpressionJudgment judgment,
Location resultOffset,
@ -344,7 +399,6 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
isImplicitCall: isImplicitCall);
}
@override
void propertyAssign(
ExpressionJudgment judgment,
Location location,
@ -360,38 +414,38 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
inferredType: inferredType);
}
@override
void propertySet(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
genericExpression("propertySet", location, inferredType);
@override
void propertyGet(ExpressionJudgment judgment, Location location,
Reference member, DartType inferredType) {
_store(location, reference: member, inferredType: inferredType);
}
@override
void propertyGetCall(
ExpressionJudgment judgment, Location location, DartType inferredType) {
_store(location, isExplicitCall: true);
}
@override
void redirectingInitializer(InitializerJudgment judgment, Location location,
void redirectingInitializer(
InitializerJudgment judgment,
Location location,
Token thisKeyword,
Token period,
Token constructorName,
covariant Object argumentList,
Reference initializerTarget) {
_store(location, reference: initializerTarget);
}
@override
void rethrow_(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
Token rethrowKeyword, DartType inferredType) =>
genericExpression('rethrow', location, inferredType);
@override
void returnStatement(StatementJudgment judgment, Location location) {}
void returnStatement(StatementJudgment judgment, Location location,
Token returnKeyword, void expression, Token semicolon) {}
@override
void staticAssign(
ExpressionJudgment judgment,
Location location,
@ -407,13 +461,11 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
inferredType: inferredType);
}
@override
void staticGet(ExpressionJudgment judgment, Location location,
Reference expressionTarget, DartType inferredType) {
_store(location, reference: expressionTarget, inferredType: inferredType);
}
@override
void staticInvocation(
ExpressionJudgment judgment,
Location location,
@ -432,42 +484,44 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
inferredType: inferredType);
}
@override
void stringConcatenation(
ExpressionJudgment judgment, Location location, DartType inferredType) {
// We don't need the type - we already know that it is String.
// Moreover, the file offset for StringConcatenation is `-1`.
}
@override
void stringLiteral(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
Token literal, String value, DartType inferredType) =>
genericExpression("StringLiteral", location, inferredType);
@override
void superInitializer(InitializerJudgment judgment, Location location) {}
void superInitializer(
InitializerJudgment judgment,
Location location,
Token superKeyword,
Token period,
Token constructorName,
covariant Object argumentList) {}
@override
void switchStatement(StatementJudgment judgment, Location location) {}
@override
void symbolLiteral(ExpressionJudgment judgment, Location location,
void symbolLiteral(
ExpressionJudgment judgment,
Location location,
Token poundSign,
List<Token> components,
String value,
DartType inferredType) =>
genericExpression("symbolLiteral", location, inferredType);
@override
void thisExpression(
ExpressionJudgment judgment, Location location, DartType inferredType) {}
void thisExpression(ExpressionJudgment judgment, Location location,
Token thisKeyword, DartType inferredType) {}
@override
void throw_(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
Token throwKeyword, void expression, DartType inferredType) =>
genericExpression('throw', location, inferredType);
@override
void tryCatch(StatementJudgment judgment, Location location) {}
@override
void tryFinally(StatementJudgment judgment, Location location) {}
void typeLiteral(ExpressionJudgment judgment, Location location,
@ -475,7 +529,6 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
_store(location, reference: expressionType, inferredType: inferredType);
}
@override
void variableAssign(
ExpressionJudgment judgment,
Location location,
@ -491,13 +544,11 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
inferredType: inferredType);
}
@override
void variableDeclaration(StatementJudgment judgment, Location location,
DartType statementType, DartType inferredType) {
_store(location, literalType: statementType, inferredType: inferredType);
}
@override
void variableGet(ExpressionJudgment judgment, Location location,
bool isInCascade, Declaration expressionVariable, DartType inferredType) {
if (isInCascade) {
@ -507,23 +558,26 @@ class _ResolutionStorer<Location, Declaration, Reference, PrefixInfo>
declaration: expressionVariable, inferredType: inferredType);
}
@override
void variableSet(ExpressionJudgment judgment, Location location,
DartType inferredType) =>
genericExpression("variableSet", location, inferredType);
@override
void whileStatement(StatementJudgment judgment, Location location) {}
void whileStatement(
StatementJudgment judgment,
Location location,
Token whileKeyword,
Token leftParenthesis,
void condition,
Token rightParenthesis,
void body) {}
@override
void yieldStatement(StatementJudgment judgment, Location location) {}
void yieldStatement(StatementJudgment judgment, Location location,
Token yieldKeyword, Token star, void expression, Token semicolon) {}
@override
void storePrefixInfo(Location location, PrefixInfo prefixInfo) {
_store(location, prefixInfo: prefixInfo);
}
@override
void storeClassReference(
Location location, Reference reference, DartType rawType) {
// TODO(paulberry): would it be better to use literalType?

View file

@ -2,12 +2,12 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:front_end/src/scanner/token.dart' show Token;
import 'package:kernel/ast.dart' show Catch, DartType, FunctionType, Node;
import 'package:kernel/type_algebra.dart' show Substitution;
import '../../scanner/token.dart' show Token;
import 'kernel_shadow_ast.dart'
show ExpressionJudgment, InitializerJudgment, StatementJudgment;

View file

@ -170,7 +170,8 @@ class AsJudgment extends AsExpression implements ExpressionJudgment {
DartType typeContext) {
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
inferredType = type;
inferrer.listener.asExpression(this, fileOffset, inferredType);
inferrer.listener
.asExpression(this, fileOffset, null, null, null, inferredType);
return inferredType;
}
}
@ -187,7 +188,8 @@ class AssertInitializerJudgment extends AssertInitializer
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
inferrer.inferStatement(factory, judgment);
inferrer.listener.assertInitializer(this, fileOffset);
inferrer.listener.assertInitializer(
this, fileOffset, null, null, null, null, null, null);
}
}
@ -220,7 +222,8 @@ class AssertStatementJudgment extends AssertStatement
inferrer.inferExpression(
factory, messageJudgment, const UnknownType(), false);
}
inferrer.listener.assertStatement(this, fileOffset);
inferrer.listener.assertStatement(
this, fileOffset, null, null, null, null, null, null, null);
}
}
@ -244,7 +247,8 @@ class AwaitJudgment extends AwaitExpression implements ExpressionJudgment {
inferrer.inferExpression(factory, judgment, typeContext, true);
inferredType =
inferrer.typeSchemaEnvironment.unfutureType(judgment.inferredType);
inferrer.listener.awaitExpression(this, fileOffset, inferredType);
inferrer.listener
.awaitExpression(this, fileOffset, null, null, inferredType);
return inferredType;
}
}
@ -262,7 +266,7 @@ class BlockJudgment extends Block implements StatementJudgment {
for (var judgment in judgments) {
inferrer.inferStatement(factory, judgment);
}
inferrer.listener.block(this, fileOffset);
inferrer.listener.block(this, fileOffset, null, null, null);
}
}
@ -278,7 +282,7 @@ class BoolJudgment extends BoolLiteral implements ExpressionJudgment {
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.boolClass.rawType;
inferrer.listener.boolLiteral(this, fileOffset, inferredType);
inferrer.listener.boolLiteral(this, fileOffset, null, null, inferredType);
return inferredType;
}
}
@ -304,7 +308,7 @@ class ContinueJudgment extends BreakStatement implements StatementJudgment {
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
// No inference needs to be done.
inferrer.listener.breakStatement(this, fileOffset);
inferrer.listener.breakStatement(this, fileOffset, null, null, null);
}
}
@ -676,7 +680,8 @@ class ConditionalJudgment extends ConditionalExpression
if (inferrer.strongMode) {
staticType = inferredType;
}
inferrer.listener.conditionalExpression(this, fileOffset, inferredType);
inferrer.listener.conditionalExpression(
this, fileOffset, null, null, null, null, null, inferredType);
return inferredType;
}
}
@ -812,7 +817,8 @@ class ContinueSwitchJudgment extends ContinueSwitchStatement
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
// No inference needs to be done.
inferrer.listener.continueSwitchStatement(this, fileOffset);
inferrer.listener
.continueSwitchStatement(this, fileOffset, null, null, null);
}
}
@ -856,7 +862,8 @@ class DoJudgment extends DoStatement implements StatementJudgment {
factory, conditionJudgment, boolType, !inferrer.isTopLevel);
inferrer.ensureAssignable(boolType, conditionJudgment.inferredType,
condition, condition.fileOffset);
inferrer.listener.doStatement(this, fileOffset);
inferrer.listener.doStatement(
this, fileOffset, null, null, null, null, null, null, null);
}
}
@ -872,7 +879,7 @@ class DoubleJudgment extends DoubleLiteral implements ExpressionJudgment {
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.doubleClass.rawType;
inferrer.listener.doubleLiteral(this, fileOffset, inferredType);
inferrer.listener.doubleLiteral(this, fileOffset, null, null, inferredType);
return inferredType;
}
}
@ -913,7 +920,7 @@ class ExpressionStatementJudgment extends ExpressionStatement
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
inferrer.listener.expressionStatement(this, fileOffset);
inferrer.listener.expressionStatement(this, fileOffset, null, null);
}
}
@ -1039,7 +1046,8 @@ class ShadowFieldInitializer extends FieldInitializer
var initializerType =
inferrer.inferExpression(factory, value, field.type, true);
inferrer.ensureAssignable(field.type, initializerType, value, fileOffset);
inferrer.listener.fieldInitializer(this, fileOffset, field);
inferrer.listener.fieldInitializer(
this, fileOffset, null, null, null, null, null, field);
}
}
@ -1306,7 +1314,7 @@ class ShadowIfNullExpression extends Let implements ExpressionJudgment {
if (inferrer.strongMode) {
body.staticType = inferredType;
}
inferrer.listener.ifNull(this, fileOffset, inferredType);
inferrer.listener.ifNull(this, fileOffset, null, null, null, inferredType);
return inferredType;
}
}
@ -1336,7 +1344,8 @@ class IfJudgment extends IfStatement implements StatementJudgment {
if (otherwiseJudgment != null) {
inferrer.inferStatement(factory, otherwiseJudgment);
}
inferrer.listener.ifStatement(this, fileOffset);
inferrer.listener.ifStatement(
this, fileOffset, null, null, null, null, null, null, null);
}
}
@ -1480,7 +1489,7 @@ class IntJudgment extends IntLiteral implements ExpressionJudgment {
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.intClass.rawType;
inferrer.listener.intLiteral(this, fileOffset, inferredType);
inferrer.listener.intLiteral(this, fileOffset, null, null, inferredType);
return inferredType;
}
}
@ -1515,7 +1524,8 @@ class IsJudgment extends IsExpression implements ExpressionJudgment {
DartType typeContext) {
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
inferredType = inferrer.coreTypes.boolClass.rawType;
inferrer.listener.isExpression(this, fileOffset, type, inferredType);
inferrer.listener
.isExpression(this, fileOffset, null, null, null, type, inferredType);
return inferredType;
}
}
@ -1541,8 +1551,8 @@ class IsNotJudgment extends Not implements ExpressionJudgment {
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
inferredType = inferrer.coreTypes.boolClass.rawType;
inferrer.listener
.isNotExpression(this, fileOffset, isExpression.type, inferredType);
inferrer.listener.isNotExpression(this, fileOffset, null, null, null, null,
isExpression.type, inferredType);
return inferredType;
}
}
@ -1658,7 +1668,8 @@ class ShadowLogicalExpression extends LogicalExpression
inferrer.ensureAssignable(boolType, leftType, left, left.fileOffset);
inferrer.ensureAssignable(boolType, rightType, right, right.fileOffset);
var inferredType = boolType;
inferrer.listener.logicalExpression(this, fileOffset, inferredType);
inferrer.listener
.logicalExpression(this, fileOffset, null, null, null, inferredType);
return inferredType;
}
}
@ -1865,7 +1876,7 @@ class ShadowNot extends Not implements ExpressionJudgment {
factory, operand, boolType, !inferrer.isTopLevel);
inferrer.ensureAssignable(boolType, actualType, operand, fileOffset);
DartType inferredType = boolType;
inferrer.listener.not(this, fileOffset, inferredType);
inferrer.listener.not(this, fileOffset, null, null, inferredType);
return inferredType;
}
}
@ -1949,7 +1960,7 @@ class NullJudgment extends NullLiteral implements ExpressionJudgment {
DartType typeContext) {
inferredType = inferrer.coreTypes.nullClass.rawType;
inferrer.listener
.nullLiteral(this, fileOffset, fileOffset == -1, inferredType);
.nullLiteral(this, fileOffset, null, fileOffset == -1, inferredType);
return inferredType;
}
}
@ -2100,7 +2111,8 @@ class ShadowRedirectingInitializer extends RedirectingInitializer
target.function.functionType, target.enclosingClass.thisType, arguments,
skipTypeArgumentInference: true);
ArgumentsJudgment.removeNonInferrableArgumentTypes(arguments);
inferrer.listener.redirectingInitializer(this, fileOffset, target);
inferrer.listener.redirectingInitializer(
this, fileOffset, null, null, null, null, target);
}
}
@ -2114,7 +2126,7 @@ class ShadowRethrow extends Rethrow implements ExpressionJudgment {
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
var inferredType = const BottomType();
inferrer.listener.rethrow_(this, fileOffset, inferredType);
inferrer.listener.rethrow_(this, fileOffset, null, inferredType);
return inferredType;
}
}
@ -2148,7 +2160,7 @@ class ReturnJudgment extends ReturnStatement implements StatementJudgment {
closureContext.handleReturn(
inferrer, inferredType, expression, fileOffset);
}
inferrer.listener.returnStatement(this, fileOffset);
inferrer.listener.returnStatement(this, fileOffset, null, null, null);
}
}
@ -2294,7 +2306,7 @@ class ShadowStringLiteral extends StringLiteral implements ExpressionJudgment {
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
var inferredType = inferrer.coreTypes.stringClass.rawType;
inferrer.listener.stringLiteral(this, fileOffset, inferredType);
inferrer.listener.stringLiteral(this, fileOffset, null, null, inferredType);
return inferredType;
}
}
@ -2321,7 +2333,8 @@ class ShadowSuperInitializer extends SuperInitializer
inferrer.thisType,
arguments,
skipTypeArgumentInference: true);
inferrer.listener.superInitializer(this, fileOffset);
inferrer.listener
.superInitializer(this, fileOffset, null, null, null, null);
}
}
@ -2431,7 +2444,8 @@ class ShadowSymbolLiteral extends SymbolLiteral implements ExpressionJudgment {
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
var inferredType = inferrer.coreTypes.symbolClass.rawType;
inferrer.listener.symbolLiteral(this, fileOffset, inferredType);
inferrer.listener
.symbolLiteral(this, fileOffset, null, null, null, inferredType);
return inferredType;
}
}
@ -2513,7 +2527,7 @@ class ThisJudgment extends ThisExpression implements ExpressionJudgment {
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.thisType ?? const DynamicType();
inferrer.listener.thisExpression(this, fileOffset, inferredType);
inferrer.listener.thisExpression(this, fileOffset, null, inferredType);
return inferredType;
}
}
@ -2532,7 +2546,7 @@ class ThrowJudgment extends Throw implements ExpressionJudgment {
DartType typeContext) {
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
inferredType = const BottomType();
inferrer.listener.throw_(this, fileOffset, inferredType);
inferrer.listener.throw_(this, fileOffset, null, null, inferredType);
return inferredType;
}
}
@ -2568,6 +2582,15 @@ class TryCatchJudgment extends TryCatch implements StatementJudgment {
inferrer.listener.catchStatement(
catch_,
catch_.fileOffset,
null,
null,
null,
null,
null,
null,
null,
null,
null,
catch_.guard,
catch_.exceptionJudgment?.fileOffset,
catch_.exceptionJudgment?.type,
@ -3054,7 +3077,8 @@ class WhileJudgment extends WhileStatement implements StatementJudgment {
inferrer.ensureAssignable(expectedType, conditionJudgment.inferredType,
condition, condition.fileOffset);
inferrer.inferStatement(factory, bodyJudgment);
inferrer.listener.whileStatement(this, fileOffset);
inferrer.listener
.whileStatement(this, fileOffset, null, null, null, null, null);
}
}
@ -3086,7 +3110,7 @@ class YieldJudgment extends YieldStatement implements StatementJudgment {
}
closureContext.handleYield(
inferrer, isYieldStar, judgment.inferredType, expression, fileOffset);
inferrer.listener.yieldStatement(this, fileOffset);
inferrer.listener.yieldStatement(this, fileOffset, null, null, null, null);
}
}

View file

@ -6,6 +6,8 @@ import 'package:kernel/ast.dart' show Catch, DartType, FunctionType, Node;
import 'package:kernel/type_algebra.dart' show Substitution;
import '../../scanner/token.dart' show Token;
import '../kernel/kernel_shadow_ast.dart'
show ExpressionJudgment, InitializerJudgment, StatementJudgment;
@ -24,21 +26,45 @@ import '../kernel/kernel_shadow_ast.dart'
abstract class TypeInferenceListener<Location, Declaration, Reference,
PrefixInfo> {
void asExpression(
ExpressionJudgment judgment, Location location, DartType inferredType);
ExpressionJudgment judgment,
Location location,
void expression,
Token asOperator,
void literalType,
DartType inferredType);
void assertInitializer(InitializerJudgment judgment, Location location);
void assertInitializer(
InitializerJudgment judgment,
Location location,
Token assertKeyword,
Token leftParenthesis,
void condition,
Token comma,
void message,
Token rightParenthesis);
void assertStatement(StatementJudgment judgment, Location location);
void assertStatement(
StatementJudgment judgment,
Location location,
Token assertKeyword,
Token leftParenthesis,
void condition,
Token comma,
void message,
Token rightParenthesis,
Token semicolon);
void awaitExpression(
ExpressionJudgment judgment, Location location, DartType inferredType);
void awaitExpression(ExpressionJudgment judgment, Location location,
Token awaitKeyword, void expression, DartType inferredType);
void block(StatementJudgment judgment, Location location);
void block(StatementJudgment judgment, Location location, Token leftBracket,
List<void> statements, Token rightBracket);
void boolLiteral(
ExpressionJudgment judgment, Location location, DartType inferredType);
void boolLiteral(ExpressionJudgment judgment, Location location,
Token literal, bool value, DartType inferredType);
void breakStatement(StatementJudgment judgment, Location location);
void breakStatement(StatementJudgment judgment, Location location,
Token breakKeyword, void label, Token semicolon);
void cascadeExpression(
ExpressionJudgment judgment, Location location, DartType inferredType);
@ -46,6 +72,15 @@ abstract class TypeInferenceListener<Location, Declaration, Reference,
void catchStatement(
Catch judgment,
Location location,
Token onKeyword,
void type,
Token catchKeyword,
Token leftParenthesis,
Token exceptionParameter,
Token comma,
Token stackTraceParameter,
Token rightParenthesis,
void body,
DartType guardType,
Location exceptionLocation,
DartType exceptionType,
@ -53,24 +88,52 @@ abstract class TypeInferenceListener<Location, Declaration, Reference,
DartType stackTraceType);
void conditionalExpression(
ExpressionJudgment judgment, Location location, DartType inferredType);
ExpressionJudgment judgment,
Location location,
void condition,
Token question,
void thenExpression,
Token colon,
void elseExpression,
DartType inferredType);
void constructorInvocation(ExpressionJudgment judgment, Location location,
Reference expressionTarget, DartType inferredType);
void continueSwitchStatement(StatementJudgment judgment, Location location);
void continueStatement(StatementJudgment judgment, Location location,
Token continueKeyword, void label, Token semicolon);
void continueSwitchStatement(StatementJudgment judgment, Location location,
Token continueKeyword, void label, Token semicolon);
void deferredCheck(
ExpressionJudgment judgment, Location location, DartType inferredType);
void doStatement(StatementJudgment judgment, Location location);
void doStatement(
StatementJudgment judgment,
Location location,
Token doKeyword,
void body,
Token whileKeyword,
Token leftParenthesis,
void condition,
Token rightParenthesis,
Token semicolon);
void doubleLiteral(
ExpressionJudgment judgment, Location location, DartType inferredType);
void doubleLiteral(ExpressionJudgment judgment, Location location,
Token literal, double value, DartType inferredType);
void expressionStatement(StatementJudgment judgment, Location location);
void expressionStatement(StatementJudgment judgment, Location location,
void expression, Token semicolon);
void fieldInitializer(InitializerJudgment judgment, Location location,
void fieldInitializer(
InitializerJudgment judgment,
Location location,
Token thisKeyword,
Token period,
Token fieldName,
Token equals,
void expression,
Reference initializerField);
void forInStatement(
@ -91,24 +154,46 @@ abstract class TypeInferenceListener<Location, Declaration, Reference,
void functionExpression(
ExpressionJudgment judgment, Location location, DartType inferredType);
void ifNull(
ExpressionJudgment judgment, Location location, DartType inferredType);
void ifNull(ExpressionJudgment judgment, Location location, void leftOperand,
Token operator, void rightOperand, DartType inferredType);
void ifStatement(StatementJudgment judgment, Location location);
void ifStatement(
StatementJudgment judgment,
Location location,
Token ifKeyword,
Token leftParenthesis,
void condition,
Token rightParenthesis,
void thenStatement,
Token elseKeyword,
void elseStatement);
void indexAssign(ExpressionJudgment judgment, Location location,
Reference writeMember, Reference combiner, DartType inferredType);
void intLiteral(
ExpressionJudgment judgment, Location location, DartType inferredType);
void intLiteral(ExpressionJudgment judgment, Location location, Token literal,
num value, DartType inferredType);
void invalidInitializer(InitializerJudgment judgment, Location location);
void isExpression(ExpressionJudgment judgment, Location location,
DartType testedType, DartType inferredType);
void isExpression(
ExpressionJudgment judgment,
Location location,
void expression,
Token isOperator,
void literalType,
DartType testedType,
DartType inferredType);
void isNotExpression(ExpressionJudgment judgment, Location location,
DartType type, DartType inferredType);
void isNotExpression(
ExpressionJudgment judgment,
Location location,
void expression,
Token isOperator,
Token notOperator,
void literalType,
DartType type,
DartType inferredType);
void labeledStatement(StatementJudgment judgment, Location location);
@ -116,7 +201,12 @@ abstract class TypeInferenceListener<Location, Declaration, Reference,
ExpressionJudgment judgment, Location location, DartType inferredType);
void logicalExpression(
ExpressionJudgment judgment, Location location, DartType inferredType);
ExpressionJudgment judgment,
Location location,
void leftOperand,
Token operator,
void rightOperand,
DartType inferredType);
void mapLiteral(
ExpressionJudgment judgment, Location location, DartType typeContext);
@ -143,11 +233,11 @@ abstract class TypeInferenceListener<Location, Declaration, Reference,
void namedFunctionExpression(
ExpressionJudgment judgment, Location location, DartType inferredType);
void not(
ExpressionJudgment judgment, Location location, DartType inferredType);
void not(ExpressionJudgment judgment, Location location, Token operator,
void operand, DartType inferredType);
void nullLiteral(ExpressionJudgment judgment, Location location,
bool isSynthetic, DartType inferredType);
Token literal, bool isSynthetic, DartType inferredType);
void propertyAssign(
ExpressionJudgment judgment,
@ -166,13 +256,20 @@ abstract class TypeInferenceListener<Location, Declaration, Reference,
void propertySet(
ExpressionJudgment judgment, Location location, DartType inferredType);
void redirectingInitializer(InitializerJudgment judgment, Location location,
void redirectingInitializer(
InitializerJudgment judgment,
Location location,
Token thisKeyword,
Token period,
Token constructorName,
covariant Object argumentList,
Reference initializerTarget);
void rethrow_(
ExpressionJudgment judgment, Location location, DartType inferredType);
void rethrow_(ExpressionJudgment judgment, Location location,
Token rethrowKeyword, DartType inferredType);
void returnStatement(StatementJudgment judgment, Location location);
void returnStatement(StatementJudgment judgment, Location location,
Token returnKeyword, void expression, Token semicolon);
void staticAssign(
ExpressionJudgment judgment,
@ -197,21 +294,32 @@ abstract class TypeInferenceListener<Location, Declaration, Reference,
void stringConcatenation(
ExpressionJudgment judgment, Location location, DartType inferredType);
void stringLiteral(
ExpressionJudgment judgment, Location location, DartType inferredType);
void stringLiteral(ExpressionJudgment judgment, Location location,
Token literal, String value, DartType inferredType);
void superInitializer(InitializerJudgment judgment, Location location);
void superInitializer(
InitializerJudgment judgment,
Location location,
Token superKeyword,
Token period,
Token constructorName,
covariant Object argumentList);
void switchStatement(StatementJudgment judgment, Location location);
void symbolLiteral(
ExpressionJudgment judgment, Location location, DartType inferredType);
ExpressionJudgment judgment,
Location location,
Token poundSign,
List<Token> components,
String value,
DartType inferredType);
void thisExpression(
ExpressionJudgment judgment, Location location, DartType inferredType);
void thisExpression(ExpressionJudgment judgment, Location location,
Token thisKeyword, DartType inferredType);
void throw_(
ExpressionJudgment judgment, Location location, DartType inferredType);
void throw_(ExpressionJudgment judgment, Location location,
Token throwKeyword, void expression, DartType inferredType);
void tryCatch(StatementJudgment judgment, Location location);
@ -237,9 +345,17 @@ abstract class TypeInferenceListener<Location, Declaration, Reference,
void variableSet(
ExpressionJudgment judgment, Location location, DartType inferredType);
void whileStatement(StatementJudgment judgment, Location location);
void whileStatement(
StatementJudgment judgment,
Location location,
Token whileKeyword,
Token leftParenthesis,
void condition,
Token rightParenthesis,
void body);
void yieldStatement(StatementJudgment judgment, Location location);
void yieldStatement(StatementJudgment judgment, Location location,
Token yieldKeyword, Token star, void expression, Token semicolon);
void storePrefixInfo(Location location, PrefixInfo prefixInfo);
@ -253,28 +369,47 @@ abstract class TypeInferenceListener<Location, Declaration, Reference,
class KernelTypeInferenceListener
implements TypeInferenceListener<int, int, Node, int> {
@override
void asExpression(
ExpressionJudgment judgment, location, DartType inferredType) {}
void asExpression(ExpressionJudgment judgment, location, void expression,
Token asOperator, void literalType, DartType inferredType) {}
@override
void assertInitializer(InitializerJudgment judgment, location) {}
void assertInitializer(
InitializerJudgment judgment,
location,
Token assertKeyword,
Token leftParenthesis,
void condition,
Token comma,
void message,
Token rightParenthesis) {}
@override
void assertStatement(StatementJudgment judgment, location) {}
void assertStatement(
StatementJudgment judgment,
location,
Token assertKeyword,
Token leftParenthesis,
void condition,
Token comma,
void message,
Token rightParenthesis,
Token semicolon) {}
@override
void awaitExpression(
ExpressionJudgment judgment, location, DartType inferredType) {}
void awaitExpression(ExpressionJudgment judgment, location,
Token awaitKeyword, void expression, DartType inferredType) {}
@override
void block(StatementJudgment judgment, location) {}
void block(StatementJudgment judgment, location, Token leftBracket,
List<void> statements, Token rightBracket) {}
@override
void boolLiteral(
ExpressionJudgment judgment, location, DartType inferredType) {}
void boolLiteral(ExpressionJudgment judgment, location, Token literal,
bool value, DartType inferredType) {}
@override
void breakStatement(StatementJudgment judgment, location) {}
void breakStatement(StatementJudgment judgment, location, Token breakKeyword,
void label, Token semicolon) {}
@override
void cascadeExpression(
@ -284,6 +419,15 @@ class KernelTypeInferenceListener
void catchStatement(
Catch judgment,
location,
Token onKeyword,
void type,
Token catchKeyword,
Token leftParenthesis,
Token exceptionParameter,
Token comma,
Token stackTraceParameter,
Token rightParenthesis,
void body,
DartType guardType,
exceptionLocation,
DartType exceptionType,
@ -292,32 +436,61 @@ class KernelTypeInferenceListener
@override
void conditionalExpression(
ExpressionJudgment judgment, location, DartType inferredType) {}
ExpressionJudgment judgment,
location,
void condition,
Token question,
void thenExpression,
Token colon,
void elseExpression,
DartType inferredType) {}
@override
void constructorInvocation(ExpressionJudgment judgment, location,
expressionTarget, DartType inferredType) {}
@override
void continueSwitchStatement(StatementJudgment judgment, location) {}
void continueStatement(StatementJudgment judgment, location,
Token continueKeyword, void label, Token semicolon) {}
@override
void continueSwitchStatement(StatementJudgment judgment, location,
Token continueKeyword, void label, Token semicolon) {}
@override
void deferredCheck(
ExpressionJudgment judgment, location, DartType inferredType) {}
@override
void doStatement(StatementJudgment judgment, location) {}
void doStatement(
StatementJudgment judgment,
location,
Token doKeyword,
void body,
Token whileKeyword,
Token leftParenthesis,
void condition,
Token rightParenthesis,
Token semicolon) {}
@override
void doubleLiteral(
ExpressionJudgment judgment, location, DartType inferredType) {}
void doubleLiteral(ExpressionJudgment judgment, location, Token literal,
double value, DartType inferredType) {}
@override
void expressionStatement(StatementJudgment judgment, location) {}
void expressionStatement(
StatementJudgment judgment, location, void expression, Token semicolon) {}
@override
void fieldInitializer(
InitializerJudgment judgment, location, initializerField) {}
InitializerJudgment judgment,
location,
Token thisKeyword,
Token period,
Token fieldName,
Token equals,
void expression,
initializerField) {}
@override
void forInStatement(
@ -342,28 +515,51 @@ class KernelTypeInferenceListener
ExpressionJudgment judgment, location, DartType inferredType) {}
@override
void ifNull(ExpressionJudgment judgment, location, DartType inferredType) {}
void ifNull(ExpressionJudgment judgment, location, void leftOperand,
Token operator, void rightOperand, DartType inferredType) {}
@override
void ifStatement(StatementJudgment judgment, location) {}
void ifStatement(
StatementJudgment judgment,
location,
Token ifKeyword,
Token leftParenthesis,
void condition,
Token rightParenthesis,
void thenStatement,
Token elseKeyword,
void elseStatement) {}
@override
void indexAssign(ExpressionJudgment judgment, location, writeMember, combiner,
DartType inferredType) {}
@override
void intLiteral(
ExpressionJudgment judgment, location, DartType inferredType) {}
void intLiteral(ExpressionJudgment judgment, location, Token literal,
num value, DartType inferredType) {}
@override
void invalidInitializer(InitializerJudgment judgment, location) {}
@override
void isExpression(ExpressionJudgment judgment, location, DartType testedType,
void isExpression(
ExpressionJudgment judgment,
location,
void expression,
Token isOperator,
void literalType,
DartType testedType,
DartType inferredType) {}
@override
void isNotExpression(ExpressionJudgment judgment, location, DartType type,
void isNotExpression(
ExpressionJudgment judgment,
location,
void expression,
Token isOperator,
Token notOperator,
void literalType,
DartType type,
DartType inferredType) {}
@override
@ -375,7 +571,12 @@ class KernelTypeInferenceListener
@override
void logicalExpression(
ExpressionJudgment judgment, location, DartType inferredType) {}
ExpressionJudgment judgment,
location,
void leftOperand,
Token operator,
void rightOperand,
DartType inferredType) {}
@override
void mapLiteral(
@ -407,11 +608,12 @@ class KernelTypeInferenceListener
ExpressionJudgment judgment, location, DartType inferredType) {}
@override
void not(ExpressionJudgment judgment, location, DartType inferredType) {}
void not(ExpressionJudgment judgment, location, Token operator, void operand,
DartType inferredType) {}
@override
void nullLiteral(ExpressionJudgment judgment, location, bool isSynthetic,
DartType inferredType) {}
void nullLiteral(ExpressionJudgment judgment, location, Token literal,
bool isSynthetic, DartType inferredType) {}
@override
void propertyAssign(ExpressionJudgment judgment, location, writeMember,
@ -431,13 +633,21 @@ class KernelTypeInferenceListener
@override
void redirectingInitializer(
InitializerJudgment judgment, location, initializerTarget) {}
InitializerJudgment judgment,
location,
Token thisKeyword,
Token period,
Token constructorName,
covariant Object argumentList,
initializerTarget) {}
@override
void rethrow_(ExpressionJudgment judgment, location, DartType inferredType) {}
void rethrow_(ExpressionJudgment judgment, location, Token rethrowKeyword,
DartType inferredType) {}
@override
void returnStatement(StatementJudgment judgment, location) {}
void returnStatement(StatementJudgment judgment, location,
Token returnKeyword, void expression, Token semicolon) {}
@override
void staticAssign(ExpressionJudgment judgment, location, writeMember,
@ -468,25 +678,32 @@ class KernelTypeInferenceListener
ExpressionJudgment judgment, location, DartType inferredType) {}
@override
void stringLiteral(
ExpressionJudgment judgment, location, DartType inferredType) {}
void stringLiteral(ExpressionJudgment judgment, location, Token literal,
String value, DartType inferredType) {}
@override
void superInitializer(InitializerJudgment judgment, location) {}
void superInitializer(
InitializerJudgment judgment,
location,
Token superKeyword,
Token period,
Token constructorName,
covariant Object argumentList) {}
@override
void switchStatement(StatementJudgment judgment, location) {}
@override
void symbolLiteral(
ExpressionJudgment judgment, location, DartType inferredType) {}
void symbolLiteral(ExpressionJudgment judgment, location, Token poundSign,
List<Token> components, String value, DartType inferredType) {}
@override
void thisExpression(
ExpressionJudgment judgment, location, DartType inferredType) {}
void thisExpression(ExpressionJudgment judgment, location, Token thisKeyword,
DartType inferredType) {}
@override
void throw_(ExpressionJudgment judgment, location, DartType inferredType) {}
void throw_(ExpressionJudgment judgment, location, Token throwKeyword,
void expression, DartType inferredType) {}
@override
void tryCatch(StatementJudgment judgment, location) {}
@ -515,8 +732,16 @@ class KernelTypeInferenceListener
ExpressionJudgment judgment, location, DartType inferredType) {}
@override
void whileStatement(StatementJudgment judgment, location) {}
void whileStatement(
StatementJudgment judgment,
location,
Token whileKeyword,
Token leftParenthesis,
void condition,
Token rightParenthesis,
void body) {}
@override
void yieldStatement(StatementJudgment judgment, location) {}
void yieldStatement(StatementJudgment judgment, location, Token yieldKeyword,
Token star, void expression, Token semicolon) {}
}