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 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 _literalGetterPrefix = new StringBackedName(getterPrefix); | 453 _literalGetterPrefix = new StringBackedName(getterPrefix); |
454 _literalSetterPrefix = new StringBackedName(setterPrefix); | 454 _literalSetterPrefix = new StringBackedName(setterPrefix); |
455 _literalLazyGetterPrefix = new StringBackedName(lazyGetterPrefix); | 455 _literalLazyGetterPrefix = new StringBackedName(lazyGetterPrefix); |
456 } | 456 } |
457 | 457 |
458 JavaScriptBackend get backend => compiler.backend; | 458 JavaScriptBackend get backend => compiler.backend; |
459 | 459 |
460 String get deferredTypesName => 'deferredTypes'; | 460 String get deferredTypesName => 'deferredTypes'; |
461 String get isolateName => 'Isolate'; | 461 String get isolateName => 'Isolate'; |
462 String get isolatePropertiesName => r'$isolateProperties'; | 462 String get isolatePropertiesName => r'$isolateProperties'; |
463 jsAst.Name get noSuchMethodName => publicInstanceMethodNameByArity( | 463 jsAst.Name get noSuchMethodName => invocationName(Selectors.noSuchMethod_); |
464 Compiler.NO_SUCH_METHOD, Compiler.NO_SUCH_METHOD_ARG_COUNT); | 464 |
465 /** | 465 /** |
466 * Some closures must contain their name. The name is stored in | 466 * Some closures must contain their name. The name is stored in |
467 * [STATIC_CLOSURE_NAME_NAME]. | 467 * [STATIC_CLOSURE_NAME_NAME]. |
468 */ | 468 */ |
469 String get STATIC_CLOSURE_NAME_NAME => r'$name'; | 469 String get STATIC_CLOSURE_NAME_NAME => r'$name'; |
470 String get closureInvocationSelectorName => Compiler.CALL_OPERATOR_NAME; | 470 String get closureInvocationSelectorName => Identifiers.call; |
471 bool get shouldMinify => false; | 471 bool get shouldMinify => false; |
472 | 472 |
473 /// Returns the string that is to be used as the result of a call to | 473 /// Returns the string that is to be used as the result of a call to |
474 /// [JS_GET_NAME] at [node] with argument [name]. | 474 /// [JS_GET_NAME] at [node] with argument [name]. |
475 jsAst.Name getNameForJsGetName(Node node, JsGetName name) { | 475 jsAst.Name getNameForJsGetName(Node node, JsGetName name) { |
476 switch (name) { | 476 switch (name) { |
477 case JsGetName.GETTER_PREFIX: return asName(getterPrefix); | 477 case JsGetName.GETTER_PREFIX: return asName(getterPrefix); |
478 case JsGetName.SETTER_PREFIX: return asName(setterPrefix); | 478 case JsGetName.SETTER_PREFIX: return asName(setterPrefix); |
479 case JsGetName.CALL_PREFIX: return asName(callPrefix); | 479 case JsGetName.CALL_PREFIX: return asName(callPrefix); |
480 case JsGetName.CALL_PREFIX0: return asName('${callPrefix}\$0'); | 480 case JsGetName.CALL_PREFIX0: return asName('${callPrefix}\$0'); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 /// Annotated name for a public method with the given [originalName] | |
637 /// and [arity] and no named parameters. | |
638 jsAst.Name publicInstanceMethodNameByArity(String originalName, | |
639 int arity) { | |
640 return invocationName(new Selector.call(originalName, null, arity)); | |
641 } | |
642 | |
643 /// Returns the annotated name for a variant of `call`. | 636 /// Returns the annotated name for a variant of `call`. |
644 /// The result has the form: | 637 /// The result has the form: |
645 /// | 638 /// |
646 /// call$<N>$namedParam1...$namedParam<M> | 639 /// call$<N>$namedParam1...$namedParam<M> |
647 /// | 640 /// |
648 /// This name cannot be minified because it is generated by string | 641 /// This name cannot be minified because it is generated by string |
649 /// concatenation at runtime, by applyFunction in js_helper.dart. | 642 /// concatenation at runtime, by applyFunction in js_helper.dart. |
650 jsAst.Name deriveCallMethodName(List<String> suffix) { | 643 jsAst.Name deriveCallMethodName(List<String> suffix) { |
651 // TODO(asgerf): Avoid clashes when named parameters contain $ symbols. | 644 // TODO(asgerf): Avoid clashes when named parameters contain $ symbols. |
652 return new StringBackedName('$callPrefix\$${suffix.join(r'$')}'); | 645 return new StringBackedName('$callPrefix\$${suffix.join(r'$')}'); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 | 688 |
696 case SelectorKind.OPERATOR: | 689 case SelectorKind.OPERATOR: |
697 case SelectorKind.INDEX: | 690 case SelectorKind.INDEX: |
698 String operatorIdentifier = operatorNameToIdentifier(selector.name); | 691 String operatorIdentifier = operatorNameToIdentifier(selector.name); |
699 jsAst.Name disambiguatedName = | 692 jsAst.Name disambiguatedName = |
700 _disambiguateOperator(operatorIdentifier); | 693 _disambiguateOperator(operatorIdentifier); |
701 return disambiguatedName; // Operators are not annotated. | 694 return disambiguatedName; // Operators are not annotated. |
702 | 695 |
703 case SelectorKind.CALL: | 696 case SelectorKind.CALL: |
704 List<String> suffix = callSuffixForStructure(selector.callStructure); | 697 List<String> suffix = callSuffixForStructure(selector.callStructure); |
705 if (selector.name == Compiler.CALL_OPERATOR_NAME) { | 698 if (selector.name == Identifiers.call) { |
706 // Derive the annotated name for this variant of 'call'. | 699 // Derive the annotated name for this variant of 'call'. |
707 return deriveCallMethodName(suffix); | 700 return deriveCallMethodName(suffix); |
708 } | 701 } |
709 jsAst.Name disambiguatedName = | 702 jsAst.Name disambiguatedName = |
710 _disambiguateMember(selector.memberName, suffix); | 703 _disambiguateMember(selector.memberName, suffix); |
711 return disambiguatedName; // Methods other than call are not annotated. | 704 return disambiguatedName; // Methods other than call are not annotated. |
712 | 705 |
713 default: | 706 default: |
714 compiler.internalError(compiler.currentElement, | 707 compiler.internalError(compiler.currentElement, |
715 'Unexpected selector kind: ${selector.kind}'); | 708 'Unexpected selector kind: ${selector.kind}'); |
(...skipping 1273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1989 } | 1982 } |
1990 } | 1983 } |
1991 } | 1984 } |
1992 } | 1985 } |
1993 | 1986 |
1994 enum NamingScope { | 1987 enum NamingScope { |
1995 global, | 1988 global, |
1996 instance, | 1989 instance, |
1997 constant | 1990 constant |
1998 } | 1991 } |
OLD | NEW |