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 import '../common/backend_api.dart'; | 5 import '../common/backend_api.dart'; |
6 import '../common/resolution.dart'; | 6 import '../common/resolution.dart'; |
7 import '../common_elements.dart'; | 7 import '../common_elements.dart'; |
8 import '../constants/constant_system.dart'; | 8 import '../constants/constant_system.dart'; |
9 import '../constants/values.dart'; | 9 import '../constants/values.dart'; |
10 import '../elements/elements.dart'; | 10 import '../elements/elements.dart'; |
11 import '../elements/entities.dart'; | 11 import '../elements/entities.dart'; |
12 import '../elements/resolution_types.dart'; | 12 import '../elements/resolution_types.dart'; |
13 import '../universe/call_structure.dart'; | 13 import '../universe/call_structure.dart'; |
14 import '../universe/use.dart' show ConstantUse, StaticUse; | 14 import '../universe/use.dart' show ConstantUse, StaticUse; |
15 import '../universe/world_impact.dart' | 15 import '../universe/world_impact.dart' |
16 show WorldImpact, StagedWorldImpactBuilder; | 16 show WorldImpact, StagedWorldImpactBuilder; |
17 import 'backend_usage.dart' show BackendUsageBuilder; | 17 import 'backend_usage.dart' show BackendUsageBuilder; |
18 import 'backend_helpers.dart'; | |
19 import 'native_data.dart'; | 18 import 'native_data.dart'; |
20 | 19 |
21 /** | 20 /** |
22 * Support for Custom Elements. | 21 * Support for Custom Elements. |
23 * | 22 * |
24 * The support for custom elements the compiler builds a table that maps the | 23 * The support for custom elements the compiler builds a table that maps the |
25 * custom element class's [Type] to the interceptor for the class and the | 24 * custom element class's [Type] to the interceptor for the class and the |
26 * constructor(s) for the class. | 25 * constructor(s) for the class. |
27 * | 26 * |
28 * We want the table to contain only the custom element classes used, and we | 27 * We want the table to contain only the custom element classes used, and we |
(...skipping 21 matching lines...) Expand all Loading... |
50 * final tag; | 49 * final tag; |
51 * Component(this.tag); | 50 * Component(this.tag); |
52 * void register() => document.register(T, tag); | 51 * void register() => document.register(T, tag); |
53 * } | 52 * } |
54 * const Component<FancyButton>('x-fancy-button').register(); | 53 * const Component<FancyButton>('x-fancy-button').register(); |
55 * | 54 * |
56 * In these cases we conservatively generate all viable entries in the table. | 55 * In these cases we conservatively generate all viable entries in the table. |
57 */ | 56 */ |
58 abstract class CustomElementsAnalysisBase { | 57 abstract class CustomElementsAnalysisBase { |
59 final NativeBasicData _nativeData; | 58 final NativeBasicData _nativeData; |
60 final BackendHelpers _helpers; | |
61 final Resolution _resolution; | 59 final Resolution _resolution; |
| 60 final CommonElements _commonElements; |
62 | 61 |
63 CustomElementsAnalysisBase(this._resolution, this._helpers, this._nativeData); | 62 CustomElementsAnalysisBase( |
| 63 this._resolution, this._commonElements, this._nativeData); |
64 | 64 |
65 CustomElementsAnalysisJoin get join; | 65 CustomElementsAnalysisJoin get join; |
66 | 66 |
67 void registerInstantiatedClass(ClassElement classElement) { | 67 void registerInstantiatedClass(ClassElement classElement) { |
68 classElement.ensureResolved(_resolution); | 68 classElement.ensureResolved(_resolution); |
69 if (!_nativeData.isNativeOrExtendsNative(classElement)) return; | 69 if (!_nativeData.isNativeOrExtendsNative(classElement)) return; |
70 if (classElement.isMixinApplication) return; | 70 if (classElement.isMixinApplication) return; |
71 if (classElement.isAbstract) return; | 71 if (classElement.isAbstract) return; |
72 // JsInterop classes are opaque interfaces without a concrete | 72 // JsInterop classes are opaque interfaces without a concrete |
73 // implementation. | 73 // implementation. |
74 if (_nativeData.isJsInteropClass(classElement)) return; | 74 if (_nativeData.isJsInteropClass(classElement)) return; |
75 join.instantiatedClasses.add(classElement); | 75 join.instantiatedClasses.add(classElement); |
76 } | 76 } |
77 | 77 |
78 void registerStaticUse(MemberEntity element) { | 78 void registerStaticUse(MemberEntity element) { |
79 assert(element != null); | 79 assert(element != null); |
80 if (element == _helpers.findIndexForNativeSubclassType) { | 80 if (element == _commonElements.findIndexForNativeSubclassType) { |
81 join.demanded = true; | 81 join.demanded = true; |
82 } | 82 } |
83 } | 83 } |
84 | 84 |
85 /// Computes the [WorldImpact] of the classes registered since last flush. | 85 /// Computes the [WorldImpact] of the classes registered since last flush. |
86 WorldImpact flush() => join.flush(); | 86 WorldImpact flush() => join.flush(); |
87 } | 87 } |
88 | 88 |
89 class CustomElementsResolutionAnalysis extends CustomElementsAnalysisBase { | 89 class CustomElementsResolutionAnalysis extends CustomElementsAnalysisBase { |
90 final CustomElementsAnalysisJoin join; | 90 final CustomElementsAnalysisJoin join; |
91 | 91 |
92 CustomElementsResolutionAnalysis( | 92 CustomElementsResolutionAnalysis( |
93 Resolution resolution, | 93 Resolution resolution, |
94 ConstantSystem constantSystem, | 94 ConstantSystem constantSystem, |
95 CommonElements commonElements, | 95 CommonElements commonElements, |
96 BackendClasses backendClasses, | 96 BackendClasses backendClasses, |
97 BackendHelpers helpers, | |
98 NativeBasicData nativeData, | 97 NativeBasicData nativeData, |
99 BackendUsageBuilder backendUsageBuilder) | 98 BackendUsageBuilder backendUsageBuilder) |
100 : join = new CustomElementsAnalysisJoin(resolution, constantSystem, | 99 : join = new CustomElementsAnalysisJoin(resolution, constantSystem, |
101 commonElements, backendClasses, nativeData, | 100 commonElements, backendClasses, nativeData, |
102 backendUsageBuilder: backendUsageBuilder), | 101 backendUsageBuilder: backendUsageBuilder), |
103 super(resolution, helpers, nativeData) { | 102 super(resolution, commonElements, nativeData) { |
104 // TODO(sra): Remove this work-around. We should mark allClassesSelected in | 103 // TODO(sra): Remove this work-around. We should mark allClassesSelected in |
105 // both joins only when we see a construct generating an unknown [Type] but | 104 // both joins only when we see a construct generating an unknown [Type] but |
106 // we can't currently recognize all cases. In particular, the work-around | 105 // we can't currently recognize all cases. In particular, the work-around |
107 // for the unimplemented `ClassMirror.reflectedType` is not recognizable. | 106 // for the unimplemented `ClassMirror.reflectedType` is not recognizable. |
108 // TODO(12607): Match on [ClassMirror.reflectedType] | 107 // TODO(12607): Match on [ClassMirror.reflectedType] |
109 join.allClassesSelected = true; | 108 join.allClassesSelected = true; |
110 } | 109 } |
111 | 110 |
112 void registerTypeLiteral(ResolutionDartType type) { | 111 void registerTypeLiteral(ResolutionDartType type) { |
113 if (type.isInterfaceType) { | 112 if (type.isInterfaceType) { |
(...skipping 11 matching lines...) Expand all Loading... |
125 } | 124 } |
126 | 125 |
127 class CustomElementsCodegenAnalysis extends CustomElementsAnalysisBase { | 126 class CustomElementsCodegenAnalysis extends CustomElementsAnalysisBase { |
128 final CustomElementsAnalysisJoin join; | 127 final CustomElementsAnalysisJoin join; |
129 | 128 |
130 CustomElementsCodegenAnalysis( | 129 CustomElementsCodegenAnalysis( |
131 Resolution resolution, | 130 Resolution resolution, |
132 ConstantSystem constantSystem, | 131 ConstantSystem constantSystem, |
133 CommonElements commonElements, | 132 CommonElements commonElements, |
134 BackendClasses backendClasses, | 133 BackendClasses backendClasses, |
135 BackendHelpers helpers, | |
136 NativeBasicData nativeData) | 134 NativeBasicData nativeData) |
137 : join = new CustomElementsAnalysisJoin(resolution, constantSystem, | 135 : join = new CustomElementsAnalysisJoin(resolution, constantSystem, |
138 commonElements, backendClasses, nativeData), | 136 commonElements, backendClasses, nativeData), |
139 super(resolution, helpers, nativeData) { | 137 super(resolution, commonElements, nativeData) { |
140 // TODO(sra): Remove this work-around. We should mark allClassesSelected in | 138 // TODO(sra): Remove this work-around. We should mark allClassesSelected in |
141 // both joins only when we see a construct generating an unknown [Type] but | 139 // both joins only when we see a construct generating an unknown [Type] but |
142 // we can't currently recognize all cases. In particular, the work-around | 140 // we can't currently recognize all cases. In particular, the work-around |
143 // for the unimplemented `ClassMirror.reflectedType` is not recognizable. | 141 // for the unimplemented `ClassMirror.reflectedType` is not recognizable. |
144 // TODO(12607): Match on [ClassMirror.reflectedType] | 142 // TODO(12607): Match on [ClassMirror.reflectedType] |
145 join.allClassesSelected = true; | 143 join.allClassesSelected = true; |
146 } | 144 } |
147 | 145 |
148 void registerTypeConstant(ClassElement element) { | 146 void registerTypeConstant(ClassElement element) { |
149 assert(element.isClass); | 147 assert(element.isClass); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 result.add(member); | 250 result.add(member); |
253 } | 251 } |
254 } | 252 } |
255 } | 253 } |
256 | 254 |
257 classElement.forEachMember(selectGenerativeConstructors, | 255 classElement.forEachMember(selectGenerativeConstructors, |
258 includeBackendMembers: false, includeSuperAndInjectedMembers: false); | 256 includeBackendMembers: false, includeSuperAndInjectedMembers: false); |
259 return result; | 257 return result; |
260 } | 258 } |
261 } | 259 } |
OLD | NEW |