| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library constant_expression_test; | 5 library constant_expression_test; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'package:async_helper/async_helper.dart'; | 8 import 'package:async_helper/async_helper.dart'; |
| 9 import 'package:expect/expect.dart'; | 9 import 'package:expect/expect.dart'; |
| 10 import 'package:compiler/src/constants/expressions.dart'; | 10 import 'package:compiler/src/constants/expressions.dart'; |
| 11 import 'package:compiler/src/compiler.dart'; | 11 import 'package:compiler/src/compiler.dart'; |
| 12 import 'package:compiler/src/elements/elements.dart'; | 12 import 'package:compiler/src/elements/elements.dart'; |
| 13 import 'memory_compiler.dart'; | 13 import 'memory_compiler.dart'; |
| 14 import 'constant_expression_evaluate_test.dart' show MemoryEnvironment; |
| 14 | 15 |
| 15 class TestData { | 16 class TestData { |
| 16 /// Declarations needed for the [constants]. | 17 /// Declarations needed for the [constants]. |
| 17 final String declarations; | 18 final String declarations; |
| 18 | 19 |
| 19 /// Tested constants. | 20 /// Tested constants. |
| 20 final List constants; | 21 final List constants; |
| 21 | 22 |
| 22 const TestData(this.declarations, this.constants); | 23 const TestData(this.declarations, this.constants); |
| 23 } | 24 } |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 const ConstantData('1 == 2', ConstantExpressionKind.BINARY), | 57 const ConstantData('1 == 2', ConstantExpressionKind.BINARY), |
| 57 const ConstantData('1 != 2', ConstantExpressionKind.BINARY), | 58 const ConstantData('1 != 2', ConstantExpressionKind.BINARY), |
| 58 const ConstantData('1 ?? 2', ConstantExpressionKind.BINARY), | 59 const ConstantData('1 ?? 2', ConstantExpressionKind.BINARY), |
| 59 const ConstantData('-(1)', ConstantExpressionKind.UNARY, text: '-1'), | 60 const ConstantData('-(1)', ConstantExpressionKind.UNARY, text: '-1'), |
| 60 const ConstantData('"foo".length', ConstantExpressionKind.STRING_LENGTH), | 61 const ConstantData('"foo".length', ConstantExpressionKind.STRING_LENGTH), |
| 61 const ConstantData('identical(0, 1)', ConstantExpressionKind.IDENTICAL), | 62 const ConstantData('identical(0, 1)', ConstantExpressionKind.IDENTICAL), |
| 62 const ConstantData('"a" "b"', ConstantExpressionKind.CONCATENATE, | 63 const ConstantData('"a" "b"', ConstantExpressionKind.CONCATENATE, |
| 63 text: '"ab"'), | 64 text: '"ab"'), |
| 64 const ConstantData('identical', ConstantExpressionKind.FUNCTION), | 65 const ConstantData('identical', ConstantExpressionKind.FUNCTION), |
| 65 const ConstantData('true ? 0 : 1', ConstantExpressionKind.CONDITIONAL), | 66 const ConstantData('true ? 0 : 1', ConstantExpressionKind.CONDITIONAL), |
| 66 const ConstantData('proxy', ConstantExpressionKind.VARIABLE), | 67 const ConstantData('proxy', ConstantExpressionKind.FIELD), |
| 67 const ConstantData('Object', ConstantExpressionKind.TYPE), | 68 const ConstantData('Object', ConstantExpressionKind.TYPE), |
| 68 const ConstantData('#name', ConstantExpressionKind.SYMBOL), | 69 const ConstantData('#name', ConstantExpressionKind.SYMBOL), |
| 69 const ConstantData('const [0, 1]', ConstantExpressionKind.LIST), | 70 const ConstantData('const [0, 1]', ConstantExpressionKind.LIST), |
| 70 const ConstantData('const <int>[0, 1]', ConstantExpressionKind.LIST), | 71 const ConstantData('const <int>[0, 1]', ConstantExpressionKind.LIST), |
| 71 const ConstantData('const {0: 1, 2: 3}', ConstantExpressionKind.MAP), | 72 const ConstantData('const {0: 1, 2: 3}', ConstantExpressionKind.MAP), |
| 72 const ConstantData( | 73 const ConstantData( |
| 73 'const <int, int>{0: 1, 2: 3}', ConstantExpressionKind.MAP), | 74 'const <int, int>{0: 1, 2: 3}', ConstantExpressionKind.MAP), |
| 74 const ConstantData('const bool.fromEnvironment("foo", defaultValue: false)', | 75 const ConstantData('const bool.fromEnvironment("foo", defaultValue: false)', |
| 75 ConstantExpressionKind.BOOL_FROM_ENVIRONMENT), | 76 ConstantExpressionKind.BOOL_FROM_ENVIRONMENT), |
| 76 const ConstantData('const int.fromEnvironment("foo", defaultValue: 42)', | 77 const ConstantData('const int.fromEnvironment("foo", defaultValue: 42)', |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 data.constants.forEach((ConstantData constantData) { | 202 data.constants.forEach((ConstantData constantData) { |
| 202 String name = 'c${constants.length}'; | 203 String name = 'c${constants.length}'; |
| 203 sb.write('const $name = ${constantData.code};\n'); | 204 sb.write('const $name = ${constantData.code};\n'); |
| 204 constants[name] = constantData; | 205 constants[name] = constantData; |
| 205 }); | 206 }); |
| 206 sb.write('main() {}\n'); | 207 sb.write('main() {}\n'); |
| 207 String source = sb.toString(); | 208 String source = sb.toString(); |
| 208 CompilationResult result = await runCompiler( | 209 CompilationResult result = await runCompiler( |
| 209 memorySourceFiles: {'main.dart': source}, options: ['--analyze-all']); | 210 memorySourceFiles: {'main.dart': source}, options: ['--analyze-all']); |
| 210 Compiler compiler = result.compiler; | 211 Compiler compiler = result.compiler; |
| 212 MemoryEnvironment environment = new MemoryEnvironment(compiler); |
| 211 var library = compiler.mainApp; | 213 var library = compiler.mainApp; |
| 212 constants.forEach((String name, ConstantData data) { | 214 constants.forEach((String name, ConstantData data) { |
| 213 FieldElement field = library.localLookup(name); | 215 FieldElement field = library.localLookup(name); |
| 214 var constant = field.constant; | 216 var constant = field.constant; |
| 215 Expect.equals( | 217 Expect.equals( |
| 216 data.kind, | 218 data.kind, |
| 217 constant.kind, | 219 constant.kind, |
| 218 "Unexpected kind '${constant.kind}' for contant " | 220 "Unexpected kind '${constant.kind}' for contant " |
| 219 "`${constant.toDartText()}`, expected '${data.kind}'."); | 221 "`${constant.toDartText()}`, expected '${data.kind}'."); |
| 220 Expect.equals( | 222 Expect.equals( |
| 221 data.text, | 223 data.text, |
| 222 constant.toDartText(), | 224 constant.toDartText(), |
| 223 "Unexpected text '${constant.toDartText()}' for contant, " | 225 "Unexpected text '${constant.toDartText()}' for contant, " |
| 224 "expected '${data.text}'."); | 226 "expected '${data.text}'."); |
| 225 if (data.type != null) { | 227 if (data.type != null) { |
| 226 String instanceType = constant.computeInstanceType().toString(); | 228 String instanceType = |
| 229 constant.computeInstanceType(environment).toString(); |
| 227 Expect.equals( | 230 Expect.equals( |
| 228 data.type, | 231 data.type, |
| 229 instanceType, | 232 instanceType, |
| 230 "Unexpected type '$instanceType' for contant " | 233 "Unexpected type '$instanceType' for contant " |
| 231 "`${constant.toDartText()}`, expected '${data.type}'."); | 234 "`${constant.toDartText()}`, expected '${data.type}'."); |
| 232 } | 235 } |
| 233 if (data.fields != null) { | 236 if (data.fields != null) { |
| 234 Map instanceFields = constant.computeInstanceFields(); | 237 Map instanceFields = constant.computeInstanceFields(environment); |
| 235 Expect.equals( | 238 Expect.equals( |
| 236 data.fields.length, | 239 data.fields.length, |
| 237 instanceFields.length, | 240 instanceFields.length, |
| 238 "Unexpected field count ${instanceFields.length} for contant " | 241 "Unexpected field count ${instanceFields.length} for contant " |
| 239 "`${constant.toDartText()}`, expected '${data.fields.length}'."); | 242 "`${constant.toDartText()}`, expected '${data.fields.length}'."); |
| 240 instanceFields.forEach((field, expression) { | 243 instanceFields.forEach((field, expression) { |
| 241 String name = '$field'; | 244 String name = '$field'; |
| 242 String expression = instanceFields[field].toDartText(); | 245 String expression = instanceFields[field].toDartText(); |
| 243 String expected = data.fields[name]; | 246 String expected = data.fields[name]; |
| 244 Expect.equals( | 247 Expect.equals( |
| 245 expected, | 248 expected, |
| 246 expression, | 249 expression, |
| 247 "Unexpected field expression ${expression} for field '$name' in " | 250 "Unexpected field expression ${expression} for field '$name' in " |
| 248 "contant `${constant.toDartText()}`, expected '${expected}'."); | 251 "contant `${constant.toDartText()}`, expected '${expected}'."); |
| 249 }); | 252 }); |
| 250 } | 253 } |
| 251 }); | 254 }); |
| 252 } | 255 } |
| OLD | NEW |