| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 deferred_load; | 5 library deferred_load; |
| 6 | 6 |
| 7 import 'common/backend_api.dart' show Backend; | 7 import 'common/backend_api.dart' show Backend; |
| 8 import 'common/tasks.dart' show CompilerTask; | 8 import 'common/tasks.dart' show CompilerTask; |
| 9 import 'common.dart'; | 9 import 'common.dart'; |
| 10 import 'compiler.dart' show Compiler; | 10 import 'compiler.dart' show Compiler; |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 // assign every element to its output unit). | 175 // assign every element to its output unit). |
| 176 if (element.enclosingElement == null) { | 176 if (element.enclosingElement == null) { |
| 177 _elementToOutputUnit[element] = mainOutputUnit; | 177 _elementToOutputUnit[element] = mainOutputUnit; |
| 178 break; | 178 break; |
| 179 } | 179 } |
| 180 element = element.enclosingElement.implementation; | 180 element = element.enclosingElement.implementation; |
| 181 } | 181 } |
| 182 return _elementToOutputUnit[element]; | 182 return _elementToOutputUnit[element]; |
| 183 } | 183 } |
| 184 | 184 |
| 185 /// Direct access to the output-unit to element relation used for testing. |
| 186 OutputUnit getOutputUnitForElementForTesting(Element element) { |
| 187 return _elementToOutputUnit[element]; |
| 188 } |
| 189 |
| 185 /// Returns the [OutputUnit] where [constant] belongs. | 190 /// Returns the [OutputUnit] where [constant] belongs. |
| 186 OutputUnit outputUnitForConstant(ConstantValue constant) { | 191 OutputUnit outputUnitForConstant(ConstantValue constant) { |
| 187 if (!isProgramSplit) return mainOutputUnit; | 192 if (!isProgramSplit) return mainOutputUnit; |
| 188 return _constantToOutputUnit[constant]; | 193 return _constantToOutputUnit[constant]; |
| 189 } | 194 } |
| 190 | 195 |
| 196 /// Direct access to the output-unit to constants map used for testing. |
| 197 Map<ConstantValue, OutputUnit> get outputUnitForConstantsForTesting { |
| 198 return _constantToOutputUnit; |
| 199 } |
| 200 |
| 191 bool isDeferred(Element element) { | 201 bool isDeferred(Element element) { |
| 192 return outputUnitForElement(element) != mainOutputUnit; | 202 return outputUnitForElement(element) != mainOutputUnit; |
| 193 } | 203 } |
| 194 | 204 |
| 195 /// Returns the unique name for the deferred import of [prefix]. | 205 /// Returns the unique name for the deferred import of [prefix]. |
| 196 String getImportDeferName(Spannable node, PrefixElement prefix) { | 206 String getImportDeferName(Spannable node, PrefixElement prefix) { |
| 197 String name = | 207 String name = |
| 198 importDeferName[new _DeclaredDeferredImport(prefix.deferredImport)]; | 208 importDeferName[new _DeclaredDeferredImport(prefix.deferredImport)]; |
| 199 if (name == null) { | 209 if (name == null) { |
| 200 reporter.internalError(node, "No deferred name for $prefix."); | 210 reporter.internalError(node, "No deferred name for $prefix."); |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 // TODO(johnniwinther): Add only expressions that are actually needed. | 353 // TODO(johnniwinther): Add only expressions that are actually needed. |
| 344 // Currently we have some noise here: Some potential expressions are | 354 // Currently we have some noise here: Some potential expressions are |
| 345 // seen that should never be added (for instance field initializers | 355 // seen that should never be added (for instance field initializers |
| 346 // in constant constructors, like `this.field = parameter`). And some | 356 // in constant constructors, like `this.field = parameter`). And some |
| 347 // implicit constant expression are seen that we should be able to add | 357 // implicit constant expression are seen that we should be able to add |
| 348 // (like primitive constant literals like `true`, `"foo"` and `0`). | 358 // (like primitive constant literals like `true`, `"foo"` and `0`). |
| 349 // See dartbug.com/26406 for context. | 359 // See dartbug.com/26406 for context. |
| 350 treeElements | 360 treeElements |
| 351 .forEachConstantNode((Node node, ConstantExpression expression) { | 361 .forEachConstantNode((Node node, ConstantExpression expression) { |
| 352 if (compiler.serialization.isDeserialized(analyzableElement)) { | 362 if (compiler.serialization.isDeserialized(analyzableElement)) { |
| 353 if (!expression.isImplicit && !expression.isPotential) { | 363 if (!expression.isPotential) { |
| 354 // Enforce evaluation of [expression]. | 364 // Enforce evaluation of [expression]. |
| 355 backend.constants.getConstantValue(expression); | 365 backend.constants.getConstantValue(expression); |
| 356 } | 366 } |
| 357 } | 367 } |
| 358 | 368 |
| 359 // Explicitly depend on the backend constants. | 369 // Explicitly depend on the backend constants. |
| 360 if (backend.constants.hasConstantValue(expression)) { | 370 if (backend.constants.hasConstantValue(expression)) { |
| 361 ConstantValue value = | 371 ConstantValue value = |
| 362 backend.constants.getConstantValue(expression); | 372 backend.constants.getConstantValue(expression); |
| 363 assert(invariant(node, value != null, | 373 assert(invariant(node, value != null, |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 921 elementMap.putIfAbsent(output, () => <String>[]).add('$element'); | 931 elementMap.putIfAbsent(output, () => <String>[]).add('$element'); |
| 922 }); | 932 }); |
| 923 _constantToOutputUnit.forEach((ConstantValue value, OutputUnit output) { | 933 _constantToOutputUnit.forEach((ConstantValue value, OutputUnit output) { |
| 924 constantMap | 934 constantMap |
| 925 .putIfAbsent(output, () => <String>[]) | 935 .putIfAbsent(output, () => <String>[]) |
| 926 .add(value.toStructuredText()); | 936 .add(value.toStructuredText()); |
| 927 }); | 937 }); |
| 928 | 938 |
| 929 StringBuffer sb = new StringBuffer(); | 939 StringBuffer sb = new StringBuffer(); |
| 930 for (OutputUnit outputUnit in allOutputUnits) { | 940 for (OutputUnit outputUnit in allOutputUnits) { |
| 931 sb.write(outputUnit.name); | 941 sb.write('\n-------------------------------\n'); |
| 942 sb.write('Output unit: ${outputUnit.name}'); |
| 932 List<String> elements = elementMap[outputUnit]; | 943 List<String> elements = elementMap[outputUnit]; |
| 933 if (elements != null) { | 944 if (elements != null) { |
| 934 sb.write('\n elements:'); | 945 sb.write('\n elements:'); |
| 935 for (String element in elements..sort()) { | 946 for (String element in elements..sort()) { |
| 936 sb.write('\n $element'); | 947 sb.write('\n $element'); |
| 937 } | 948 } |
| 938 } | 949 } |
| 939 List<String> constants = constantMap[outputUnit]; | 950 List<String> constants = constantMap[outputUnit]; |
| 940 if (constants != null) { | 951 if (constants != null) { |
| 941 sb.write('\n constants:'); | 952 sb.write('\n constants:'); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1024 | 1035 |
| 1025 bool operator ==(other) { | 1036 bool operator ==(other) { |
| 1026 if (other is! _DeclaredDeferredImport) return false; | 1037 if (other is! _DeclaredDeferredImport) return false; |
| 1027 return declaration == other.declaration; | 1038 return declaration == other.declaration; |
| 1028 } | 1039 } |
| 1029 | 1040 |
| 1030 int get hashCode => declaration.hashCode * 17; | 1041 int get hashCode => declaration.hashCode * 17; |
| 1031 | 1042 |
| 1032 String toString() => '$declaration'; | 1043 String toString() => '$declaration'; |
| 1033 } | 1044 } |
| OLD | NEW |