| 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 |
| 11 import '../closure.dart'; | 11 import '../closure.dart'; |
| 12 import '../common.dart'; | 12 import '../common.dart'; |
| 13 import '../common/names.dart' show Identifiers, Selectors; | 13 import '../common/names.dart' show Identifiers, Selectors; |
| 14 import '../constants/values.dart'; | 14 import '../constants/values.dart'; |
| 15 import '../common_elements.dart' show CommonElements; | 15 import '../common_elements.dart' show CommonElements; |
| 16 import '../diagnostics/invariant.dart' show DEBUG_MODE; | 16 import '../diagnostics/invariant.dart' show DEBUG_MODE; |
| 17 import '../elements/elements.dart' | 17 import '../elements/elements.dart' |
| 18 show | 18 show |
| 19 ClassElement, | 19 ClassElement, |
| 20 ConstructorBodyElement, | |
| 21 Element, | 20 Element, |
| 22 Elements, | 21 Elements, |
| 23 FieldElement, | 22 FieldElement, |
| 24 FormalElement, | |
| 25 FunctionElement, | |
| 26 FunctionSignature, | |
| 27 MemberElement, | 23 MemberElement, |
| 28 TypeDeclarationElement, | 24 TypeDeclarationElement, |
| 29 MixinApplicationElement, | 25 MixinApplicationElement, |
| 30 TypedefElement; | 26 TypedefElement; |
| 31 import '../elements/entities.dart'; | 27 import '../elements/entities.dart'; |
| 32 import '../elements/entity_utils.dart' as utils; | 28 import '../elements/entity_utils.dart' as utils; |
| 33 import '../elements/jumps.dart'; | 29 import '../elements/jumps.dart'; |
| 34 import '../elements/names.dart'; | 30 import '../elements/names.dart'; |
| 35 import '../elements/resolution_types.dart'; | 31 import '../elements/resolution_types.dart'; |
| 36 import '../elements/types.dart'; | 32 import '../elements/types.dart'; |
| (...skipping 725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 // Make sure to return a private name that starts with _ so it | 758 // Make sure to return a private name that starts with _ so it |
| 763 // cannot clash with any public names. | 759 // cannot clash with any public names. |
| 764 // The name is still not guaranteed to be unique, since both the library | 760 // The name is still not guaranteed to be unique, since both the library |
| 765 // name and originalName could contain $ symbols and as the library | 761 // name and originalName could contain $ symbols and as the library |
| 766 // name itself might clash. | 762 // name itself might clash. |
| 767 String libraryName = _proposeNameForLibrary(library); | 763 String libraryName = _proposeNameForLibrary(library); |
| 768 return "_$libraryName\$$text"; | 764 return "_$libraryName\$$text"; |
| 769 } | 765 } |
| 770 } | 766 } |
| 771 | 767 |
| 772 String _proposeNameForConstructorBody(ConstructorBodyElement method) { | 768 String _proposeNameForConstructorBody(ConstructorBodyEntity method) { |
| 773 String name = Elements.reconstructConstructorNameSourceString(method); | 769 String name = Elements.reconstructConstructorNameSourceString(method); |
| 774 // We include the method suffix on constructor bodies. It has no purpose, | 770 // We include the method suffix on constructor bodies. It has no purpose, |
| 775 // but this way it produces the same names as previous versions of the | 771 // but this way it produces the same names as previous versions of the |
| 776 // Namer class did. | 772 // Namer class did. |
| 777 List<String> suffix = callSuffixForSignature(method.functionSignature); | 773 List<String> suffix = callSuffixForSignature(method.parameterStructure); |
| 778 return '$name\$${suffix.join(r'$')}'; | 774 return '$name\$${suffix.join(r'$')}'; |
| 779 } | 775 } |
| 780 | 776 |
| 781 /// Name for a constructor body. | 777 /// Name for a constructor body. |
| 782 jsAst.Name constructorBodyName(ConstructorBodyElement ctor) { | 778 jsAst.Name constructorBodyName(ConstructorBodyEntity ctor) { |
| 783 return _disambiguateInternalMember( | 779 return _disambiguateInternalMember( |
| 784 ctor, () => _proposeNameForConstructorBody(ctor)); | 780 ctor, () => _proposeNameForConstructorBody(ctor)); |
| 785 } | 781 } |
| 786 | 782 |
| 787 /// Annotated name for [method] encoding arity and named parameters. | 783 /// Annotated name for [method] encoding arity and named parameters. |
| 788 jsAst.Name instanceMethodName(FunctionEntity method) { | 784 jsAst.Name instanceMethodName(FunctionEntity method) { |
| 789 // TODO(redemption): Avoid the use of [ConstructorBodyElement]. The | 785 // TODO(johnniwinther): Avoid the use of [ConstructorBodyEntity]. The |
| 790 // codegen model should be explicit about its constructor body elements. | 786 // codegen model should be explicit about its constructor body elements. |
| 791 if (method is ConstructorBodyElement) { | 787 if (method is ConstructorBodyEntity) { |
| 792 return constructorBodyName(method); | 788 return constructorBodyName(method); |
| 793 } | 789 } |
| 794 return invocationName(new Selector.fromElement(method)); | 790 return invocationName(new Selector.fromElement(method)); |
| 795 } | 791 } |
| 796 | 792 |
| 797 /// Returns the annotated name for a variant of `call`. | 793 /// Returns the annotated name for a variant of `call`. |
| 798 /// The result has the form: | 794 /// The result has the form: |
| 799 /// | 795 /// |
| 800 /// call$<N>$namedParam1...$namedParam<M> | 796 /// call$<N>$namedParam1...$namedParam<M> |
| 801 /// | 797 /// |
| (...skipping 15 matching lines...) Expand all Loading... |
| 817 suffixes.addAll(callStructure.getOrderedNamedArguments()); | 813 suffixes.addAll(callStructure.getOrderedNamedArguments()); |
| 818 return suffixes; | 814 return suffixes; |
| 819 } | 815 } |
| 820 | 816 |
| 821 /// The suffix list for the pattern: | 817 /// The suffix list for the pattern: |
| 822 /// | 818 /// |
| 823 /// $<N>$namedParam1...$namedParam<M> | 819 /// $<N>$namedParam1...$namedParam<M> |
| 824 /// | 820 /// |
| 825 /// This is used for the annotated names of `call`, and for the proposed name | 821 /// This is used for the annotated names of `call`, and for the proposed name |
| 826 /// for other instance methods. | 822 /// for other instance methods. |
| 827 List<String> callSuffixForSignature(FunctionSignature sig) { | 823 List<String> callSuffixForSignature(ParameterStructure parameterStructure) { |
| 828 List<String> suffixes = ['${sig.parameterCount}']; | 824 List<String> suffixes = ['${parameterStructure.totalParameters}']; |
| 829 if (sig.optionalParametersAreNamed) { | 825 suffixes.addAll(parameterStructure.namedParameters); |
| 830 for (FormalElement param in sig.orderedOptionalParameters) { | |
| 831 suffixes.add(param.name); | |
| 832 } | |
| 833 } | |
| 834 return suffixes; | 826 return suffixes; |
| 835 } | 827 } |
| 836 | 828 |
| 837 /// Annotated name for the member being invoked by [selector]. | 829 /// Annotated name for the member being invoked by [selector]. |
| 838 jsAst.Name invocationName(Selector selector) { | 830 jsAst.Name invocationName(Selector selector) { |
| 839 switch (selector.kind) { | 831 switch (selector.kind) { |
| 840 case SelectorKind.GETTER: | 832 case SelectorKind.GETTER: |
| 841 jsAst.Name disambiguatedName = _disambiguateMember(selector.memberName); | 833 jsAst.Name disambiguatedName = _disambiguateMember(selector.memberName); |
| 842 return deriveGetterName(disambiguatedName); | 834 return deriveGetterName(disambiguatedName); |
| 843 | 835 |
| (...skipping 1404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2248 void addSuggestion(String original, String suggestion) { | 2240 void addSuggestion(String original, String suggestion) { |
| 2249 assert(!_suggestedNames.containsKey(original)); | 2241 assert(!_suggestedNames.containsKey(original)); |
| 2250 _suggestedNames[original] = suggestion; | 2242 _suggestedNames[original] = suggestion; |
| 2251 } | 2243 } |
| 2252 | 2244 |
| 2253 bool hasSuggestion(String original) => _suggestedNames.containsKey(original); | 2245 bool hasSuggestion(String original) => _suggestedNames.containsKey(original); |
| 2254 bool isSuggestion(String candidate) { | 2246 bool isSuggestion(String candidate) { |
| 2255 return _suggestedNames.containsValue(candidate); | 2247 return _suggestedNames.containsValue(candidate); |
| 2256 } | 2248 } |
| 2257 } | 2249 } |
| OLD | NEW |