Convert ShadowReturnStatement to ReturnJudgment.

R=brianwilkerson@google.com, paulberry@google.com

Change-Id: Ifccbda5a6f5e4f3be20640f018932b79a8b6d27d
Reviewed-on: https://dart-review.googlesource.com/61140
Reviewed-by: Paul Berry <paulberry@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
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 a43afde..0e3a1ba 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -792,8 +792,8 @@
               .withLocation(uri, eof.charOffset, eof.length));
     }
 
-    ShadowReturnStatement fakeReturn =
-        new ShadowReturnStatement(toKernelExpression(expression));
+    ReturnJudgment fakeReturn =
+        new ReturnJudgment(toKernelExpression(expression));
 
     _typeInferrer.inferFunctionBody(
         this, factory, const DynamicType(), AsyncMarker.Sync, fakeReturn);
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 1fc12ca..ebb58a9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -94,7 +94,7 @@
         ShadowMapLiteral,
         ShadowNot,
         ShadowRethrow,
-        ShadowReturnStatement,
+        ReturnJudgment,
         ShadowStringConcatenation,
         ShadowStringLiteral,
         ShadowSymbolLiteral,
@@ -457,7 +457,7 @@
   @override
   Statement returnStatement(
       Token returnKeyword, Expression expression, Token semicolon) {
-    return new ShadowReturnStatement(expression)
+    return new ReturnJudgment(expression)
       ..fileOffset = returnKeyword.charOffset;
   }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
index b86cf428..31b90f4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_ast_api.dart
@@ -93,7 +93,7 @@
         ShadowPropertyAssign,
         PropertyGetJudgment,
         ShadowRedirectingInitializer,
-        ShadowReturnStatement,
+        ReturnJudgment,
         ShadowStaticAssignment,
         StaticGetJudgment,
         ShadowStaticInvocation,
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 72b5165..86604a3 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
@@ -2002,25 +2002,31 @@
 }
 
 /// Concrete shadow object representing a return statement in kernel form.
-class ShadowReturnStatement extends ReturnStatement
-    implements StatementJudgment {
-  ShadowReturnStatement([Expression expression]) : super(expression);
+class ReturnJudgment extends ReturnStatement implements StatementJudgment {
+  ReturnJudgment([Expression expression]) : super(expression);
+
+  ExpressionJudgment get judgment => expression;
 
   @override
   void infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory) {
+    var judgment = this.judgment;
     var closureContext = inferrer.closureContext;
     var typeContext = !closureContext.isGenerator
         ? closureContext.returnOrYieldContext
         : const UnknownType();
-    var inferredType = expression != null
-        ? inferrer.inferExpression(factory, expression, typeContext, true)
-        : const VoidType();
+    DartType inferredType;
+    if (expression != null) {
+      inferrer.inferExpression(factory, judgment, typeContext, true);
+      inferredType = judgment.inferredType;
+    } else {
+      inferredType = const VoidType();
+    }
     // Analyzer treats bare `return` statements as having no effect on the
     // inferred type of the closure.  TODO(paulberry): is this what we want
     // for Fasta?
-    if (expression != null) {
+    if (judgment != null) {
       closureContext.handleReturn(
           inferrer, inferredType, expression, fileOffset);
     }