Fix constant evalutation for == and != when left or right is null.
Change-Id: Iefa0890b57a9ba01675ce80c81fd3a73511f8c82
Reviewed-on: https://dart-review.googlesource.com/71340
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index 50ecc05..15dc365 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -375,21 +375,19 @@
*/
DartObjectImpl equalEqual(
TypeProvider typeProvider, DartObjectImpl rightOperand) {
- if (type != rightOperand.type) {
- String typeName = type.name;
- if (!(typeName == "bool" ||
- typeName == "double" ||
- typeName == "int" ||
- typeName == "num" ||
- typeName == "String" ||
- typeName == "Null" ||
- type.isDynamic)) {
- throw new EvaluationException(
- CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
- }
+ if (isNull || rightOperand.isNull) {
+ return new DartObjectImpl(
+ typeProvider.boolType,
+ isNull && rightOperand.isNull
+ ? BoolState.TRUE_STATE
+ : BoolState.FALSE_STATE);
}
- return new DartObjectImpl(
- typeProvider.boolType, _state.equalEqual(rightOperand._state));
+ if (isBoolNumStringOrNull) {
+ return new DartObjectImpl(
+ typeProvider.boolType, _state.equalEqual(rightOperand._state));
+ }
+ throw new EvaluationException(
+ CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING);
}
@override
@@ -574,18 +572,7 @@
*/
DartObjectImpl notEqual(
TypeProvider typeProvider, DartObjectImpl rightOperand) {
- if (type != rightOperand.type) {
- String typeName = type.name;
- if (typeName != "bool" &&
- typeName != "double" &&
- typeName != "int" &&
- typeName != "num" &&
- typeName != "String") {
- return new DartObjectImpl(typeProvider.boolType, BoolState.TRUE_STATE);
- }
- }
- return new DartObjectImpl(typeProvider.boolType,
- _state.equalEqual(rightOperand._state).logicalNot());
+ return equalEqual(typeProvider, rightOperand).logicalNot(typeProvider);
}
/**
diff --git a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
index 0c3c7dc..f4f1192 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_kernel_test.dart
@@ -177,12 +177,6 @@
@override
@failingTest
- test_optionalNew_rewrite() {
- return super.test_optionalNew_rewrite();
- }
-
- @override
- @failingTest
test_undefinedIdentifier_synthetic_whenMethodName() async {
return super.test_undefinedIdentifier_synthetic_whenMethodName();
}
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index a2a00ea..58d3b70 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -1487,9 +1487,6 @@
test_constEvalTypeBoolNumString_equal() async {
Source source = addSource(r'''
-class A {
- const A();
-}
class B {
final v;
const B.a1(bool p) : v = p == true;
@@ -1509,6 +1506,8 @@
const B.c5(String p) : v = p == '';
const B.n1(num p) : v = p == null;
const B.n2(num p) : v = null == p;
+ const B.n3(Object p) : v = p == null;
+ const B.n4(Object p) : v = null == p;
}''');
await computeAnalysisResult(source);
assertNoErrors(source);
@@ -1516,9 +1515,6 @@
test_constEvalTypeBoolNumString_notEqual() async {
Source source = addSource(r'''
-class A {
- const A();
-}
class B {
final v;
const B.a1(bool p) : v = p != true;
@@ -1538,13 +1534,15 @@
const B.c5(String p) : v = p != '';
const B.n1(num p) : v = p != null;
const B.n2(num p) : v = null != p;
+ const B.n3(Object p) : v = p != null;
+ const B.n4(Object p) : v = null != p;
}''');
await computeAnalysisResult(source);
assertNoErrors(source);
verify([source]);
}
- test_constEvelTypeNum_String() async {
+ test_constEvAlTypeNum_String() async {
Source source = addSource(r'''
const String A = 'a';
const String B = A + 'b';