Add tokens to judgements, part 2
Change-Id: I2442124d702f1d7728f5d63af041b073cfaa437e
Reviewed-on: https://dart-review.googlesource.com/61985
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 6e12156..585e4de 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -159,7 +159,7 @@
@override
BoolJudgment literalBool(bool value, Token token) {
- return new BoolJudgment(value)..fileOffset = offsetForToken(token);
+ return new BoolJudgment(token, value)..fileOffset = offsetForToken(token);
}
@override
@@ -326,7 +326,8 @@
@override
Expression awaitExpression(Expression operand, Token token) {
- return new AwaitJudgment(operand)..fileOffset = offsetForToken(token);
+ return new AwaitJudgment(token, operand)
+ ..fileOffset = offsetForToken(token);
}
@override
@@ -342,13 +343,14 @@
copy.add(statement);
}
}
- return new BlockJudgment(copy ?? statements)
+ return new BlockJudgment(openBrace, copy ?? statements, closeBrace)
..fileOffset = offsetForToken(openBrace);
}
@override
Statement breakStatement(Token breakKeyword, Object label, Token semicolon) {
- return new BreakJudgment(null)..fileOffset = breakKeyword.charOffset;
+ return new BreakJudgment(breakKeyword, null, semicolon)
+ ..fileOffset = breakKeyword.charOffset;
}
@override
@@ -361,7 +363,9 @@
DartType stackTraceType,
Statement body) {
exceptionType ??= const DynamicType();
- return new CatchJudgment(exceptionParameter, body,
+ // TODO(brianwilkerson) Get the left and right parentheses and the comma.
+ return new CatchJudgment(
+ onKeyword, catchKeyword, null, exceptionParameter, null, null, body,
guard: exceptionType, stackTrace: stackTraceParameter)
..fileOffset = offsetForToken(onKeyword ?? catchKeyword);
}
@@ -369,14 +373,16 @@
@override
Expression conditionalExpression(Expression condition, Token question,
Expression thenExpression, Token colon, Expression elseExpression) {
- return new ConditionalJudgment(condition, thenExpression, elseExpression)
+ return new ConditionalJudgment(
+ condition, question, thenExpression, colon, elseExpression)
..fileOffset = offsetForToken(question);
}
@override
Statement continueStatement(
Token continueKeyword, Object label, Token semicolon) {
- return new ContinueJudgment(null)..fileOffset = continueKeyword.charOffset;
+ return new ContinueJudgment(continueKeyword, null, semicolon)
+ ..fileOffset = continueKeyword.charOffset;
}
@override
@@ -516,10 +522,10 @@
@override
Statement wrapVariables(Statement statement) {
if (statement is _VariablesDeclaration) {
- return new BlockJudgment(statement.declarations)
+ return new BlockJudgment(null, statement.declarations, null)
..fileOffset = statement.fileOffset;
} else if (statement is VariableDeclaration) {
- return new BlockJudgment(<Statement>[statement])
+ return new BlockJudgment(null, <Statement>[statement], null)
..fileOffset = statement.fileOffset;
} else {
return statement;
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 2f41efc..e03a958 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
@@ -252,9 +252,11 @@
/// Shadow object for [AwaitExpression].
class AwaitJudgment extends AwaitExpression implements ExpressionJudgment {
+ final Token awaitKeyword;
+
DartType inferredType;
- AwaitJudgment(Expression operand) : super(operand);
+ AwaitJudgment(this.awaitKeyword, Expression operand) : super(operand);
ExpressionJudgment get judgment => operand;
@@ -271,14 +273,18 @@
inferredType =
inferrer.typeSchemaEnvironment.unfutureType(judgment.inferredType);
inferrer.listener
- .awaitExpression(this, fileOffset, null, null, inferredType);
+ .awaitExpression(this, fileOffset, awaitKeyword, null, inferredType);
return inferredType;
}
}
/// Concrete shadow object representing a statement block in kernel form.
class BlockJudgment extends Block implements StatementJudgment {
- BlockJudgment(List<Statement> statements) : super(statements);
+ final Token leftBracket;
+ final Token rightBracket;
+
+ BlockJudgment(this.leftBracket, List<Statement> statements, this.rightBracket)
+ : super(statements);
List<Statement> get judgments => statements;
@@ -289,15 +295,17 @@
for (var judgment in judgments) {
inferrer.inferStatement(factory, judgment);
}
- inferrer.listener.block(this, fileOffset, null, null, null);
+ inferrer.listener.block(this, fileOffset, leftBracket, null, rightBracket);
}
}
/// Concrete shadow object representing a boolean literal in kernel form.
class BoolJudgment extends BoolLiteral implements ExpressionJudgment {
+ final Token literal;
+
DartType inferredType;
- BoolJudgment(bool value) : super(value);
+ BoolJudgment(this.literal, bool value) : super(value);
@override
DartType infer<Expression, Statement, Initializer, Type>(
@@ -305,26 +313,19 @@
Factory<Expression, Statement, Initializer, Type> factory,
DartType typeContext) {
inferredType = inferrer.coreTypes.boolClass.rawType;
- inferrer.listener.boolLiteral(this, fileOffset, null, null, inferredType);
+ inferrer.listener
+ .boolLiteral(this, fileOffset, literal, value, inferredType);
return inferredType;
}
}
/// Concrete shadow object representing a break statement in kernel form.
class BreakJudgment extends BreakStatement implements StatementJudgment {
- BreakJudgment(LabeledStatement target) : super(target);
+ final Token breakKeyword;
+ final Token semicolon;
- @override
- void infer<Expression, Statement, Initializer, Type>(
- ShadowTypeInferrer inferrer,
- Factory<Expression, Statement, Initializer, Type> factory) {
- // No inference needs to be done.
- }
-}
-
-/// Concrete shadow object representing a continue statement in kernel form.
-class ContinueJudgment extends BreakStatement implements StatementJudgment {
- ContinueJudgment(LabeledStatement target) : super(target);
+ BreakJudgment(this.breakKeyword, LabeledStatement target, this.semicolon)
+ : super(target);
LabeledStatementJudgment get targetJudgment => target;
@@ -333,8 +334,29 @@
ShadowTypeInferrer inferrer,
Factory<Expression, Statement, Initializer, Type> factory) {
// No inference needs to be done.
- inferrer.listener.breakStatement(this, fileOffset, null, null, null,
- targetJudgment?.createBinder(inferrer));
+ inferrer.listener.breakStatement(this, fileOffset, breakKeyword, null,
+ semicolon, targetJudgment?.createBinder(inferrer));
+ }
+}
+
+/// Concrete shadow object representing a continue statement in kernel form.
+class ContinueJudgment extends BreakStatement implements StatementJudgment {
+ final Token continueKeyword;
+ final Token semicolon;
+
+ ContinueJudgment(
+ this.continueKeyword, LabeledStatement target, this.semicolon)
+ : super(target);
+
+ LabeledStatementJudgment get targetJudgment => target;
+
+ @override
+ void infer<Expression, Statement, Initializer, Type>(
+ ShadowTypeInferrer inferrer,
+ Factory<Expression, Statement, Initializer, Type> factory) {
+ // No inference needs to be done.
+ inferrer.listener.continueStatement(this, fileOffset, continueKeyword, null,
+ semicolon, targetJudgment?.createBinder(inferrer));
}
}
@@ -673,6 +695,9 @@
/// Shadow object for [ConditionalExpression].
class ConditionalJudgment extends ConditionalExpression
implements ExpressionJudgment {
+ final Token question;
+ final Token colon;
+
DartType inferredType;
ExpressionJudgment get conditionJudgment => condition;
@@ -681,8 +706,8 @@
ExpressionJudgment get otherwiseJudgment => otherwise;
- ConditionalJudgment(
- Expression condition, Expression then, Expression otherwise)
+ ConditionalJudgment(Expression condition, this.question, Expression then,
+ this.colon, Expression otherwise)
: super(condition, then, otherwise, null);
@override
@@ -709,7 +734,7 @@
staticType = inferredType;
}
inferrer.listener.conditionalExpression(
- this, fileOffset, null, null, null, null, null, inferredType);
+ this, fileOffset, null, question, null, colon, null, inferredType);
return inferredType;
}
}
@@ -2767,8 +2792,22 @@
/// Concrete shadow object representing a catch clause.
class CatchJudgment extends Catch {
- CatchJudgment(VariableDeclaration exception, Statement body,
- {DartType guard: const DynamicType(), VariableDeclaration stackTrace})
+ final Token onKeyword;
+ final Token catchKeyword;
+ final Token leftParenthesis;
+ final Token comma;
+ final Token rightParenthesis;
+
+ CatchJudgment(
+ this.onKeyword,
+ this.catchKeyword,
+ this.leftParenthesis,
+ VariableDeclaration exception,
+ this.comma,
+ this.rightParenthesis,
+ Statement body,
+ {DartType guard: const DynamicType(),
+ VariableDeclaration stackTrace})
: super(exception, body, guard: guard, stackTrace: stackTrace);
VariableDeclarationJudgment get exceptionJudgment => exception;
@@ -2784,15 +2823,15 @@
inferrer.listener.catchStatement(
this,
fileOffset,
+ onKeyword,
null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
+ catchKeyword,
+ leftParenthesis,
+ null, // exception
+ comma,
+ null, // stackTrace
+ rightParenthesis,
+ null, // body
guard,
exceptionJudgment?.createBinder(inferrer),
exceptionJudgment?.type,