Convert shadow nodes for 'is' and 'is!' into inference judgments

Bug: http://dartbug.com/33493
Change-Id: Ife367c8e2614332810a3660f4c98bf82893516ae
Reviewed-on: https://dart-review.googlesource.com/60925
Commit-Queue: Dmitry Stefantsov <dmitryas@google.com>
Reviewed-by: Paul Berry <paulberry@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 324bdb9..1fc12ca 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -74,38 +74,38 @@
         BlockJudgment,
         BoolJudgment,
         BreakJudgment,
-        ContinueJudgment,
         CheckLibraryIsLoadedJudgment,
         ConditionalJudgment,
+        ContinueJudgment,
         DoJudgment,
         DoubleJudgment,
         EmptyStatementJudgment,
+        IntJudgment,
+        IsJudgment,
+        IsNotJudgment,
+        LabeledStatementJudgment,
+        LoadLibraryJudgment,
+        NullJudgment,
         ShadowExpressionStatement,
         ShadowForStatement,
         ShadowIfStatement,
-        IntJudgment,
-        ShadowIsExpression,
-        ShadowIsNotExpression,
-        LabeledStatementJudgment,
         ShadowListLiteral,
-        LoadLibraryJudgment,
         ShadowLogicalExpression,
         ShadowMapLiteral,
         ShadowNot,
-        NullJudgment,
         ShadowRethrow,
         ShadowReturnStatement,
         ShadowStringConcatenation,
         ShadowStringLiteral,
         ShadowSymbolLiteral,
         ShadowSyntheticExpression,
-        ThisJudgment,
-        ThrowJudgment,
         ShadowTryCatch,
         ShadowTryFinally,
-        TypeLiteralJudgment,
         ShadowWhileStatement,
-        ShadowYieldStatement;
+        ShadowYieldStatement,
+        ThisJudgment,
+        ThrowJudgment,
+        TypeLiteralJudgment;
 
 import 'forest.dart'
     show
@@ -414,9 +414,9 @@
       Expression operand, isOperator, Token notOperator, covariant type) {
     int offset = offsetForToken(isOperator);
     if (notOperator != null) {
-      return new ShadowIsNotExpression(operand, type, offset);
+      return new IsNotJudgment(operand, type, offset);
     }
-    return new ShadowIsExpression(operand, type)..fileOffset = offset;
+    return new IsJudgment(operand, type)..fileOffset = offset;
   }
 
   @override
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 329585f..72b5165 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
@@ -1414,26 +1414,33 @@
 }
 
 /// Concrete shadow object representing a non-inverted "is" test in kernel form.
-class ShadowIsExpression extends IsExpression implements ExpressionJudgment {
+class IsJudgment extends IsExpression implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowIsExpression(Expression operand, DartType type) : super(operand, type);
+  ExpressionJudgment get judgment => operand;
+
+  IsJudgment(Expression operand, DartType type) : super(operand, type);
 
   @override
   DartType infer<Expression, Statement, Initializer, Type>(
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    inferrer.inferExpression(factory, operand, const UnknownType(), false);
-    return inferrer.coreTypes.boolClass.rawType;
+    inferrer.inferExpression(factory, judgment, const UnknownType(), false);
+    return inferredType = inferrer.coreTypes.boolClass.rawType;
   }
 }
 
 /// Concrete shadow object representing an inverted "is" test in kernel form.
-class ShadowIsNotExpression extends Not implements ExpressionJudgment {
+class IsNotJudgment extends Not implements ExpressionJudgment {
   DartType inferredType;
 
-  ShadowIsNotExpression(Expression operand, DartType type, int charOffset)
+  @override
+  IsExpression get operand => super.operand;
+
+  ExpressionJudgment get judgment => operand.operand;
+
+  IsNotJudgment(Expression operand, DartType type, int charOffset)
       : super(new IsExpression(operand, type)..fileOffset = charOffset);
 
   @override
@@ -1441,10 +1448,8 @@
       ShadowTypeInferrer inferrer,
       Factory<Expression, Statement, Initializer, Type> factory,
       DartType typeContext) {
-    IsExpression isExpression = this.operand;
-    inferrer.inferExpression(
-        factory, isExpression.operand, const UnknownType(), false);
-    return inferrer.coreTypes.boolClass.rawType;
+    inferrer.inferExpression(factory, judgment, const UnknownType(), false);
+    return inferredType = inferrer.coreTypes.boolClass.rawType;
   }
 }