Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Side by Side Diff: pkg/compiler/lib/src/js_backend/namer.dart

Issue 1318043005: Support user generated custom native JS classes. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: PTAL Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 615 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 } 626 }
627 627
628 /// Annotated name for [method] encoding arity and named parameters. 628 /// Annotated name for [method] encoding arity and named parameters.
629 jsAst.Name instanceMethodName(FunctionElement method) { 629 jsAst.Name instanceMethodName(FunctionElement method) {
630 if (method.isGenerativeConstructorBody) { 630 if (method.isGenerativeConstructorBody) {
631 return constructorBodyName(method); 631 return constructorBodyName(method);
632 } 632 }
633 return invocationName(new Selector.fromElement(method)); 633 return invocationName(new Selector.fromElement(method));
634 } 634 }
635 635
636 String _jsNameHelper(Element e) {
637 if (e.jsInteropName != null && e.jsInteropName.isNotEmpty)
638 return e.jsInteropName;
639 return e.isLibrary ? 'self' : e.name;
640 }
641
642 String fixedBackendPath(Element element) {
643 if (!element.isJsInterop) return null;
644 if (element.isInstanceMember) return 'this';
645 if (element.isConstructor) return fixedBackendPath(element.enclosingClass);
646 if (element.isLibrary) return 'self';
647 var sb = new StringBuffer();
648 sb..write(_jsNameHelper(element.library));
649
650 if (element.enclosingClass != null && element.enclosingClass != element) {
651 sb..write('.')..write(_jsNameHelper(element.enclosingClass));
652 }
653 return sb.toString();
654 }
655
636 /// Returns the annotated name for a variant of `call`. 656 /// Returns the annotated name for a variant of `call`.
637 /// The result has the form: 657 /// The result has the form:
638 /// 658 ///
639 /// call$<N>$namedParam1...$namedParam<M> 659 /// call$<N>$namedParam1...$namedParam<M>
640 /// 660 ///
641 /// This name cannot be minified because it is generated by string 661 /// This name cannot be minified because it is generated by string
642 /// concatenation at runtime, by applyFunction in js_helper.dart. 662 /// concatenation at runtime, by applyFunction in js_helper.dart.
643 jsAst.Name deriveCallMethodName(List<String> suffix) { 663 jsAst.Name deriveCallMethodName(List<String> suffix) {
644 // TODO(asgerf): Avoid clashes when named parameters contain $ symbols. 664 // TODO(asgerf): Avoid clashes when named parameters contain $ symbols.
645 return new StringBackedName('$callPrefix\$${suffix.join(r'$')}'); 665 return new StringBackedName('$callPrefix\$${suffix.join(r'$')}');
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 777
758 /** 778 /**
759 * Returns the JavaScript property name used to store an instance field. 779 * Returns the JavaScript property name used to store an instance field.
760 */ 780 */
761 jsAst.Name instanceFieldPropertyName(FieldElement element) { 781 jsAst.Name instanceFieldPropertyName(FieldElement element) {
762 ClassElement enclosingClass = element.enclosingClass; 782 ClassElement enclosingClass = element.enclosingClass;
763 783
764 if (element.hasFixedBackendName) { 784 if (element.hasFixedBackendName) {
765 // Certain native fields must be given a specific name. Native names must 785 // Certain native fields must be given a specific name. Native names must
766 // not contain '$'. We rely on this to avoid clashes. 786 // not contain '$'. We rely on this to avoid clashes.
787 // TODO(jacobr): we need to relax this constraint.
767 assert(enclosingClass.isNative && 788 assert(enclosingClass.isNative &&
768 !element.fixedBackendName.contains(r'$')); 789 !element.fixedBackendName.contains(r'$'));
769 790
770 return new StringBackedName(element.fixedBackendName); 791 return new StringBackedName(element.fixedBackendName);
771 } 792 }
772 793
773 // Instances of BoxFieldElement are special. They are already created with 794 // Instances of BoxFieldElement are special. They are already created with
774 // a unique and safe name. However, as boxes are not really instances of 795 // a unique and safe name. However, as boxes are not really instances of
775 // classes, the usual naming scheme that tries to avoid name clashes with 796 // classes, the usual naming scheme that tries to avoid name clashes with
776 // super classes does not apply. We still do not mark the name as a 797 // super classes does not apply. We still do not mark the name as a
(...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after
1982 } 2003 }
1983 } 2004 }
1984 } 2005 }
1985 } 2006 }
1986 2007
1987 enum NamingScope { 2008 enum NamingScope {
1988 global, 2009 global,
1989 instance, 2010 instance,
1990 constant 2011 constant
1991 } 2012 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698