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) {}