| Index: tests/compiler/dart2js/constant_expression_test.dart
|
| diff --git a/tests/compiler/dart2js/constant_expression_test.dart b/tests/compiler/dart2js/constant_expression_test.dart
|
| index 16ec71e28fdbad3e2e4d5c1858af9f78cd1b45e0..7013167e36397aff03fcf4bc0aaefc095f6a7b99 100644
|
| --- a/tests/compiler/dart2js/constant_expression_test.dart
|
| +++ b/tests/compiler/dart2js/constant_expression_test.dart
|
| @@ -15,6 +15,7 @@ import 'memory_compiler.dart';
|
| class TestData {
|
| /// Declarations needed for the [constants].
|
| final String declarations;
|
| +
|
| /// Tested constants.
|
| final List constants;
|
|
|
| @@ -24,20 +25,21 @@ class TestData {
|
| class ConstantData {
|
| /// Source code for the constant expression.
|
| final String code;
|
| +
|
| /// The expected constant expression kind.
|
| final ConstantExpressionKind kind;
|
| +
|
| /// ConstantExpression.getText() result if different from [code].
|
| final String text;
|
| +
|
| /// The expected instance type for ConstructedConstantExpression.
|
| final String type;
|
| +
|
| /// The expected instance fields for ConstructedConstantExpression.
|
| final Map<String, String> fields;
|
|
|
| - const ConstantData(String code,
|
| - this.kind,
|
| - {String text,
|
| - this.type,
|
| - this.fields})
|
| + const ConstantData(String code, this.kind,
|
| + {String text, this.type, this.fields})
|
| : this.code = code,
|
| this.text = text != null ? text : code;
|
| }
|
| @@ -58,7 +60,7 @@ const List<TestData> DATA = const [
|
| const ConstantData('"foo".length', ConstantExpressionKind.STRING_LENGTH),
|
| const ConstantData('identical(0, 1)', ConstantExpressionKind.IDENTICAL),
|
| const ConstantData('"a" "b"', ConstantExpressionKind.CONCATENATE,
|
| - text: '"ab"'),
|
| + text: '"ab"'),
|
| const ConstantData('identical', ConstantExpressionKind.FUNCTION),
|
| const ConstantData('true ? 0 : 1', ConstantExpressionKind.CONDITIONAL),
|
| const ConstantData('proxy', ConstantExpressionKind.VARIABLE),
|
| @@ -67,19 +69,18 @@ const List<TestData> DATA = const [
|
| const ConstantData('const [0, 1]', ConstantExpressionKind.LIST),
|
| const ConstantData('const <int>[0, 1]', ConstantExpressionKind.LIST),
|
| const ConstantData('const {0: 1, 2: 3}', ConstantExpressionKind.MAP),
|
| - const ConstantData('const <int, int>{0: 1, 2: 3}',
|
| - ConstantExpressionKind.MAP),
|
| const ConstantData(
|
| - 'const bool.fromEnvironment("foo", defaultValue: false)',
|
| + 'const <int, int>{0: 1, 2: 3}', ConstantExpressionKind.MAP),
|
| + const ConstantData('const bool.fromEnvironment("foo", defaultValue: false)',
|
| ConstantExpressionKind.BOOL_FROM_ENVIRONMENT),
|
| - const ConstantData(
|
| - 'const int.fromEnvironment("foo", defaultValue: 42)',
|
| + const ConstantData('const int.fromEnvironment("foo", defaultValue: 42)',
|
| ConstantExpressionKind.INT_FROM_ENVIRONMENT),
|
| const ConstantData(
|
| 'const String.fromEnvironment("foo", defaultValue: "bar")',
|
| ConstantExpressionKind.STRING_FROM_ENVIRONMENT),
|
| ]),
|
| - const TestData('''
|
| + const TestData(
|
| + '''
|
| class A {
|
| const A();
|
| }
|
| @@ -92,58 +93,54 @@ class C extends B {
|
| const C({field1: 42, this.field2: false}) : super(field1);
|
| const C.named([field = false]) : this(field1: field, field2: field);
|
| }
|
| -''', const [
|
| - const ConstantData('const Object()',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'Object', fields: const {}),
|
| - const ConstantData('const A()',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'A', fields: const {}),
|
| - const ConstantData('const B(0)',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'B',
|
| - fields: const {'field(B#field1)': '0'}),
|
| - const ConstantData('const B(const A())',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'B',
|
| - fields: const {'field(B#field1)': 'const A()'}),
|
| - const ConstantData('const C()',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'C',
|
| - fields: const {
|
| - 'field(B#field1)': '42',
|
| - 'field(C#field2)': 'false',
|
| - }),
|
| - const ConstantData('const C(field1: 87)',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'C',
|
| - fields: const {
|
| - 'field(B#field1)': '87',
|
| - 'field(C#field2)': 'false',
|
| - }),
|
| - const ConstantData('const C(field2: true)',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'C',
|
| - fields: const {
|
| - 'field(B#field1)': '42',
|
| - 'field(C#field2)': 'true',
|
| - }),
|
| - const ConstantData('const C.named()',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'C',
|
| - fields: const {
|
| - 'field(B#field1)': 'false',
|
| - 'field(C#field2)': 'false',
|
| - }),
|
| - const ConstantData('const C.named(87)',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'C',
|
| - fields: const {
|
| - 'field(B#field1)': '87',
|
| - 'field(C#field2)': '87',
|
| - }),
|
| - ]),
|
| - const TestData('''
|
| +''',
|
| + const [
|
| + const ConstantData('const Object()', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'Object', fields: const {}),
|
| + const ConstantData('const A()', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'A', fields: const {}),
|
| + const ConstantData('const B(0)', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'B', fields: const {'field(B#field1)': '0'}),
|
| + const ConstantData(
|
| + 'const B(const A())', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'B', fields: const {'field(B#field1)': 'const A()'}),
|
| + const ConstantData('const C()', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'C',
|
| + fields: const {
|
| + 'field(B#field1)': '42',
|
| + 'field(C#field2)': 'false',
|
| + }),
|
| + const ConstantData(
|
| + 'const C(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'C',
|
| + fields: const {
|
| + 'field(B#field1)': '87',
|
| + 'field(C#field2)': 'false',
|
| + }),
|
| + const ConstantData(
|
| + 'const C(field2: true)', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'C',
|
| + fields: const {
|
| + 'field(B#field1)': '42',
|
| + 'field(C#field2)': 'true',
|
| + }),
|
| + const ConstantData(
|
| + 'const C.named()', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'C',
|
| + fields: const {
|
| + 'field(B#field1)': 'false',
|
| + 'field(C#field2)': 'false',
|
| + }),
|
| + const ConstantData(
|
| + 'const C.named(87)', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'C',
|
| + fields: const {
|
| + 'field(B#field1)': '87',
|
| + 'field(C#field2)': '87',
|
| + }),
|
| + ]),
|
| + const TestData(
|
| + '''
|
| class A<T> implements B {
|
| final field1;
|
| const A({this.field1:42});
|
| @@ -157,43 +154,42 @@ class B<S> implements C {
|
| class C<U> {
|
| const factory C({field1}) = A<B<double>>;
|
| }
|
| -''', const [
|
| - const ConstantData('const A()', ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'A<dynamic>',
|
| - fields: const {'field(A#field1)': '42'}),
|
| - const ConstantData('const A<int>(field1: 87)',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'A<int>',
|
| - fields: const {'field(A#field1)': '87'}),
|
| - const ConstantData('const B()', ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'A<B<dynamic>>',
|
| - fields: const {
|
| - 'field(A#field1)': '42',
|
| - }),
|
| - const ConstantData('const B<int>()', ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'A<B<int>>',
|
| - fields: const {
|
| - 'field(A#field1)': '42',
|
| - }),
|
| - const ConstantData('const B<int>(field1: 87)',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'A<B<int>>',
|
| - fields: const {
|
| - 'field(A#field1)': '87',
|
| - }),
|
| - const ConstantData('const C<int>(field1: 87)',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'A<B<double>>',
|
| - fields: const {
|
| - 'field(A#field1)': '87',
|
| - }),
|
| - const ConstantData('const B<int>.named()',
|
| - ConstantExpressionKind.CONSTRUCTED,
|
| - type: 'A<int>',
|
| - fields: const {
|
| - 'field(A#field1)': '42',
|
| - }),
|
| - ]),
|
| +''',
|
| + const [
|
| + const ConstantData('const A()', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'A<dynamic>', fields: const {'field(A#field1)': '42'}),
|
| + const ConstantData(
|
| + 'const A<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'A<int>', fields: const {'field(A#field1)': '87'}),
|
| + const ConstantData('const B()', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'A<B<dynamic>>',
|
| + fields: const {
|
| + 'field(A#field1)': '42',
|
| + }),
|
| + const ConstantData('const B<int>()', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'A<B<int>>',
|
| + fields: const {
|
| + 'field(A#field1)': '42',
|
| + }),
|
| + const ConstantData(
|
| + 'const B<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'A<B<int>>',
|
| + fields: const {
|
| + 'field(A#field1)': '87',
|
| + }),
|
| + const ConstantData(
|
| + 'const C<int>(field1: 87)', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'A<B<double>>',
|
| + fields: const {
|
| + 'field(A#field1)': '87',
|
| + }),
|
| + const ConstantData(
|
| + 'const B<int>.named()', ConstantExpressionKind.CONSTRUCTED,
|
| + type: 'A<int>',
|
| + fields: const {
|
| + 'field(A#field1)': '42',
|
| + }),
|
| + ]),
|
| ];
|
|
|
| main() {
|
| @@ -212,35 +208,44 @@ Future testData(TestData data) async {
|
| sb.write('main() {}\n');
|
| String source = sb.toString();
|
| CompilationResult result = await runCompiler(
|
| - memorySourceFiles: {'main.dart': source},
|
| - options: ['--analyze-all']);
|
| + memorySourceFiles: {'main.dart': source}, options: ['--analyze-all']);
|
| Compiler compiler = result.compiler;
|
| var library = compiler.mainApp;
|
| constants.forEach((String name, ConstantData data) {
|
| FieldElement field = library.localLookup(name);
|
| var constant = field.constant;
|
| - Expect.equals(data.kind, constant.kind,
|
| + Expect.equals(
|
| + data.kind,
|
| + constant.kind,
|
| "Unexpected kind '${constant.kind}' for contant "
|
| "`${constant.toDartText()}`, expected '${data.kind}'.");
|
| - Expect.equals(data.text, constant.toDartText(),
|
| + Expect.equals(
|
| + data.text,
|
| + constant.toDartText(),
|
| "Unexpected text '${constant.toDartText()}' for contant, "
|
| "expected '${data.text}'.");
|
| if (data.type != null) {
|
| String instanceType = constant.computeInstanceType().toString();
|
| - Expect.equals(data.type, instanceType,
|
| + Expect.equals(
|
| + data.type,
|
| + instanceType,
|
| "Unexpected type '$instanceType' for contant "
|
| "`${constant.toDartText()}`, expected '${data.type}'.");
|
| }
|
| if (data.fields != null) {
|
| Map instanceFields = constant.computeInstanceFields();
|
| - Expect.equals(data.fields.length, instanceFields.length,
|
| + Expect.equals(
|
| + data.fields.length,
|
| + instanceFields.length,
|
| "Unexpected field count ${instanceFields.length} for contant "
|
| "`${constant.toDartText()}`, expected '${data.fields.length}'.");
|
| instanceFields.forEach((field, expression) {
|
| String name = '$field';
|
| String expression = instanceFields[field].toDartText();
|
| String expected = data.fields[name];
|
| - Expect.equals(expected, expression,
|
| + Expect.equals(
|
| + expected,
|
| + expression,
|
| "Unexpected field expression ${expression} for field '$name' in "
|
| "contant `${constant.toDartText()}`, expected '${expected}'.");
|
| });
|
|
|