| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 js_backend.namer; | 5 library js_backend.namer; |
| 6 | 6 |
| 7 import 'dart:collection' show HashMap; | 7 import 'dart:collection' show HashMap; |
| 8 | 8 |
| 9 import 'package:js_runtime/shared/embedded_names.dart' show JsGetName; | 9 import 'package:js_runtime/shared/embedded_names.dart' show JsGetName; |
| 10 | 10 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 import '../tree/tree.dart'; | 23 import '../tree/tree.dart'; |
| 24 import '../universe/call_structure.dart' show CallStructure; | 24 import '../universe/call_structure.dart' show CallStructure; |
| 25 import '../universe/selector.dart' show Selector, SelectorKind; | 25 import '../universe/selector.dart' show Selector, SelectorKind; |
| 26 import '../universe/world_builder.dart' show CodegenWorldBuilder; | 26 import '../universe/world_builder.dart' show CodegenWorldBuilder; |
| 27 import 'package:front_end/src/fasta/scanner/characters.dart'; | 27 import 'package:front_end/src/fasta/scanner/characters.dart'; |
| 28 import '../util/util.dart'; | 28 import '../util/util.dart'; |
| 29 import '../world.dart' show ClosedWorld; | 29 import '../world.dart' show ClosedWorld; |
| 30 import 'backend.dart'; | 30 import 'backend.dart'; |
| 31 import 'constant_system_javascript.dart'; | 31 import 'constant_system_javascript.dart'; |
| 32 import 'native_data.dart'; | 32 import 'native_data.dart'; |
| 33 import 'runtime_types.dart'; |
| 33 | 34 |
| 34 part 'field_naming_mixin.dart'; | 35 part 'field_naming_mixin.dart'; |
| 35 part 'frequency_namer.dart'; | 36 part 'frequency_namer.dart'; |
| 36 part 'minify_namer.dart'; | 37 part 'minify_namer.dart'; |
| 37 part 'namer_names.dart'; | 38 part 'namer_names.dart'; |
| 38 | 39 |
| 39 /** | 40 /** |
| 40 * Assigns JavaScript identifiers to Dart variables, class-names and members. | 41 * Assigns JavaScript identifiers to Dart variables, class-names and members. |
| 41 * | 42 * |
| 42 * Names are generated through three stages: | 43 * Names are generated through three stages: |
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 shortPrivateNameOwners.putIfAbsent(text, () => library); | 745 shortPrivateNameOwners.putIfAbsent(text, () => library); |
| 745 | 746 |
| 746 if (owner == library) { | 747 if (owner == library) { |
| 747 return text; | 748 return text; |
| 748 } else { | 749 } else { |
| 749 // Make sure to return a private name that starts with _ so it | 750 // Make sure to return a private name that starts with _ so it |
| 750 // cannot clash with any public names. | 751 // cannot clash with any public names. |
| 751 // The name is still not guaranteed to be unique, since both the library | 752 // The name is still not guaranteed to be unique, since both the library |
| 752 // name and originalName could contain $ symbols and as the library | 753 // name and originalName could contain $ symbols and as the library |
| 753 // name itself might clash. | 754 // name itself might clash. |
| 754 String libraryName = _proposeNameForGlobal(library); | 755 String libraryName = _proposeNameForLibrary(library); |
| 755 return "_$libraryName\$$text"; | 756 return "_$libraryName\$$text"; |
| 756 } | 757 } |
| 757 } | 758 } |
| 758 | 759 |
| 759 String _proposeNameForConstructorBody(ConstructorBodyElement method) { | 760 String _proposeNameForConstructorBody(ConstructorBodyElement method) { |
| 760 String name = Elements.reconstructConstructorNameSourceString(method); | 761 String name = Elements.reconstructConstructorNameSourceString(method); |
| 761 // We include the method suffix on constructor bodies. It has no purpose, | 762 // We include the method suffix on constructor bodies. It has no purpose, |
| 762 // but this way it produces the same names as previous versions of the | 763 // but this way it produces the same names as previous versions of the |
| 763 // Namer class did. | 764 // Namer class did. |
| 764 List<String> suffix = callSuffixForSignature(method.functionSignature); | 765 List<String> suffix = callSuffixForSignature(method.functionSignature); |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1262 return '${className}_${Elements.reconstructConstructorName(element)}'; | 1263 return '${className}_${Elements.reconstructConstructorName(element)}'; |
| 1263 } | 1264 } |
| 1264 if (Elements.isStaticOrTopLevel(element)) { | 1265 if (Elements.isStaticOrTopLevel(element)) { |
| 1265 if (element.isClassMember) { | 1266 if (element.isClassMember) { |
| 1266 ClassElement enclosingClass = element.enclosingClass; | 1267 ClassElement enclosingClass = element.enclosingClass; |
| 1267 return '${enclosingClass.name}_${element.name}'; | 1268 return '${enclosingClass.name}_${element.name}'; |
| 1268 } | 1269 } |
| 1269 return element.name.replaceAll('+', '_'); | 1270 return element.name.replaceAll('+', '_'); |
| 1270 } | 1271 } |
| 1271 if (element.isLibrary) { | 1272 if (element.isLibrary) { |
| 1272 return _proposeNameForLibrary(element); | 1273 LibraryElement library = element; |
| 1274 return _proposeNameForLibrary(library); |
| 1273 } | 1275 } |
| 1274 return element.name; | 1276 return element.name; |
| 1275 } | 1277 } |
| 1276 | 1278 |
| 1277 /** | 1279 /** |
| 1278 * Returns a proposed name for the given [LibraryElement]. | 1280 * Returns a proposed name for the given [LibraryElement]. |
| 1279 * The returned id is guaranteed to be a valid JavaScript identifier. | 1281 * The returned id is guaranteed to be a valid JavaScript identifier. |
| 1280 */ | 1282 */ |
| 1281 // TODO(sra): Pre-process libraries to assign [libraryLongNames] in a way that | 1283 // TODO(sra): Pre-process libraries to assign [libraryLongNames] in a way that |
| 1282 // is independent of the order of calls to namer. | 1284 // is independent of the order of calls to namer. |
| 1283 String _proposeNameForLibrary(LibraryElement library) { | 1285 String _proposeNameForLibrary(LibraryEntity library) { |
| 1284 String name = libraryLongNames[library]; | 1286 String name = libraryLongNames[library]; |
| 1285 if (name != null) return name; | 1287 if (name != null) return name; |
| 1286 // Use the 'file' name, e.g. "package:expect/expect.dart" -> "expect" | 1288 // Use the 'file' name, e.g. "package:expect/expect.dart" -> "expect" |
| 1287 name = library.canonicalUri.path; | 1289 name = library.canonicalUri.path; |
| 1288 name = name.substring(name.lastIndexOf('/') + 1); | 1290 name = name.substring(name.lastIndexOf('/') + 1); |
| 1289 if (name.contains('.')) { | 1291 if (name.contains('.')) { |
| 1290 // Drop file extension. | 1292 // Drop file extension. |
| 1291 name = name.substring(0, name.lastIndexOf('.')); | 1293 name = name.substring(0, name.lastIndexOf('.')); |
| 1292 } | 1294 } |
| 1293 // The filename based name can contain all kinds of nasty characters. Make | 1295 // The filename based name can contain all kinds of nasty characters. Make |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1507 assert(Elements.isStaticOrTopLevelField(element)); | 1509 assert(Elements.isStaticOrTopLevelField(element)); |
| 1508 jsAst.Name name = _disambiguateGlobal(element); | 1510 jsAst.Name name = _disambiguateGlobal(element); |
| 1509 // These are not real dart getters, so do not use GetterName; | 1511 // These are not real dart getters, so do not use GetterName; |
| 1510 return deriveLazyInitializerName(name); | 1512 return deriveLazyInitializerName(name); |
| 1511 } | 1513 } |
| 1512 | 1514 |
| 1513 jsAst.Name staticClosureName(Element element) { | 1515 jsAst.Name staticClosureName(Element element) { |
| 1514 assert(Elements.isStaticOrTopLevelFunction(element)); | 1516 assert(Elements.isStaticOrTopLevelFunction(element)); |
| 1515 String enclosing = | 1517 String enclosing = |
| 1516 element.enclosingClass == null ? "" : element.enclosingClass.name; | 1518 element.enclosingClass == null ? "" : element.enclosingClass.name; |
| 1517 String library = _proposeNameForGlobal(element.library); | 1519 String library = _proposeNameForLibrary(element.library); |
| 1518 return _disambiguateInternalGlobal( | 1520 return _disambiguateInternalGlobal( |
| 1519 "${library}_${enclosing}_${element.name}\$closure"); | 1521 "${library}_${enclosing}_${element.name}\$closure"); |
| 1520 } | 1522 } |
| 1521 | 1523 |
| 1522 // This name is used as part of the name of a TypeConstant | 1524 // This name is used as part of the name of a TypeConstant |
| 1523 String uniqueNameForTypeConstantElement(Element element) { | 1525 String uniqueNameForTypeConstantElement( |
| 1526 LibraryEntity library, Entity element) { |
| 1524 // TODO(sra): If we replace the period with an identifier character, | 1527 // TODO(sra): If we replace the period with an identifier character, |
| 1525 // TypeConstants will have better names in unminified code. | 1528 // TypeConstants will have better names in unminified code. |
| 1526 String library = _proposeNameForGlobal(element.library); | 1529 String libraryName = _proposeNameForLibrary(library); |
| 1527 return "${library}.${element.name}"; | 1530 return "${libraryName}.${element.name}"; |
| 1528 } | 1531 } |
| 1529 | 1532 |
| 1530 String globalObjectForConstant(ConstantValue constant) => 'C'; | 1533 String globalObjectForConstant(ConstantValue constant) => 'C'; |
| 1531 | 1534 |
| 1532 String get operatorIsPrefix => r'$is'; | 1535 String get operatorIsPrefix => r'$is'; |
| 1533 | 1536 |
| 1534 String get operatorAsPrefix => r'$as'; | 1537 String get operatorAsPrefix => r'$as'; |
| 1535 | 1538 |
| 1536 String get operatorSignature => r'$signature'; | 1539 String get operatorSignature => r'$signature'; |
| 1537 | 1540 |
| (...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2186 void addSuggestion(String original, String suggestion) { | 2189 void addSuggestion(String original, String suggestion) { |
| 2187 assert(!_suggestedNames.containsKey(original)); | 2190 assert(!_suggestedNames.containsKey(original)); |
| 2188 _suggestedNames[original] = suggestion; | 2191 _suggestedNames[original] = suggestion; |
| 2189 } | 2192 } |
| 2190 | 2193 |
| 2191 bool hasSuggestion(String original) => _suggestedNames.containsKey(original); | 2194 bool hasSuggestion(String original) => _suggestedNames.containsKey(original); |
| 2192 bool isSuggestion(String candidate) { | 2195 bool isSuggestion(String candidate) { |
| 2193 return _suggestedNames.containsValue(candidate); | 2196 return _suggestedNames.containsValue(candidate); |
| 2194 } | 2197 } |
| 2195 } | 2198 } |
| OLD | NEW |