Index: pkg/analyzer/lib/src/generated/constant.dart |
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart |
index 24125064171085e4cfad5f3679f3da5839bd62cb..c4d7027ded91d9fa85af5c4a28d96f224fce8710 100644 |
--- a/pkg/analyzer/lib/src/generated/constant.dart |
+++ b/pkg/analyzer/lib/src/generated/constant.dart |
@@ -1533,7 +1533,9 @@ class ConstantVisitor extends UnifyingAstVisitor<DartObjectImpl> { |
DartObjectImpl rightResult = node.rightOperand.accept(this); |
TokenType operatorType = node.operator.type; |
// 'null' is almost never good operand |
- if (operatorType != TokenType.BANG_EQ && operatorType != TokenType.EQ_EQ) { |
+ if (operatorType != TokenType.BANG_EQ && |
+ operatorType != TokenType.EQ_EQ && |
+ operatorType != TokenType.QUESTION_QUESTION) { |
if (leftResult != null && leftResult.isNull || |
rightResult != null && rightResult.isNull) { |
_error(node, CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION); |
@@ -1582,6 +1584,9 @@ class ConstantVisitor extends UnifyingAstVisitor<DartObjectImpl> { |
return _dartObjectComputer.divide(node, leftResult, rightResult); |
} else if (operatorType == TokenType.TILDE_SLASH) { |
return _dartObjectComputer.integerDivide(node, leftResult, rightResult); |
+ } else if (operatorType == TokenType.QUESTION_QUESTION) { |
+ return _dartObjectComputer.questionQuestion( |
+ node, leftResult, rightResult); |
} else { |
// TODO(brianwilkerson) Figure out which error to report. |
_error(node, null); |
@@ -2295,6 +2300,15 @@ class DartObjectComputer { |
return null; |
} |
+ DartObjectImpl questionQuestion(Expression node, DartObjectImpl leftOperand, |
+ DartObjectImpl rightOperand) { |
+ if (leftOperand != null && rightOperand != null) { |
+ if (leftOperand.isNull) return rightOperand; |
+ return leftOperand; |
+ } |
+ return null; |
+ } |
+ |
DartObjectImpl greaterThan(BinaryExpression node, DartObjectImpl leftOperand, |
DartObjectImpl rightOperand) { |
if (leftOperand != null && rightOperand != null) { |