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,