| 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 |