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;
}
}