Migrate ConstantVisitorTest from task model.
R=brianwilkerson@google.com
Change-Id: I7822f13a4438e7460e136d56ad3b5abf6fd1b11d
Reviewed-on: https://dart-review.googlesource.com/c/92925
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 21883f7..9bf696b 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -227,6 +227,19 @@
return _node(search, (n) => n is TopLevelVariableDeclaration);
}
+ VariableDeclaration topVariableDeclarationByName(String name) {
+ for (var declaration in unit.declarations) {
+ if (declaration is TopLevelVariableDeclaration) {
+ for (var variable in declaration.variables.variables) {
+ if (variable.name.name == name) {
+ return variable;
+ }
+ }
+ }
+ }
+ throw StateError('$name');
+ }
+
TypeAnnotation typeAnnotation(String search) {
return _node(search, (n) => n is TypeAnnotation);
}
diff --git a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
index ca9e41b..fe9fbf9 100644
--- a/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
+++ b/pkg/analyzer/test/src/dart/constant/evaluation_test.dart
@@ -4,827 +4,193 @@
import 'package:analyzer/dart/analysis/declared_variables.dart';
import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/standard_resolution_map.dart';
-import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/error/error.dart';
import 'package:analyzer/error/listener.dart';
import 'package:analyzer/src/dart/analysis/experiments.dart';
import 'package:analyzer/src/error/codes.dart';
import 'package:analyzer/src/generated/constant.dart';
import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/resolver.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/source_io.dart';
-import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
-import 'package:analyzer/src/generated/testing/test_type_provider.dart';
-import 'package:path/path.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
-import '../../../generated/resolver_test_case.dart';
import '../../../generated/test_support.dart';
+import '../resolution/driver_resolution.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ConstantVisitorTest);
- defineReflectiveTests(ConstantVisitorTest_Driver);
defineReflectiveTests(ConstantVisitorWithConstantUpdate2018Test);
defineReflectiveTests(
ConstantVisitorWithFlowControlAndSpreadCollectionsTest);
});
}
-/// TODO(paulberry): migrate this test away from the task model.
-/// See dartbug.com/35734.
@reflectiveTest
class ConstantVisitorTest extends ConstantVisitorTestSupport {
- test_visitAsExpression_instanceOfSameClass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const A();
-const b = a as A;
-class A {
- const A();
-}
-''');
- DartObjectImpl resultA = _evaluateConstant(compilationUnit, 'a',
- experiments: [EnableString.constant_update_2018]);
- DartObjectImpl resultB = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(resultB, resultA);
- }
-
- test_visitAsExpression_instanceOfSubclass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const B();
-const b = a as A;
-class A {
- const A();
-}
-class B extends A {
- const B();
-}
-''');
- DartObjectImpl resultA = _evaluateConstant(compilationUnit, 'a',
- experiments: [EnableString.constant_update_2018]);
- DartObjectImpl resultB = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(resultB, resultA);
- }
-
- test_visitAsExpression_instanceOfSuperclass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const A();
-const b = a as B;
-class A {
- const A();
-}
-class B extends A {
- const B();
-}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION],
- experiments: [EnableString.constant_update_2018]);
- expect(result, isNull);
- }
-
- test_visitAsExpression_instanceOfUnrelatedClass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const A();
-const b = a as B;
-class A {
- const A();
-}
-class B {
- const B();
-}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION],
- experiments: [EnableString.constant_update_2018]);
- expect(result, isNull);
- }
-
- test_visitAsExpression_null() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = null;
-const b = a as A;
-class A {}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.nullType);
- }
-
- test_visitBinaryExpression_and_bool_known_known() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = false & true;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_and_bool_known_unknown() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const b = bool.fromEnvironment('y');
-const c = false & b;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_and_bool_unknown_known() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = bool.fromEnvironment('x');
-const c = a & true;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_and_bool_unknown_unknown() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = bool.fromEnvironment('x');
-const b = bool.fromEnvironment('y');
-const c = a & b;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_and_int() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = 3 & 5;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.intType);
- }
-
- test_visitBinaryExpression_and_mixed() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = 3 & false;
-''');
- _evaluateConstant(compilationUnit, 'c',
- errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT],
- experiments: [EnableString.constant_update_2018]);
- }
-
- test_visitBinaryExpression_or_bool_known_known() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = false | true;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_or_bool_known_unknown() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const b = bool.fromEnvironment('y');
-const c = false | b;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_or_bool_unknown_known() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = bool.fromEnvironment('x');
-const c = a | true;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_or_bool_unknown_unknown() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = bool.fromEnvironment('x');
-const b = bool.fromEnvironment('y');
-const c = a | b;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_or_int() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = 3 | 5;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.intType);
- }
-
- test_visitBinaryExpression_or_mixed() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = 3 | false;
-''');
- _evaluateConstant(compilationUnit, 'c',
- errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT],
- experiments: [EnableString.constant_update_2018]);
- }
-
test_visitBinaryExpression_questionQuestion_eager_notNull_notNull() async {
- Expression left = AstTestFactory.string2('a');
- Expression right = AstTestFactory.string2('b');
- Expression expression = AstTestFactory.binaryExpression(
- left, TokenType.QUESTION_QUESTION, right);
-
- GatheringErrorListener errorListener = new GatheringErrorListener();
- ErrorReporter errorReporter =
- new ErrorReporter(errorListener, _dummySource());
- DartObjectImpl result = _evaluate(expression, errorReporter);
- expect(result, isNotNull);
- expect(result.isNull, isFalse);
+ await _resolveTestCode('''
+const c = 'a' ?? 'b';
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.stringType);
expect(result.toStringValue(), 'a');
- errorListener.assertNoErrors();
}
test_visitBinaryExpression_questionQuestion_eager_null_notNull() async {
- Expression left = AstTestFactory.nullLiteral();
- Expression right = AstTestFactory.string2('b');
- Expression expression = AstTestFactory.binaryExpression(
- left, TokenType.QUESTION_QUESTION, right);
-
- GatheringErrorListener errorListener = new GatheringErrorListener();
- ErrorReporter errorReporter =
- new ErrorReporter(errorListener, _dummySource());
- DartObjectImpl result = _evaluate(expression, errorReporter);
- expect(result, isNotNull);
- expect(result.isNull, isFalse);
+ await _resolveTestCode('''
+const c = null ?? 'b';
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.stringType);
expect(result.toStringValue(), 'b');
- errorListener.assertNoErrors();
}
test_visitBinaryExpression_questionQuestion_eager_null_null() async {
- Expression left = AstTestFactory.nullLiteral();
- Expression right = AstTestFactory.nullLiteral();
- Expression expression = AstTestFactory.binaryExpression(
- left, TokenType.QUESTION_QUESTION, right);
-
- GatheringErrorListener errorListener = new GatheringErrorListener();
- ErrorReporter errorReporter =
- new ErrorReporter(errorListener, _dummySource());
- DartObjectImpl result = _evaluate(expression, errorReporter);
- expect(result, isNotNull);
- expect(result.isNull, isTrue);
- errorListener.assertNoErrors();
- }
-
- test_visitBinaryExpression_questionQuestion_lazy_notNull_invalid() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = 'a' ?? new C();
-class C {}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.stringType);
- expect(result.toStringValue(), 'a');
- }
-
- test_visitBinaryExpression_questionQuestion_lazy_notNull_notNull() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = 'a' ?? 'b';
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.stringType);
- expect(result.toStringValue(), 'a');
- }
-
- test_visitBinaryExpression_questionQuestion_lazy_null_invalid() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = null ?? new C();
-class C {}
-''');
- _evaluateConstant(compilationUnit, 'c',
- errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
- experiments: [EnableString.constant_update_2018]);
- }
-
- test_visitBinaryExpression_questionQuestion_lazy_null_notNull() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = null ?? 'b';
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.stringType);
- expect(result.toStringValue(), 'b');
- }
-
- test_visitBinaryExpression_questionQuestion_lazy_null_null() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = null ?? null;
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
+ DartObjectImpl result = _evaluateConstant('c');
expect(result.isNull, isTrue);
}
- test_visitBinaryExpression_xor_bool_known_known() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = false ^ true;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_xor_bool_known_unknown() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const b = bool.fromEnvironment('y');
-const c = false ^ b;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_xor_bool_unknown_known() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = bool.fromEnvironment('x');
-const c = a ^ true;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_xor_bool_unknown_unknown() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = bool.fromEnvironment('x');
-const b = bool.fromEnvironment('y');
-const c = a ^ b;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- }
-
- test_visitBinaryExpression_xor_int() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = 3 ^ 5;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.intType);
- }
-
- test_visitBinaryExpression_xor_mixed() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = 3 ^ false;
-''');
- _evaluateConstant(compilationUnit, 'c',
- errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT],
- experiments: [EnableString.constant_update_2018]);
- }
-
test_visitConditionalExpression_eager_false_int_int() async {
- Expression thenExpression = AstTestFactory.integer(1);
- Expression elseExpression = AstTestFactory.integer(0);
- ConditionalExpression expression = AstTestFactory.conditionalExpression(
- AstTestFactory.booleanLiteral(false), thenExpression, elseExpression);
- GatheringErrorListener errorListener = new GatheringErrorListener();
- ErrorReporter errorReporter =
- new ErrorReporter(errorListener, _dummySource());
- _assertValue(0, _evaluate(expression, errorReporter));
- errorListener.assertNoErrors();
+ await _resolveTestCode('''
+const c = false ? 1 : 0;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.intType);
+ expect(result.toIntValue(), 0);
}
test_visitConditionalExpression_eager_invalid_int_int() async {
- Expression thenExpression = AstTestFactory.integer(1);
- Expression elseExpression = AstTestFactory.integer(0);
- NullLiteral conditionExpression = AstTestFactory.nullLiteral();
- ConditionalExpression expression = AstTestFactory.conditionalExpression(
- conditionExpression, thenExpression, elseExpression);
- GatheringErrorListener errorListener = new GatheringErrorListener();
- ErrorReporter errorReporter =
- new ErrorReporter(errorListener, _dummySource());
- DartObjectImpl result = _evaluate(expression, errorReporter);
+ await _resolveTestCode('''
+const c = null ? 1 : 0;
+''');
+ DartObjectImpl result = _evaluateConstant(
+ 'c',
+ errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL],
+ );
expect(result, isNull);
- errorListener
- .assertErrorsWithCodes([CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
}
test_visitConditionalExpression_eager_true_int_int() async {
- Expression thenExpression = AstTestFactory.integer(1);
- Expression elseExpression = AstTestFactory.integer(0);
- ConditionalExpression expression = AstTestFactory.conditionalExpression(
- AstTestFactory.booleanLiteral(true), thenExpression, elseExpression);
- GatheringErrorListener errorListener = new GatheringErrorListener();
- ErrorReporter errorReporter =
- new ErrorReporter(errorListener, _dummySource());
- _assertValue(1, _evaluate(expression, errorReporter));
- errorListener.assertNoErrors();
+ await _resolveTestCode('''
+const c = true ? 1 : 0;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.intType);
+ expect(result.toIntValue(), 1);
}
test_visitConditionalExpression_eager_true_int_invalid() async {
- Expression thenExpression = AstTestFactory.integer(1);
- Expression elseExpression = AstTestFactory.identifier3("x");
- ConditionalExpression expression = AstTestFactory.conditionalExpression(
- AstTestFactory.booleanLiteral(true), thenExpression, elseExpression);
- GatheringErrorListener errorListener = new GatheringErrorListener();
- ErrorReporter errorReporter =
- new ErrorReporter(errorListener, _dummySource());
- DartObjectImpl result = _evaluate(expression, errorReporter);
+ await _resolveTestCode('''
+const c = true ? 1 : x;
+''');
+ DartObjectImpl result = _evaluateConstant(
+ 'c',
+ errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
+ );
expect(result, isNull);
- errorListener
- .assertErrorsWithCodes([CompileTimeErrorCode.INVALID_CONSTANT]);
}
test_visitConditionalExpression_eager_true_invalid_int() async {
- Expression thenExpression = AstTestFactory.identifier3("x");
- Expression elseExpression = AstTestFactory.integer(0);
- ConditionalExpression expression = AstTestFactory.conditionalExpression(
- AstTestFactory.booleanLiteral(true), thenExpression, elseExpression);
- GatheringErrorListener errorListener = new GatheringErrorListener();
- ErrorReporter errorReporter =
- new ErrorReporter(errorListener, _dummySource());
- DartObjectImpl result = _evaluate(expression, errorReporter);
+ await _resolveTestCode('''
+const c = true ? x : 0;
+''');
+ DartObjectImpl result = _evaluateConstant(
+ 'c',
+ errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
+ );
expect(result, isNull);
- errorListener
- .assertErrorsWithCodes([CompileTimeErrorCode.INVALID_CONSTANT]);
- }
-
- test_visitConditionalExpression_lazy_false_int_int() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = false ? 1 : 0;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.intType);
- expect(result.toIntValue(), 0);
- }
-
- test_visitConditionalExpression_lazy_false_int_invalid() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = false ? 1 : new C();
-''');
- _evaluateConstant(compilationUnit, 'c',
- errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
- experiments: [EnableString.constant_update_2018]);
- }
-
- test_visitConditionalExpression_lazy_false_invalid_int() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = false ? new C() : 0;
-class C {}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.intType);
- expect(result.toIntValue(), 0);
- }
-
- test_visitConditionalExpression_lazy_invalid_int_int() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = 3 ? 1 : 0;
-''');
- _evaluateConstant(compilationUnit, 'c',
- errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL],
- experiments: [EnableString.constant_update_2018]);
- }
-
- test_visitConditionalExpression_lazy_true_int_int() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = true ? 1 : 0;
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.intType);
- expect(result.toIntValue(), 1);
- }
-
- test_visitConditionalExpression_lazy_true_int_invalid() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = true ? 1 : new C();
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.intType);
- expect(result.toIntValue(), 1);
- }
-
- test_visitConditionalExpression_lazy_true_invalid_int() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const c = true ? new C() : 0;
-class C {}
-''');
- _evaluateConstant(compilationUnit, 'c',
- errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT],
- experiments: [EnableString.constant_update_2018]);
}
test_visitIntegerLiteral() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const double d = 3;
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'd');
+ DartObjectImpl result = _evaluateConstant('d');
expect(result.type, typeProvider.doubleType);
expect(result.toDoubleValue(), 3.0);
}
- test_visitIsExpression_is_instanceOfSameClass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const A();
-const b = a is A;
-class A {
- const A();
-}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), true);
- }
-
- test_visitIsExpression_is_instanceOfSubclass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const B();
-const b = a is A;
-class A {
- const A();
-}
-class B extends A {
- const B();
-}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), true);
- }
-
- test_visitIsExpression_is_instanceOfSuperclass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const A();
-const b = a is B;
-class A {
- const A();
-}
-class B extends A {
- const B();
-}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), false);
- }
-
- test_visitIsExpression_is_instanceOfUnrelatedClass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const A();
-const b = a is B;
-class A {
- const A();
-}
-class B {
- const B();
-}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), false);
- }
-
- test_visitIsExpression_is_null() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = null;
-const b = a is A;
-class A {}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), false);
- }
-
- test_visitIsExpression_is_null_dynamic() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = null;
-const b = a is dynamic;
-class A {}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), true);
- }
-
- test_visitIsExpression_is_null_null() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = null;
-const b = a is Null;
-class A {}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), true);
- }
-
- test_visitIsExpression_is_null_object() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = null;
-const b = a is Object;
-class A {}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), true);
- }
-
- test_visitIsExpression_isNot_instanceOfSameClass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const A();
-const b = a is! A;
-class A {
- const A();
-}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), false);
- }
-
- test_visitIsExpression_isNot_instanceOfSubclass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const B();
-const b = a is! A;
-class A {
- const A();
-}
-class B extends A {
- const B();
-}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), false);
- }
-
- test_visitIsExpression_isNot_instanceOfSuperclass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const A();
-const b = a is! B;
-class A {
- const A();
-}
-class B extends A {
- const B();
-}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), true);
- }
-
- test_visitIsExpression_isNot_instanceOfUnrelatedClass() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = const A();
-const b = a is! B;
-class A {
- const A();
-}
-class B {
- const B();
-}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), true);
- }
-
- test_visitIsExpression_isNot_null() async {
- CompilationUnit compilationUnit = await resolveSource('''
-const a = null;
-const b = a is! A;
-class A {}
-''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'b',
- experiments: [EnableString.constant_update_2018]);
- expect(result.type, typeProvider.boolType);
- expect(result.toBoolValue(), true);
- }
-
test_visitSimpleIdentifier_className() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const a = C;
class C {}
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'a');
+ DartObjectImpl result = _evaluateConstant('a');
expect(result.type, typeProvider.typeType);
expect(result.toTypeValue().name, 'C');
}
test_visitSimpleIdentifier_dynamic() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const a = dynamic;
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'a');
+ DartObjectImpl result = _evaluateConstant('a');
expect(result.type, typeProvider.typeType);
expect(result.toTypeValue(), typeProvider.dynamicType);
}
test_visitSimpleIdentifier_inEnvironment() async {
- CompilationUnit compilationUnit = await resolveSource(r'''
+ await _resolveTestCode(r'''
const a = b;
const b = 3;''');
- Map<String, DartObjectImpl> environment = new Map<String, DartObjectImpl>();
- DartObjectImpl six =
- new DartObjectImpl(typeProvider.intType, new IntState(6));
- environment["b"] = six;
- _assertValue(
- 6,
- _evaluateConstant(compilationUnit, "a",
- lexicalEnvironment: environment));
+ var environment = <String, DartObjectImpl>{
+ 'b': DartObjectImpl(typeProvider.intType, IntState(6)),
+ };
+ var result = _evaluateConstant('a', lexicalEnvironment: environment);
+ expect(result.type, typeProvider.intType);
+ expect(result.toIntValue(), 6);
}
test_visitSimpleIdentifier_notInEnvironment() async {
- CompilationUnit compilationUnit = await resolveSource(r'''
+ await _resolveTestCode(r'''
const a = b;
const b = 3;''');
- Map<String, DartObjectImpl> environment = new Map<String, DartObjectImpl>();
- DartObjectImpl six =
- new DartObjectImpl(typeProvider.intType, new IntState(6));
- environment["c"] = six;
- _assertValue(
- 3,
- _evaluateConstant(compilationUnit, "a",
- lexicalEnvironment: environment));
+ var environment = <String, DartObjectImpl>{
+ 'c': DartObjectImpl(typeProvider.intType, IntState(6)),
+ };
+ var result = _evaluateConstant('a', lexicalEnvironment: environment);
+ expect(result.type, typeProvider.intType);
+ expect(result.toIntValue(), 3);
}
test_visitSimpleIdentifier_withoutEnvironment() async {
- CompilationUnit compilationUnit = await resolveSource(r'''
+ await _resolveTestCode(r'''
const a = b;
const b = 3;''');
- _assertValue(3, _evaluateConstant(compilationUnit, "a"));
- }
-
- void _assertValue(int expectedValue, DartObjectImpl result) {
- expect(result, isNotNull);
- expect(result.type.name, "int");
- expect(result.toIntValue(), expectedValue);
- }
-
- NonExistingSource _dummySource() {
- String path = '/test.dart';
- return new NonExistingSource(path, toUri(path), UriKind.FILE_URI);
- }
-
- DartObjectImpl _evaluate(Expression expression, ErrorReporter errorReporter) {
- TestTypeProvider typeProvider = new TestTypeProvider();
- return expression.accept(new ConstantVisitor(
- new ConstantEvaluationEngine(typeProvider, new DeclaredVariables(),
- typeSystem: new Dart2TypeSystem(typeProvider)),
- errorReporter));
+ var result = _evaluateConstant('a');
+ expect(result.type, typeProvider.intType);
+ expect(result.toIntValue(), 3);
}
}
-@reflectiveTest
-class ConstantVisitorTest_Driver extends ConstantVisitorTest {
- bool get enableNewAnalysisDriver => true;
-}
+class ConstantVisitorTestSupport extends DriverResolutionTest {
+ DartObjectImpl _evaluateConstant(
+ String name, {
+ List<ErrorCode> errorCodes,
+ Map<String, DartObjectImpl> lexicalEnvironment,
+ }) {
+ var options = driver.analysisOptions as AnalysisOptionsImpl;
+ var expression = findNode.topVariableDeclarationByName(name).initializer;
-class ConstantVisitorTestSupport extends ResolverTestCase {
- @override
- List<String> get enabledExperiments => [];
+ var source = this.result.unit.declaredElement.source;
+ var errorListener = GatheringErrorListener();
+ var errorReporter = ErrorReporter(errorListener, source);
- DartObjectImpl _evaluateConstant(CompilationUnit compilationUnit, String name,
- {List<ErrorCode> errorCodes,
- List<String> experiments,
- Map<String, DartObjectImpl> lexicalEnvironment}) {
- Source source =
- resolutionMap.elementDeclaredByCompilationUnit(compilationUnit).source;
- Expression expression =
- findTopLevelConstantExpression(compilationUnit, name);
-
- AnalysisOptionsImpl options = new AnalysisOptionsImpl();
- options.enabledExperiments = experiments ?? enabledExperiments;
-
- GatheringErrorListener errorListener = new GatheringErrorListener();
- ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
-
- DartObjectImpl result = expression.accept(new ConstantVisitor(
- new ConstantEvaluationEngine(typeProvider, new DeclaredVariables(),
- experimentStatus: options.experimentStatus, typeSystem: typeSystem),
+ DartObjectImpl result = expression.accept(
+ ConstantVisitor(
+ ConstantEvaluationEngine(
+ typeProvider,
+ new DeclaredVariables(),
+ experimentStatus: options.experimentStatus,
+ typeSystem: this.result.typeSystem,
+ ),
errorReporter,
- lexicalEnvironment: lexicalEnvironment));
+ lexicalEnvironment: lexicalEnvironment,
+ ),
+ );
if (errorCodes == null) {
errorListener.assertNoErrors();
} else {
@@ -832,104 +198,616 @@
}
return result;
}
+
+ Future<CompilationUnit> _resolveTestCode(String code) async {
+ addTestFile(code);
+ await resolveTestFile();
+ return result.unit;
+ }
}
@reflectiveTest
class ConstantVisitorWithConstantUpdate2018Test
extends ConstantVisitorTestSupport {
@override
- List<String> get enabledExperiments => [EnableString.constant_update_2018];
+ AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+ ..enabledExperiments = [EnableString.constant_update_2018];
- bool get enableNewAnalysisDriver => true;
+ test_visitAsExpression_instanceOfSameClass() async {
+ await _resolveTestCode('''
+const a = const A();
+const b = a as A;
+class A {
+ const A();
+}
+''');
+ DartObjectImpl resultA = _evaluateConstant('a');
+ DartObjectImpl resultB = _evaluateConstant('b');
+ expect(resultB, resultA);
+ }
+
+ test_visitAsExpression_instanceOfSubclass() async {
+ await _resolveTestCode('''
+const a = const B();
+const b = a as A;
+class A {
+ const A();
+}
+class B extends A {
+ const B();
+}
+''');
+ DartObjectImpl resultA = _evaluateConstant('a');
+ DartObjectImpl resultB = _evaluateConstant('b');
+ expect(resultB, resultA);
+ }
+
+ test_visitAsExpression_instanceOfSuperclass() async {
+ await _resolveTestCode('''
+const a = const A();
+const b = a as B;
+class A {
+ const A();
+}
+class B extends A {
+ const B();
+}
+''');
+ DartObjectImpl result = _evaluateConstant('b',
+ errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+ expect(result, isNull);
+ }
+
+ test_visitAsExpression_instanceOfUnrelatedClass() async {
+ await _resolveTestCode('''
+const a = const A();
+const b = a as B;
+class A {
+ const A();
+}
+class B {
+ const B();
+}
+''');
+ DartObjectImpl result = _evaluateConstant('b',
+ errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
+ expect(result, isNull);
+ }
+
+ test_visitAsExpression_null() async {
+ await _resolveTestCode('''
+const a = null;
+const b = a as A;
+class A {}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.nullType);
+ }
+
+ test_visitBinaryExpression_and_bool_known_known() async {
+ await _resolveTestCode('''
+const c = false & true;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_and_bool_known_unknown() async {
+ await _resolveTestCode('''
+const b = bool.fromEnvironment('y');
+const c = false & b;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_and_bool_unknown_known() async {
+ await _resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const c = a & true;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_and_bool_unknown_unknown() async {
+ await _resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const b = bool.fromEnvironment('y');
+const c = a & b;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_and_int() async {
+ await _resolveTestCode('''
+const c = 3 & 5;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.intType);
+ }
+
+ test_visitBinaryExpression_and_mixed() async {
+ await _resolveTestCode('''
+const c = 3 & false;
+''');
+ _evaluateConstant('c',
+ errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
+ }
test_visitBinaryExpression_gtGtGt_negative_fewerBits() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = 0xFFFFFFFF >>> 8;
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(result.type, typeProvider.intType);
expect(result.toIntValue(), 0xFFFFFF);
}
test_visitBinaryExpression_gtGtGt_negative_moreBits() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = 0xFFFFFFFF >>> 33;
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(result.type, typeProvider.intType);
expect(result.toIntValue(), 0);
}
test_visitBinaryExpression_gtGtGt_negative_negativeBits() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = 0xFFFFFFFF >>> -2;
''');
- _evaluateConstant(compilationUnit, 'c',
+ _evaluateConstant('c',
errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
}
test_visitBinaryExpression_gtGtGt_negative_zeroBits() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = 0xFFFFFFFF >>> 0;
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(result.type, typeProvider.intType);
expect(result.toIntValue(), 0xFFFFFFFF);
}
test_visitBinaryExpression_gtGtGt_positive_fewerBits() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = 0xFF >>> 3;
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(result.type, typeProvider.intType);
expect(result.toIntValue(), 0x1F);
}
test_visitBinaryExpression_gtGtGt_positive_moreBits() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = 0xFF >>> 9;
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(result.type, typeProvider.intType);
expect(result.toIntValue(), 0);
}
test_visitBinaryExpression_gtGtGt_positive_negativeBits() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = 0xFF >>> -2;
''');
- _evaluateConstant(compilationUnit, 'c',
+ _evaluateConstant('c',
errorCodes: [CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION]);
}
test_visitBinaryExpression_gtGtGt_positive_zeroBits() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = 0xFF >>> 0;
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(result.type, typeProvider.intType);
expect(result.toIntValue(), 0xFF);
}
+
+ test_visitBinaryExpression_or_bool_known_known() async {
+ await _resolveTestCode('''
+const c = false | true;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_or_bool_known_unknown() async {
+ await _resolveTestCode('''
+const b = bool.fromEnvironment('y');
+const c = false | b;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_or_bool_unknown_known() async {
+ await _resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const c = a | true;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_or_bool_unknown_unknown() async {
+ await _resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const b = bool.fromEnvironment('y');
+const c = a | b;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_or_int() async {
+ await _resolveTestCode('''
+const c = 3 | 5;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.intType);
+ }
+
+ test_visitBinaryExpression_or_mixed() async {
+ await _resolveTestCode('''
+const c = 3 | false;
+''');
+ _evaluateConstant('c',
+ errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
+ }
+
+ test_visitBinaryExpression_questionQuestion_lazy_notNull_invalid() async {
+ await _resolveTestCode('''
+const c = 'a' ?? new C();
+class C {}
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.stringType);
+ expect(result.toStringValue(), 'a');
+ }
+
+ test_visitBinaryExpression_questionQuestion_lazy_notNull_notNull() async {
+ await _resolveTestCode('''
+const c = 'a' ?? 'b';
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.stringType);
+ expect(result.toStringValue(), 'a');
+ }
+
+ test_visitBinaryExpression_questionQuestion_lazy_null_invalid() async {
+ await _resolveTestCode('''
+const c = null ?? new C();
+class C {}
+''');
+ _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+ }
+
+ test_visitBinaryExpression_questionQuestion_lazy_null_notNull() async {
+ await _resolveTestCode('''
+const c = null ?? 'b';
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.stringType);
+ expect(result.toStringValue(), 'b');
+ }
+
+ test_visitBinaryExpression_questionQuestion_lazy_null_null() async {
+ await _resolveTestCode('''
+const c = null ?? null;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.isNull, isTrue);
+ }
+
+ test_visitBinaryExpression_xor_bool_known_known() async {
+ await _resolveTestCode('''
+const c = false ^ true;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_xor_bool_known_unknown() async {
+ await _resolveTestCode('''
+const b = bool.fromEnvironment('y');
+const c = false ^ b;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_xor_bool_unknown_known() async {
+ await _resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const c = a ^ true;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_xor_bool_unknown_unknown() async {
+ await _resolveTestCode('''
+const a = bool.fromEnvironment('x');
+const b = bool.fromEnvironment('y');
+const c = a ^ b;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.boolType);
+ }
+
+ test_visitBinaryExpression_xor_int() async {
+ await _resolveTestCode('''
+const c = 3 ^ 5;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.intType);
+ }
+
+ test_visitBinaryExpression_xor_mixed() async {
+ await _resolveTestCode('''
+const c = 3 ^ false;
+''');
+ _evaluateConstant('c',
+ errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_INT]);
+ }
+
+ test_visitConditionalExpression_lazy_false_int_int() async {
+ await _resolveTestCode('''
+const c = false ? 1 : 0;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.intType);
+ expect(result.toIntValue(), 0);
+ }
+
+ test_visitConditionalExpression_lazy_false_int_invalid() async {
+ await _resolveTestCode('''
+const c = false ? 1 : new C();
+''');
+ _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+ }
+
+ test_visitConditionalExpression_lazy_false_invalid_int() async {
+ await _resolveTestCode('''
+const c = false ? new C() : 0;
+class C {}
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.intType);
+ expect(result.toIntValue(), 0);
+ }
+
+ test_visitConditionalExpression_lazy_invalid_int_int() async {
+ await _resolveTestCode('''
+const c = 3 ? 1 : 0;
+''');
+ _evaluateConstant('c',
+ errorCodes: [CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL]);
+ }
+
+ test_visitConditionalExpression_lazy_true_int_int() async {
+ await _resolveTestCode('''
+const c = true ? 1 : 0;
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.intType);
+ expect(result.toIntValue(), 1);
+ }
+
+ test_visitConditionalExpression_lazy_true_int_invalid() async {
+ await _resolveTestCode('''
+const c = true ? 1 : new C();
+''');
+ DartObjectImpl result = _evaluateConstant('c');
+ expect(result.type, typeProvider.intType);
+ expect(result.toIntValue(), 1);
+ }
+
+ test_visitConditionalExpression_lazy_true_invalid_int() async {
+ await _resolveTestCode('''
+const c = true ? new C() : 0;
+class C {}
+''');
+ _evaluateConstant('c', errorCodes: [CompileTimeErrorCode.INVALID_CONSTANT]);
+ }
+
+ test_visitIsExpression_is_instanceOfSameClass() async {
+ await _resolveTestCode('''
+const a = const A();
+const b = a is A;
+class A {
+ const A();
+}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), true);
+ }
+
+ test_visitIsExpression_is_instanceOfSubclass() async {
+ await _resolveTestCode('''
+const a = const B();
+const b = a is A;
+class A {
+ const A();
+}
+class B extends A {
+ const B();
+}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), true);
+ }
+
+ test_visitIsExpression_is_instanceOfSuperclass() async {
+ await _resolveTestCode('''
+const a = const A();
+const b = a is B;
+class A {
+ const A();
+}
+class B extends A {
+ const B();
+}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), false);
+ }
+
+ test_visitIsExpression_is_instanceOfUnrelatedClass() async {
+ await _resolveTestCode('''
+const a = const A();
+const b = a is B;
+class A {
+ const A();
+}
+class B {
+ const B();
+}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), false);
+ }
+
+ test_visitIsExpression_is_null() async {
+ await _resolveTestCode('''
+const a = null;
+const b = a is A;
+class A {}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), false);
+ }
+
+ test_visitIsExpression_is_null_dynamic() async {
+ await _resolveTestCode('''
+const a = null;
+const b = a is dynamic;
+class A {}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), true);
+ }
+
+ test_visitIsExpression_is_null_null() async {
+ await _resolveTestCode('''
+const a = null;
+const b = a is Null;
+class A {}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), true);
+ }
+
+ test_visitIsExpression_is_null_object() async {
+ await _resolveTestCode('''
+const a = null;
+const b = a is Object;
+class A {}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), true);
+ }
+
+ test_visitIsExpression_isNot_instanceOfSameClass() async {
+ await _resolveTestCode('''
+const a = const A();
+const b = a is! A;
+class A {
+ const A();
+}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), false);
+ }
+
+ test_visitIsExpression_isNot_instanceOfSubclass() async {
+ await _resolveTestCode('''
+const a = const B();
+const b = a is! A;
+class A {
+ const A();
+}
+class B extends A {
+ const B();
+}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), false);
+ }
+
+ test_visitIsExpression_isNot_instanceOfSuperclass() async {
+ await _resolveTestCode('''
+const a = const A();
+const b = a is! B;
+class A {
+ const A();
+}
+class B extends A {
+ const B();
+}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), true);
+ }
+
+ test_visitIsExpression_isNot_instanceOfUnrelatedClass() async {
+ await _resolveTestCode('''
+const a = const A();
+const b = a is! B;
+class A {
+ const A();
+}
+class B {
+ const B();
+}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), true);
+ }
+
+ test_visitIsExpression_isNot_null() async {
+ await _resolveTestCode('''
+const a = null;
+const b = a is! A;
+class A {}
+''');
+ DartObjectImpl result = _evaluateConstant('b');
+ expect(result.type, typeProvider.boolType);
+ expect(result.toBoolValue(), true);
+ }
}
@reflectiveTest
class ConstantVisitorWithFlowControlAndSpreadCollectionsTest
extends ConstantVisitorTestSupport {
@override
- List<String> get enabledExperiments => [
- EnableString.control_flow_collections,
- EnableString.set_literals,
- EnableString.spread_collections
- ];
-
- bool get enableNewAnalysisDriver => true;
+ AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+ ..enabledExperiments = [
+ EnableString.control_flow_collections,
+ EnableString.set_literals,
+ EnableString.spread_collections
+ ];
test_listLiteral_nested() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = [1, if (1 > 0) if (2 > 1) 2, 3];
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
// The expected type ought to be `List<int>`, but type inference isn't yet
// implemented.
expect(
@@ -938,50 +816,50 @@
}
test_listLiteral_withIf_false_withElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = [1, if (1 < 0) 2 else 3, 4];
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.listType.instantiate([typeProvider.intType]));
expect(result.toListValue().map((e) => e.toIntValue()), [1, 3, 4]);
}
test_listLiteral_withIf_false_withoutElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = [1, if (1 < 0) 2, 3];
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.listType.instantiate([typeProvider.intType]));
expect(result.toListValue().map((e) => e.toIntValue()), [1, 3]);
}
test_listLiteral_withIf_true_withElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = [1, if (1 > 0) 2 else 3, 4];
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.listType.instantiate([typeProvider.intType]));
expect(result.toListValue().map((e) => e.toIntValue()), [1, 2, 4]);
}
test_listLiteral_withIf_true_withoutElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = [1, if (1 > 0) 2, 3];
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.listType.instantiate([typeProvider.intType]));
expect(result.toListValue().map((e) => e.toIntValue()), [1, 2, 3]);
}
test_listLiteral_withSpread() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = [1, ...[2, 3], 4];
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.listType.instantiate([typeProvider.intType]));
expect(result.toListValue().map((e) => e.toIntValue()), [1, 2, 3, 4]);
@@ -990,10 +868,10 @@
@failingTest
test_mapLiteral_nested() async {
// Fails because we're not yet parsing nested elements.
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {'a' : 1, if (1 > 0) if (2 > 1) {'b' : 2}, 'c' : 3};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type,
typeProvider.mapType
@@ -1005,10 +883,10 @@
}
test_mapLiteral_withIf_false_withElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {'a' : 1, if (1 < 0) 'b' : 2 else 'c' : 3, 'd' : 4};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type,
typeProvider.mapType
@@ -1020,10 +898,10 @@
}
test_mapLiteral_withIf_false_withoutElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {'a' : 1, if (1 < 0) 'b' : 2, 'c' : 3};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type,
typeProvider.mapType
@@ -1035,10 +913,10 @@
}
test_mapLiteral_withIf_true_withElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {'a' : 1, if (1 > 0) 'b' : 2 else 'c' : 3, 'd' : 4};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type,
typeProvider.mapType
@@ -1050,10 +928,10 @@
}
test_mapLiteral_withIf_true_withoutElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {'a' : 1, if (1 > 0) 'b' : 2, 'c' : 3};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type,
typeProvider.mapType
@@ -1065,10 +943,10 @@
}
test_mapLiteral_withSpread() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {'a' : 1, ...{'b' : 2, 'c' : 3}, 'd' : 4};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type,
typeProvider.mapType
@@ -1081,60 +959,60 @@
}
test_setLiteral_nested() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {1, if (1 > 0) if (2 > 1) 2, 3};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.setType.instantiate([typeProvider.intType]));
expect(result.toSetValue().map((e) => e.toIntValue()), [1, 2, 3]);
}
test_setLiteral_withIf_false_withElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {1, if (1 < 0) 2 else 3, 4};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.setType.instantiate([typeProvider.intType]));
expect(result.toSetValue().map((e) => e.toIntValue()), [1, 3, 4]);
}
test_setLiteral_withIf_false_withoutElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {1, if (1 < 0) 2, 3};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.setType.instantiate([typeProvider.intType]));
expect(result.toSetValue().map((e) => e.toIntValue()), [1, 3]);
}
test_setLiteral_withIf_true_withElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {1, if (1 > 0) 2 else 3, 4};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.setType.instantiate([typeProvider.intType]));
expect(result.toSetValue().map((e) => e.toIntValue()), [1, 2, 4]);
}
test_setLiteral_withIf_true_withoutElse() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {1, if (1 > 0) 2, 3};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.setType.instantiate([typeProvider.intType]));
expect(result.toSetValue().map((e) => e.toIntValue()), [1, 2, 3]);
}
test_setLiteral_withSpread() async {
- CompilationUnit compilationUnit = await resolveSource('''
+ await _resolveTestCode('''
const c = {1, ...{2, 3}, 4};
''');
- DartObjectImpl result = _evaluateConstant(compilationUnit, 'c');
+ DartObjectImpl result = _evaluateConstant('c');
expect(
result.type, typeProvider.setType.instantiate([typeProvider.intType]));
expect(result.toSetValue().map((e) => e.toIntValue()), [1, 2, 3, 4]);