OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 elements.modelx; | 5 library elements.modelx; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/resolution.dart' show Resolution, Parsing; | 8 import '../common/resolution.dart' show Resolution, Parsing; |
9 import '../compiler.dart' show Compiler; | 9 import '../compiler.dart' show Compiler; |
10 import '../constants/constant_constructors.dart'; | 10 import '../constants/constant_constructors.dart'; |
(...skipping 2337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2348 FunctionExpression parseNode(Parsing parsing) => null; | 2348 FunctionExpression parseNode(Parsing parsing) => null; |
2349 | 2349 |
2350 bool get hasNode => false; | 2350 bool get hasNode => false; |
2351 | 2351 |
2352 FunctionExpression get node => null; | 2352 FunctionExpression get node => null; |
2353 | 2353 |
2354 Token get position => enclosingElement.position; | 2354 Token get position => enclosingElement.position; |
2355 | 2355 |
2356 bool get isSynthesized => true; | 2356 bool get isSynthesized => true; |
2357 | 2357 |
2358 bool get hasResolvedAst => true; | |
Siggi Cherem (dart-lang)
2016/04/12 17:52:57
by now do all declarations have `hasResolvedAst` t
Johnni Winther
2016/04/13 10:18:12
Soon-ish. I want to move the whole logic out of th
| |
2359 | |
2360 ResolvedAst get resolvedAst { | |
Siggi Cherem (dart-lang)
2016/04/12 17:52:57
should we make this a final field that is allocate
Johnni Winther
2016/04/13 10:18:12
Done. Not final though, it references this.
| |
2361 return new SynthesizedResolvedAst( | |
2362 this, | |
2363 isDefaultConstructor | |
2364 ? ResolvedAstKind.DEFAULT_CONSTRUCTOR | |
2365 : ResolvedAstKind.FORWARDING_CONSTRUCTOR); | |
2366 } | |
2367 | |
2358 DartType get type { | 2368 DartType get type { |
2359 if (isDefaultConstructor) { | 2369 if (isDefaultConstructor) { |
2360 return super.type; | 2370 return super.type; |
2361 } else { | 2371 } else { |
2362 // TODO(johnniwinther): Ensure that the function type substitutes type | 2372 // TODO(johnniwinther): Ensure that the function type substitutes type |
2363 // variables correctly. | 2373 // variables correctly. |
2364 return definingConstructor.type; | 2374 return definingConstructor.type; |
2365 } | 2375 } |
2366 } | 2376 } |
2367 | 2377 |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2687 if (origin != null) { | 2697 if (origin != null) { |
2688 return 'patch ${super.toString()}'; | 2698 return 'patch ${super.toString()}'; |
2689 } else if (patch != null) { | 2699 } else if (patch != null) { |
2690 return 'origin ${super.toString()}'; | 2700 return 'origin ${super.toString()}'; |
2691 } else { | 2701 } else { |
2692 return super.toString(); | 2702 return super.toString(); |
2693 } | 2703 } |
2694 } | 2704 } |
2695 } | 2705 } |
2696 | 2706 |
2707 /// This element is used to encode an enum class. | |
2708 /// | |
2709 /// For instance | |
2710 /// | |
2711 /// enum A { b, c, } | |
2712 /// | |
2713 /// is modelled as | |
2714 /// | |
2715 /// class A { | |
2716 /// final int index; | |
2717 /// | |
2718 /// const A(this.index); | |
2719 /// | |
2720 /// String toString() { | |
2721 /// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; | |
2722 /// } | |
2723 /// | |
2724 /// static const A b = const A(0); | |
2725 /// static const A c = const A(1); | |
2726 /// | |
2727 /// static const List<A> values = const <A>[b, c]; | |
2728 /// } | |
2729 /// | |
2730 /// where the `A` class is encoded using this element. | |
2731 /// | |
2697 class EnumClassElementX extends ClassElementX | 2732 class EnumClassElementX extends ClassElementX |
2698 implements EnumClassElement, DeclarationSite { | 2733 implements EnumClassElement, DeclarationSite { |
2699 final Enum node; | 2734 final Enum node; |
2700 List<FieldElement> _enumValues; | 2735 List<FieldElement> _enumValues; |
2701 | 2736 |
2702 EnumClassElementX(String name, Element enclosing, int id, this.node) | 2737 EnumClassElementX(String name, Element enclosing, int id, this.node) |
2703 : super(name, enclosing, id, STATE_NOT_STARTED); | 2738 : super(name, enclosing, id, STATE_NOT_STARTED); |
2704 | 2739 |
2705 @override | 2740 @override |
2706 bool get hasNode => true; | 2741 bool get hasNode => true; |
(...skipping 23 matching lines...) Expand all Loading... | |
2730 void set enumValues(List<FieldElement> values) { | 2765 void set enumValues(List<FieldElement> values) { |
2731 assert(invariant(this, _enumValues == null, | 2766 assert(invariant(this, _enumValues == null, |
2732 message: "enumValues has already been computed for $this.")); | 2767 message: "enumValues has already been computed for $this.")); |
2733 _enumValues = values; | 2768 _enumValues = values; |
2734 } | 2769 } |
2735 | 2770 |
2736 @override | 2771 @override |
2737 DeclarationSite get declarationSite => this; | 2772 DeclarationSite get declarationSite => this; |
2738 } | 2773 } |
2739 | 2774 |
2775 /// This element is used to encode the implicit constructor in an enum class. | |
2776 /// | |
2777 /// For instance | |
2778 /// | |
2779 /// enum A { b, c, } | |
2780 /// | |
2781 /// is modelled as | |
2782 /// | |
2783 /// class A { | |
2784 /// final int index; | |
2785 /// | |
2786 /// const A(this.index); | |
2787 /// | |
2788 /// String toString() { | |
2789 /// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; | |
2790 /// } | |
2791 /// | |
2792 /// static const A b = const A(0); | |
2793 /// static const A c = const A(1); | |
2794 /// | |
2795 /// static const List<A> values = const <A>[b, c]; | |
2796 /// } | |
2797 /// | |
2798 /// where the `const A(...)` constructor is encoded using this element. | |
2799 /// | |
2740 class EnumConstructorElementX extends ConstructorElementX { | 2800 class EnumConstructorElementX extends ConstructorElementX { |
2741 final FunctionExpression node; | 2801 final FunctionExpression node; |
2742 | 2802 |
2743 EnumConstructorElementX( | 2803 EnumConstructorElementX( |
2744 EnumClassElementX enumClass, Modifiers modifiers, this.node) | 2804 EnumClassElementX enumClass, Modifiers modifiers, this.node) |
2745 : super( | 2805 : super( |
2746 '', // Name. | 2806 '', // Name. |
2747 ElementKind.GENERATIVE_CONSTRUCTOR, | 2807 ElementKind.GENERATIVE_CONSTRUCTOR, |
2748 modifiers, | 2808 modifiers, |
2749 enumClass); | 2809 enumClass); |
2750 | 2810 |
2751 @override | 2811 @override |
2752 bool get hasNode => true; | 2812 bool get hasNode => true; |
2753 | 2813 |
2754 @override | 2814 @override |
2755 FunctionExpression parseNode(Parsing parsing) => node; | 2815 FunctionExpression parseNode(Parsing parsing) => node; |
2756 | 2816 |
2757 @override | 2817 @override |
2758 SourceSpan get sourcePosition => enclosingClass.sourcePosition; | 2818 SourceSpan get sourcePosition => enclosingClass.sourcePosition; |
2759 } | 2819 } |
2760 | 2820 |
2821 /// This element is used to encode the implicit methods in an enum class. | |
2822 /// | |
2823 /// For instance | |
2824 /// | |
2825 /// enum A { b, c, } | |
2826 /// | |
2827 /// is modelled as | |
2828 /// | |
2829 /// class A { | |
2830 /// final int index; | |
2831 /// | |
2832 /// const A(this.index); | |
2833 /// | |
2834 /// String toString() { | |
2835 /// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; | |
2836 /// } | |
2837 /// | |
2838 /// static const A b = const A(0); | |
2839 /// static const A c = const A(1); | |
2840 /// | |
2841 /// static const List<A> values = const <A>[b, c]; | |
2842 /// } | |
2843 /// | |
2844 /// where the `toString` method is encoded using this element. | |
2845 /// | |
2761 class EnumMethodElementX extends MethodElementX { | 2846 class EnumMethodElementX extends MethodElementX { |
2762 final FunctionExpression node; | 2847 final FunctionExpression node; |
2763 | 2848 |
2764 EnumMethodElementX( | 2849 EnumMethodElementX( |
2765 String name, EnumClassElementX enumClass, Modifiers modifiers, this.node) | 2850 String name, EnumClassElementX enumClass, Modifiers modifiers, this.node) |
2766 : super(name, ElementKind.FUNCTION, modifiers, enumClass, true); | 2851 : super(name, ElementKind.FUNCTION, modifiers, enumClass, true); |
2767 | 2852 |
2768 @override | 2853 @override |
2769 bool get hasNode => true; | 2854 bool get hasNode => true; |
2770 | 2855 |
2771 @override | 2856 @override |
2772 FunctionExpression parseNode(Parsing parsing) => node; | 2857 FunctionExpression parseNode(Parsing parsing) => node; |
2773 | 2858 |
2774 @override | 2859 @override |
2775 SourceSpan get sourcePosition => enclosingClass.sourcePosition; | 2860 SourceSpan get sourcePosition => enclosingClass.sourcePosition; |
2776 } | 2861 } |
2777 | 2862 |
2863 /// This element is used to encode the initializing formal of the implicit | |
2864 /// constructor in an enum class. | |
2865 /// | |
2866 /// For instance | |
2867 /// | |
2868 /// enum A { b, c, } | |
2869 /// | |
2870 /// is modelled as | |
2871 /// | |
2872 /// class A { | |
2873 /// final int index; | |
2874 /// | |
2875 /// const A(this.index); | |
2876 /// | |
2877 /// String toString() { | |
2878 /// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; | |
2879 /// } | |
2880 /// | |
2881 /// static const A b = const A(0); | |
2882 /// static const A c = const A(1); | |
2883 /// | |
2884 /// static const List<A> values = const <A>[b, c]; | |
2885 /// } | |
2886 /// | |
2887 /// where the `this.index` formal is encoded using this element. | |
2888 /// | |
2778 class EnumFormalElementX extends InitializingFormalElementX { | 2889 class EnumFormalElementX extends InitializingFormalElementX { |
2779 EnumFormalElementX( | 2890 EnumFormalElementX( |
2780 ConstructorElement constructor, | 2891 ConstructorElement constructor, |
2781 VariableDefinitions variables, | 2892 VariableDefinitions variables, |
2782 Identifier identifier, | 2893 Identifier identifier, |
2783 EnumFieldElementX fieldElement) | 2894 EnumFieldElementX fieldElement) |
2784 : super(constructor, variables, identifier, null, fieldElement) { | 2895 : super(constructor, variables, identifier, null, fieldElement) { |
2785 typeCache = fieldElement.type; | 2896 typeCache = fieldElement.type; |
2786 } | 2897 } |
2787 | 2898 |
2788 @override | 2899 @override |
2789 SourceSpan get sourcePosition => enclosingClass.sourcePosition; | 2900 SourceSpan get sourcePosition => enclosingClass.sourcePosition; |
2790 } | 2901 } |
2791 | 2902 |
2903 /// This element is used to encode the implicitly fields in an enum class. | |
2904 /// | |
2905 /// For instance | |
2906 /// | |
2907 /// enum A { b, c, } | |
2908 /// | |
2909 /// is modelled as | |
2910 /// | |
2911 /// class A { | |
2912 /// final int index; | |
2913 /// | |
2914 /// const A(this.index); | |
2915 /// | |
2916 /// String toString() { | |
2917 /// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; | |
2918 /// } | |
2919 /// | |
2920 /// static const A b = const A(0); | |
2921 /// static const A c = const A(1); | |
2922 /// | |
2923 /// static const List<A> values = const <A>[b, c]; | |
2924 /// } | |
2925 /// | |
2926 /// where the `index` and `values` fields are encoded using this element. | |
2927 /// | |
2792 class EnumFieldElementX extends FieldElementX { | 2928 class EnumFieldElementX extends FieldElementX { |
2793 EnumFieldElementX(Identifier name, EnumClassElementX enumClass, | 2929 EnumFieldElementX(Identifier name, EnumClassElementX enumClass, |
2794 VariableList variableList, Node definition, | 2930 VariableList variableList, Node definition, |
2795 [Expression initializer]) | 2931 [Expression initializer]) |
2796 : super(name, enumClass, variableList) { | 2932 : super(name, enumClass, variableList) { |
2797 definitionsCache = new VariableDefinitions( | 2933 definitionsCache = new VariableDefinitions( |
2798 null, variableList.modifiers, new NodeList.singleton(definition)); | 2934 null, variableList.modifiers, new NodeList.singleton(definition)); |
2799 initializerCache = initializer; | 2935 initializerCache = initializer; |
2800 } | 2936 } |
2801 | 2937 |
2802 @override | 2938 @override |
2803 SourceSpan get sourcePosition => enclosingClass.sourcePosition; | 2939 SourceSpan get sourcePosition => enclosingClass.sourcePosition; |
2804 } | 2940 } |
2805 | 2941 |
2942 /// This element is used to encode the constant value in an enum class. | |
2943 /// | |
2944 /// For instance | |
2945 /// | |
2946 /// enum A { b, c, } | |
2947 /// | |
2948 /// is modelled as | |
2949 /// | |
2950 /// class A { | |
2951 /// final int index; | |
2952 /// | |
2953 /// const A(this.index); | |
2954 /// | |
2955 /// String toString() { | |
2956 /// return const <int, A>{0: 'A.b', 1: 'A.c'}[index]; | |
2957 /// } | |
2958 /// | |
2959 /// static const A b = const A(0); | |
2960 /// static const A c = const A(1); | |
2961 /// | |
2962 /// static const List<A> values = const <A>[b, c]; | |
2963 /// } | |
2964 /// | |
2965 /// where the `b` and `c` fields are encoded using this element. | |
2966 /// | |
2806 class EnumConstantElementX extends EnumFieldElementX | 2967 class EnumConstantElementX extends EnumFieldElementX |
2807 implements EnumConstantElement { | 2968 implements EnumConstantElement { |
2808 final int index; | 2969 final int index; |
2809 | 2970 |
2810 EnumConstantElementX( | 2971 EnumConstantElementX( |
2811 Identifier name, | 2972 Identifier name, |
2812 EnumClassElementX enumClass, | 2973 EnumClassElementX enumClass, |
2813 VariableList variableList, | 2974 VariableList variableList, |
2814 Node definition, | 2975 Node definition, |
2815 Expression initializer, | 2976 Expression initializer, |
2816 this.index) | 2977 this.index) |
2817 : super(name, enumClass, variableList, definition, initializer); | 2978 : super(name, enumClass, variableList, definition, initializer); |
2818 | 2979 |
2819 @override | 2980 @override |
2820 SourceSpan get sourcePosition { | 2981 SourceSpan get sourcePosition { |
2821 return new SourceSpan( | 2982 return new SourceSpan(enclosingClass.sourcePosition.uri, |
2822 enclosingClass.sourcePosition.uri, | |
2823 position.charOffset, position.charEnd); | 2983 position.charOffset, position.charEnd); |
2824 } | 2984 } |
2825 } | 2985 } |
2826 | 2986 |
2827 abstract class MixinApplicationElementX extends BaseClassElementX | 2987 abstract class MixinApplicationElementX extends BaseClassElementX |
2828 with MixinApplicationElementCommon | 2988 with MixinApplicationElementCommon |
2829 implements MixinApplicationElement { | 2989 implements MixinApplicationElement { |
2830 Link<ConstructorElement> constructors = new Link<ConstructorElement>(); | 2990 Link<ConstructorElement> constructors = new Link<ConstructorElement>(); |
2831 | 2991 |
2832 InterfaceType mixinType; | 2992 InterfaceType mixinType; |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3119 /// found through [declaration] since its node define the inheritance relation | 3279 /// found through [declaration] since its node define the inheritance relation |
3120 /// for the class. For unpatched elements the defining element is the element | 3280 /// for the class. For unpatched elements the defining element is the element |
3121 /// itself. | 3281 /// itself. |
3122 AstElement get definingElement; | 3282 AstElement get definingElement; |
3123 | 3283 |
3124 bool get hasResolvedAst { | 3284 bool get hasResolvedAst { |
3125 return definingElement.hasNode && definingElement.hasTreeElements; | 3285 return definingElement.hasNode && definingElement.hasTreeElements; |
3126 } | 3286 } |
3127 | 3287 |
3128 ResolvedAst get resolvedAst { | 3288 ResolvedAst get resolvedAst { |
3129 return new ResolvedAst( | 3289 return new ParsedResolvedAst( |
3130 declaration, definingElement.node, definingElement.treeElements); | 3290 declaration, definingElement.node, definingElement.treeElements); |
3131 } | 3291 } |
3132 } | 3292 } |
OLD | NEW |