| 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 | 
|---|