Add tokens to more judgements
Change-Id: I39fca828e117de726907af2eacb2e42e57f33491
Reviewed-on: https://dart-review.googlesource.com/62121
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
diff --git a/pkg/analyzer/lib/src/fasta/resolution_storer.dart b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
index af780b2..7eeefb0 100644
--- a/pkg/analyzer/lib/src/fasta/resolution_storer.dart
+++ b/pkg/analyzer/lib/src/fasta/resolution_storer.dart
@@ -238,6 +238,8 @@
Token literal, double value, DartType inferredType) =>
genericExpression("doubleLiteral", location, inferredType);
+ void emptyStatement(Token semicolon) {}
+
void expressionStatement(StatementJudgment judgment, Location location,
void expression, Token semicolon) {}
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index ef3069d..2c6602c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -3267,7 +3267,16 @@
message, offsetForToken(token), lengthForToken(token)));
}
Statement result = new ForInJudgment(
- variable, expression, kernelBody, declaresVariable, syntheticAssignment,
+ awaitToken,
+ forToken,
+ leftParenthesis,
+ variable,
+ inKeyword,
+ expression,
+ leftParenthesis.endGroup,
+ kernelBody,
+ declaresVariable,
+ syntheticAssignment,
isAsync: awaitToken != null)
..fileOffset = awaitToken?.charOffset ?? forToken.charOffset
..bodyOffset = kernelBody.fileOffset;
@@ -3613,8 +3622,9 @@
}
if (target.isGotoTarget &&
target.functionNestingLevel == functionNestingLevel) {
- ContinueSwitchStatement statement = new ContinueSwitchJudgment(null)
- ..fileOffset = continueKeyword.charOffset;
+ ContinueSwitchStatement statement =
+ new ContinueSwitchJudgment(continueKeyword, null, endToken)
+ ..fileOffset = continueKeyword.charOffset;
target.addGoto(statement);
push(statement);
return;
@@ -3882,13 +3892,14 @@
Statement deprecated_buildCompileTimeErrorStatement(error,
[int charOffset = -1]) {
return new ExpressionStatementJudgment(
- deprecated_buildCompileTimeError(error, charOffset));
+ deprecated_buildCompileTimeError(error, charOffset), null);
}
Statement buildCompileTimeErrorStatement(Message message, int charOffset,
{List<LocatedMessage> context}) {
return new ExpressionStatementJudgment(
- buildCompileTimeError(message, charOffset, noLength, context: context));
+ buildCompileTimeError(message, charOffset, noLength, context: context),
+ null);
}
Statement wrapInCompileTimeErrorStatement(
diff --git a/pkg/front_end/lib/src/fasta/kernel/factory.dart b/pkg/front_end/lib/src/fasta/kernel/factory.dart
index be008b7..177480f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/factory.dart
@@ -132,6 +132,8 @@
Expression doubleLiteral(ExpressionJudgment judgment, int fileOffset,
Token literal, double value, DartType inferredType);
+ Statement emptyStatement(Token semicolon);
+
Statement expressionStatement(StatementJudgment judgment, int fileOffset,
Expression expression, Token semicolon);
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 585e4de..f3d735b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -164,12 +164,12 @@
@override
DoubleJudgment literalDouble(double value, Token token) {
- return new DoubleJudgment(value)..fileOffset = offsetForToken(token);
+ return new DoubleJudgment(token, value)..fileOffset = offsetForToken(token);
}
@override
IntJudgment literalInt(int value, Token token) {
- return new IntJudgment(value)..fileOffset = offsetForToken(token);
+ return new IntJudgment(token, value)..fileOffset = offsetForToken(token);
}
@override
@@ -388,16 +388,19 @@
@override
Statement doStatement(Token doKeyword, Statement body, Token whileKeyword,
Expression condition, Token semicolon) {
- return new DoJudgment(body, condition)..fileOffset = doKeyword.charOffset;
+ // TODO(brianwilkerson): Plumb through the left-and right parentheses.
+ return new DoJudgment(
+ doKeyword, body, whileKeyword, null, condition, null, semicolon)
+ ..fileOffset = doKeyword.charOffset;
}
Statement expressionStatement(Expression expression, Token semicolon) {
- return new ExpressionStatementJudgment(expression);
+ return new ExpressionStatementJudgment(expression, semicolon);
}
@override
Statement emptyStatement(Token semicolon) {
- return new EmptyStatementJudgment();
+ return new EmptyStatementJudgment(semicolon);
}
@override
@@ -412,8 +415,18 @@
List<Expression> updaters,
Token rightParenthesis,
Statement body) {
+ // TODO(brianwilkerson): Plumb through the right separator.
return new ForJudgment(
- variableList, initializers, condition, updaters, body)
+ forKeyword,
+ leftParenthesis,
+ variableList,
+ initializers,
+ leftSeparator,
+ condition,
+ null,
+ updaters,
+ leftParenthesis.endGroup,
+ body)
..fileOffset = forKeyword.charOffset;
}
@@ -465,7 +478,8 @@
@override
Statement rethrowStatement(Token rethrowKeyword, Token semicolon) {
return new ExpressionStatementJudgment(
- new RethrowJudgment()..fileOffset = offsetForToken(rethrowKeyword));
+ new RethrowJudgment()..fileOffset = offsetForToken(rethrowKeyword),
+ semicolon);
}
@override
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
index 32b2387..30255bc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_factory.dart
@@ -194,6 +194,11 @@
}
@override
+ Statement emptyStatement(Token semicolon) {
+ return null;
+ }
+
+ @override
Statement expressionStatement(StatementJudgment judgment, int fileOffset,
Expression expression, Token semicolon) {
return judgment;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index ec18a6e..21bcfdb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -867,7 +867,12 @@
/// statement, in kernel form.
class ContinueSwitchJudgment extends ContinueSwitchStatement
implements StatementJudgment {
- ContinueSwitchJudgment(SwitchCase target) : super(target);
+ final Token continueKeyword;
+ final Token semicolon;
+
+ ContinueSwitchJudgment(
+ this.continueKeyword, SwitchCase target, this.semicolon)
+ : super(target);
SwitchCaseJudgment get targetJudgment => target;
@@ -876,8 +881,8 @@
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
// No inference needs to be done.
- inferrer.listener.continueSwitchStatement(this, fileOffset, null, null,
- null, targetJudgment?.createBinder(inferrer));
+ inferrer.listener.continueSwitchStatement(this, fileOffset, continueKeyword,
+ null, semicolon, targetJudgment?.createBinder(inferrer));
}
}
@@ -907,7 +912,21 @@
/// Concrete shadow object representing a do loop in kernel form.
class DoJudgment extends DoStatement implements StatementJudgment {
- DoJudgment(Statement body, Expression condition) : super(body, condition);
+ final Token doKeyword;
+ final Token whileKeyword;
+ final Token leftParenthesis;
+ final Token rightParenthesis;
+ final Token semicolon;
+
+ DoJudgment(
+ this.doKeyword,
+ Statement body,
+ this.whileKeyword,
+ this.leftParenthesis,
+ Expression condition,
+ this.rightParenthesis,
+ this.semicolon)
+ : super(body, condition);
StatementJudgment get bodyJudgment => body;
@@ -924,16 +943,18 @@
factory, conditionJudgment, boolType, !inferrer.isTopLevel);
inferrer.ensureAssignable(boolType, conditionJudgment.inferredType,
condition, condition.fileOffset);
- inferrer.listener.doStatement(
- this, fileOffset, null, null, null, null, null, null, null);
+ inferrer.listener.doStatement(this, fileOffset, doKeyword, null,
+ whileKeyword, leftParenthesis, null, rightParenthesis, semicolon);
}
}
/// Concrete shadow object representing a double literal in kernel form.
class DoubleJudgment extends DoubleLiteral implements ExpressionJudgment {
+ final Token literal;
+
DartType inferredType;
- DoubleJudgment(double value) : super(value);
+ DoubleJudgment(this.literal, double value) : super(value);
@override
Expression infer<Expression, Statement, Initializer, Type>(
@@ -941,7 +962,8 @@
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.doubleClass.rawType;
- inferrer.listener.doubleLiteral(this, fileOffset, null, null, inferredType);
+ inferrer.listener
+ .doubleLiteral(this, fileOffset, literal, value, inferredType);
return null;
}
}
@@ -962,18 +984,26 @@
/// Concrete shadow object representing an empty statement in kernel form.
class EmptyStatementJudgment extends EmptyStatement
implements StatementJudgment {
+ final Token semicolon;
+
+ EmptyStatementJudgment(this.semicolon);
+
@override
void infer<Expression, Statement, Initializer, Type>(
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
// No inference needs to be done.
+ inferrer.listener.emptyStatement(semicolon);
}
}
/// Concrete shadow object representing an expression statement in kernel form.
class ExpressionStatementJudgment extends ExpressionStatement
implements StatementJudgment {
- ExpressionStatementJudgment(Expression expression) : super(expression);
+ final Token semicolon;
+
+ ExpressionStatementJudgment(Expression expression, this.semicolon)
+ : super(expression);
Expression get judgment => expression;
@@ -982,7 +1012,7 @@
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
inferrer.inferExpression(factory, judgment, const UnknownType(), false);
- inferrer.listener.expressionStatement(this, fileOffset, null, null);
+ inferrer.listener.expressionStatement(this, fileOffset, null, semicolon);
}
}
@@ -1122,12 +1152,27 @@
/// Concrete shadow object representing a for-in loop in kernel form.
class ForInJudgment extends ForInStatement implements StatementJudgment {
+ final Token awaitKeyword;
+ final Token forKeyword;
+ final Token leftParenthesis;
+ final Token inKeyword;
+ final Token rightParenthesis;
+
final bool _declaresVariable;
final ShadowSyntheticExpression _syntheticAssignment;
- ForInJudgment(VariableDeclaration variable, Expression iterable,
- Statement body, this._declaresVariable, this._syntheticAssignment,
+ ForInJudgment(
+ this.awaitKeyword,
+ this.forKeyword,
+ this.leftParenthesis,
+ VariableDeclaration variable,
+ this.inKeyword,
+ Expression iterable,
+ this.rightParenthesis,
+ Statement body,
+ this._declaresVariable,
+ this._syntheticAssignment,
{bool isAsync: false})
: super(variable, iterable, body, isAsync: isAsync);
@@ -1235,14 +1280,14 @@
inferrer.listener.forInStatement(
this,
fileOffset,
+ awaitKeyword,
+ forKeyword,
+ leftParenthesis,
null,
null,
- null,
- null,
- null,
- null,
+ inKeyword,
iterable,
- null,
+ rightParenthesis,
body,
variable?.createBinder(inferrer),
variable?.type,
@@ -1254,14 +1299,14 @@
inferrer.listener.forInStatement(
this,
fileOffset,
+ awaitKeyword,
+ forKeyword,
+ leftParenthesis,
null,
null,
- null,
- null,
- null,
- null,
+ inKeyword,
iterable,
- null,
+ rightParenthesis,
body,
variable?.createBinder(inferrer),
variable?.type,
@@ -1273,14 +1318,14 @@
inferrer.listener.forInStatement(
this,
fileOffset,
+ awaitKeyword,
+ forKeyword,
+ leftParenthesis,
null,
null,
- null,
- null,
- null,
- null,
+ inKeyword,
iterable,
- null,
+ rightParenthesis,
body,
variable?.createBinder(inferrer),
variable?.type,
@@ -1293,14 +1338,14 @@
inferrer.listener.forInStatement(
this,
fileOffset,
+ awaitKeyword,
+ forKeyword,
+ leftParenthesis,
null,
null,
+ inKeyword,
null,
- null,
- null,
- null,
- null,
- null,
+ rightParenthesis,
null,
variable?.createBinder(inferrer),
variable?.type,
@@ -1317,10 +1362,25 @@
/// Concrete shadow object representing a classic for loop in kernel form.
class ForJudgment extends ForStatement implements StatementJudgment {
+ final Token forKeyword;
+ final Token leftParenthesis;
+ final Token leftSeparator;
+ final Token rightSeparator;
+ final Token rightParenthesis;
+
final List<ExpressionJudgment> initializers;
- ForJudgment(List<VariableDeclaration> variables, this.initializers,
- ExpressionJudgment condition, List<Expression> updates, Statement body)
+ ForJudgment(
+ this.forKeyword,
+ this.leftParenthesis,
+ List<VariableDeclaration> variables,
+ this.initializers,
+ this.leftSeparator,
+ ExpressionJudgment condition,
+ this.rightSeparator,
+ List<Expression> updates,
+ this.rightParenthesis,
+ Statement body)
: super(variables ?? [], condition, updates, body);
List<VariableDeclarationJudgment> get variableJudgments => variables.cast();
@@ -1360,8 +1420,19 @@
inferrer.inferExpression(factory, update, const UnknownType(), false);
}
inferrer.inferStatement(factory, bodyJudgment);
- inferrer.listener.forStatement(this, fileOffset, null, null, null, null,
- null, condition, null, updates, null, body);
+ inferrer.listener.forStatement(
+ this,
+ fileOffset,
+ forKeyword,
+ leftParenthesis,
+ null,
+ null,
+ leftSeparator,
+ condition,
+ rightSeparator,
+ updates,
+ rightParenthesis,
+ body);
}
}
@@ -1673,9 +1744,11 @@
/// Concrete shadow object representing an integer literal in kernel form.
class IntJudgment extends IntLiteral implements ExpressionJudgment {
+ final Token literal;
+
DartType inferredType;
- IntJudgment(int value) : super(value);
+ IntJudgment(this.literal, int value) : super(value);
@override
Expression infer<Expression, Statement, Initializer, Type>(
@@ -1683,7 +1756,8 @@
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.intClass.rawType;
- inferrer.listener.intLiteral(this, fileOffset, null, null, inferredType);
+ inferrer.listener
+ .intLiteral(this, fileOffset, literal, value, inferredType);
return null;
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
index 67cc2bb..7fd818c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/toplevel_inference_factory.dart
@@ -155,6 +155,9 @@
double value, DartType inferredType) {}
@override
+ void emptyStatement(Token semicolon) {}
+
+ @override
void expressionStatement(StatementJudgment judgment, int fileOffset,
void expression, Token semicolon) {}
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
index 8f7c7c5..3c96da9 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_listener.dart
@@ -142,6 +142,8 @@
void doubleLiteral(ExpressionJudgment judgment, Location location,
Token literal, double value, DartType inferredType);
+ void emptyStatement(Token semicolon);
+
void expressionStatement(StatementJudgment judgment, Location location,
void expression, Token semicolon);
@@ -579,6 +581,9 @@
double value, DartType inferredType) {}
@override
+ void emptyStatement(Token semicolon) {}
+
+ @override
void expressionStatement(
StatementJudgment judgment, location, void expression, Token semicolon) {}