| 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 part of js_backend; | 5 part of js_backend; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Assigns JavaScript identifiers to Dart variables, class-names and members. | 8 * Assigns JavaScript identifiers to Dart variables, class-names and members. |
| 9 * | 9 * |
| 10 * Names are generated through three stages: | 10 * Names are generated through three stages: |
| (...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 778 return new StringBackedName(backend.getFixedBackendName(element)); | 778 return new StringBackedName(backend.getFixedBackendName(element)); |
| 779 } | 779 } |
| 780 | 780 |
| 781 // Some elements, like e.g. instances of BoxFieldElement are special. | 781 // Some elements, like e.g. instances of BoxFieldElement are special. |
| 782 // They are created with a unique and safe name for the element model. | 782 // They are created with a unique and safe name for the element model. |
| 783 // While their name is unique, it is not very readable. So we try to | 783 // While their name is unique, it is not very readable. So we try to |
| 784 // preserve the original, proposed name. | 784 // preserve the original, proposed name. |
| 785 // However, as boxes are not really instances of classes, the usual naming | 785 // However, as boxes are not really instances of classes, the usual naming |
| 786 // scheme that tries to avoid name clashes with super classes does not | 786 // scheme that tries to avoid name clashes with super classes does not |
| 787 // apply. So we can directly grab a name. | 787 // apply. So we can directly grab a name. |
| 788 if (element is JSEntity) { | 788 Entity asEntity = element; |
| 789 if (asEntity is JSEntity) { |
| 789 return _disambiguateInternalMember(element, | 790 return _disambiguateInternalMember(element, |
| 790 () => element.declaredEntity.name); | 791 () => asEntity.declaredEntity.name); |
| 791 } | 792 } |
| 792 | 793 |
| 793 // If the name of the field might clash with another field, | 794 // If the name of the field might clash with another field, |
| 794 // use a mangled field name to avoid potential clashes. | 795 // use a mangled field name to avoid potential clashes. |
| 795 // Note that if the class extends a native class, that native class might | 796 // Note that if the class extends a native class, that native class might |
| 796 // have fields with fixed backend names, so we assume the worst and always | 797 // have fields with fixed backend names, so we assume the worst and always |
| 797 // mangle the field names of classes extending native classes. | 798 // mangle the field names of classes extending native classes. |
| 798 // Methods on such classes are stored on the interceptor, not the instance, | 799 // Methods on such classes are stored on the interceptor, not the instance, |
| 799 // so only fields have the potential to clash with a native property name. | 800 // so only fields have the potential to clash with a native property name. |
| 800 ClassWorld classWorld = compiler.world; | 801 ClassWorld classWorld = compiler.world; |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1005 /// This is used as the property name for fields, type variables, | 1006 /// This is used as the property name for fields, type variables, |
| 1006 /// constructor bodies, and super-accessors. | 1007 /// constructor bodies, and super-accessors. |
| 1007 /// | 1008 /// |
| 1008 /// The resulting name is unique within the instance-member namespace. | 1009 /// The resulting name is unique within the instance-member namespace. |
| 1009 jsAst.Name _disambiguateInternalMember(Element element, | 1010 jsAst.Name _disambiguateInternalMember(Element element, |
| 1010 String proposeName()) { | 1011 String proposeName()) { |
| 1011 jsAst.Name newName = internalInstanceMembers[element]; | 1012 jsAst.Name newName = internalInstanceMembers[element]; |
| 1012 if (newName == null) { | 1013 if (newName == null) { |
| 1013 String name = proposeName(); | 1014 String name = proposeName(); |
| 1014 | 1015 |
| 1015 if (element is PrivatelyNamedJSEntity) { | 1016 Entity asEntity = element; |
| 1016 NamingScope scope = _getPrivateScopeFor(element); | 1017 if (asEntity is PrivatelyNamedJSEntity) { |
| 1018 NamingScope scope = _getPrivateScopeFor(asEntity); |
| 1017 newName = getFreshName(scope, name, | 1019 newName = getFreshName(scope, name, |
| 1018 sanitizeForAnnotations: true, | 1020 sanitizeForAnnotations: true, |
| 1019 sanitizeForNatives: false); | 1021 sanitizeForNatives: false); |
| 1020 internalInstanceMembers[element] = newName; | 1022 internalInstanceMembers[element] = newName; |
| 1021 } else { | 1023 } else { |
| 1022 bool mayClashNative = | 1024 bool mayClashNative = |
| 1023 _isUserClassExtendingNative(element.enclosingClass); | 1025 _isUserClassExtendingNative(element.enclosingClass); |
| 1024 newName = getFreshName(instanceScope, name, | 1026 newName = getFreshName(instanceScope, name, |
| 1025 sanitizeForAnnotations: true, | 1027 sanitizeForAnnotations: true, |
| 1026 sanitizeForNatives: mayClashNative); | 1028 sanitizeForNatives: mayClashNative); |
| (...skipping 1008 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2035 String suggestName(String original) => _suggestedNames[original]; | 2037 String suggestName(String original) => _suggestedNames[original]; |
| 2036 void addSuggestion(String original, String suggestion) { | 2038 void addSuggestion(String original, String suggestion) { |
| 2037 assert(!_suggestedNames.containsKey(original)); | 2039 assert(!_suggestedNames.containsKey(original)); |
| 2038 _suggestedNames[original] = suggestion; | 2040 _suggestedNames[original] = suggestion; |
| 2039 } | 2041 } |
| 2040 bool hasSuggestion(String original) => _suggestedNames.containsKey(original); | 2042 bool hasSuggestion(String original) => _suggestedNames.containsKey(original); |
| 2041 bool isSuggestion(String candidate) { | 2043 bool isSuggestion(String candidate) { |
| 2042 return _suggestedNames.containsValue(candidate); | 2044 return _suggestedNames.containsValue(candidate); |
| 2043 } | 2045 } |
| 2044 } | 2046 } |
| OLD | NEW |