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

Side by Side Diff: pkg/compiler/lib/src/common/resolution.dart

Issue 1421463005: Move codegen registration to transformImpact method. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Updated cf. comments. Created 5 years, 1 month 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
« no previous file with comments | « pkg/compiler/lib/src/common/registry.dart ('k') | pkg/compiler/lib/src/compiler.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 2 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
3 // for details. All rights reserved. Use of this source code is governed by a 3 // for details. All rights reserved. Use of this source code is governed by a
4 // BSD-style license that can be found in the LICENSE file. 4 // BSD-style license that can be found in the LICENSE file.
5 5
6 library dart2js.common.resolution; 6 library dart2js.common.resolution;
7 7
8 import '../common.dart'; 8 import '../common.dart';
9 import '../compiler.dart' show 9 import '../compiler.dart' show
10 Compiler; 10 Compiler;
(...skipping 15 matching lines...) Expand all
26 TypedefElement, 26 TypedefElement,
27 TypeVariableElement; 27 TypeVariableElement;
28 import '../enqueue.dart' show 28 import '../enqueue.dart' show
29 ResolutionEnqueuer; 29 ResolutionEnqueuer;
30 import '../parser/element_listener.dart' show 30 import '../parser/element_listener.dart' show
31 ScannerOptions; 31 ScannerOptions;
32 import '../tree/tree.dart' show 32 import '../tree/tree.dart' show
33 AsyncForIn, 33 AsyncForIn,
34 Send, 34 Send,
35 TypeAnnotation; 35 TypeAnnotation;
36 import '../universe/universe.dart' show
37 UniverseSelector;
38 import '../universe/world_impact.dart' show 36 import '../universe/world_impact.dart' show
39 WorldImpact; 37 WorldImpact;
40 import '../util/util.dart' show
41 Setlet;
42 import 'work.dart' show 38 import 'work.dart' show
43 ItemCompilationContext, 39 ItemCompilationContext,
44 WorkItem; 40 WorkItem;
45 41
46 /// [WorkItem] used exclusively by the [ResolutionEnqueuer]. 42 /// [WorkItem] used exclusively by the [ResolutionEnqueuer].
47 class ResolutionWorkItem extends WorkItem { 43 class ResolutionWorkItem extends WorkItem {
48 bool _isAnalyzed = false; 44 bool _isAnalyzed = false;
49 45
50 ResolutionWorkItem(AstElement element, 46 ResolutionWorkItem(AstElement element,
51 ItemCompilationContext compilationContext) 47 ItemCompilationContext compilationContext)
52 : super(element, compilationContext); 48 : super(element, compilationContext);
53 49
54 WorldImpact run(Compiler compiler, ResolutionEnqueuer world) { 50 WorldImpact run(Compiler compiler, ResolutionEnqueuer world) {
55 WorldImpact impact = compiler.analyze(this, world); 51 WorldImpact impact = compiler.analyze(this, world);
56 _isAnalyzed = true; 52 _isAnalyzed = true;
57 return impact; 53 return impact;
58 } 54 }
59 55
60 bool get isAnalyzed => _isAnalyzed; 56 bool get isAnalyzed => _isAnalyzed;
61 } 57 }
62 58
63 // TODO(johnniwinther): Rename this to something like `BackendResolutionApi`
64 // and clean up the interface.
65 /// Backend callbacks function specific to the resolution phase.
66 class ResolutionCallbacks {
67 /// Transform the [ResolutionImpact] into a [WorldImpact] adding the
68 /// backend dependencies for features used in [worldImpact].
69 WorldImpact transformImpact(ResolutionImpact worldImpact) => worldImpact;
70 }
71
72 class ResolutionImpact extends WorldImpact { 59 class ResolutionImpact extends WorldImpact {
73 const ResolutionImpact(); 60 const ResolutionImpact();
74 61
75 // TODO(johnniwinther): Remove this. 62 // TODO(johnniwinther): Remove this.
76 void registerDependency(Element element) {} 63 void registerDependency(Element element) {}
77 64
78 Iterable<Feature> get features => const <Feature>[]; 65 Iterable<Feature> get features => const <Feature>[];
79 Iterable<DartType> get requiredTypes => const <DartType>[]; 66 Iterable<DartType> get requiredTypes => const <DartType>[];
80 Iterable<MapLiteralUse> get mapLiterals => const <MapLiteralUse>[]; 67 Iterable<MapLiteralUse> get mapLiterals => const <MapLiteralUse>[];
81 Iterable<ListLiteralUse> get listLiterals => const <ListLiteralUse>[]; 68 Iterable<ListLiteralUse> get listLiterals => const <ListLiteralUse>[];
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 bool operator ==(other) { 163 bool operator ==(other) {
177 if (identical(this, other)) return true; 164 if (identical(this, other)) return true;
178 if (other is! ListLiteralUse) return false; 165 if (other is! ListLiteralUse) return false;
179 return 166 return
180 type == other.type && 167 type == other.type &&
181 isConstant == other.isConstant && 168 isConstant == other.isConstant &&
182 isEmpty == other.isEmpty; 169 isEmpty == other.isEmpty;
183 } 170 }
184 } 171 }
185 172
186 /// Mutable implementation of [WorldImpact] used to transform
187 /// [ResolutionImpact] to [WorldImpact].
188 class TransformedWorldImpact implements WorldImpact {
189 final ResolutionImpact worldImpact;
190
191 Setlet<Element> _staticUses;
192 Setlet<InterfaceType> _instantiatedTypes;
193 Setlet<UniverseSelector> _dynamicGetters;
194 Setlet<UniverseSelector> _dynamicInvocations;
195 Setlet<UniverseSelector> _dynamicSetters;
196
197 TransformedWorldImpact(this.worldImpact);
198
199 @override
200 Iterable<DartType> get asCasts => worldImpact.asCasts;
201
202 @override
203 Iterable<DartType> get checkedModeChecks => worldImpact.checkedModeChecks;
204
205 @override
206 Iterable<MethodElement> get closurizedFunctions {
207 return worldImpact.closurizedFunctions;
208 }
209
210 @override
211 Iterable<UniverseSelector> get dynamicGetters {
212 return _dynamicGetters != null
213 ? _dynamicGetters : worldImpact.dynamicGetters;
214 }
215
216 @override
217 Iterable<UniverseSelector> get dynamicInvocations {
218 return _dynamicInvocations != null
219 ? _dynamicInvocations : worldImpact.dynamicInvocations;
220 }
221
222 @override
223 Iterable<UniverseSelector> get dynamicSetters {
224 return _dynamicSetters != null
225 ? _dynamicSetters : worldImpact.dynamicSetters;
226 }
227
228 @override
229 Iterable<DartType> get isChecks => worldImpact.isChecks;
230
231 @override
232 Iterable<DartType> get onCatchTypes => worldImpact.onCatchTypes;
233
234 _unsupported(String message) => throw new UnsupportedError(message);
235
236 void registerDynamicGetter(UniverseSelector selector) {
237 if (_dynamicGetters == null) {
238 _dynamicGetters = new Setlet<UniverseSelector>();
239 _dynamicGetters.addAll(worldImpact.dynamicGetters);
240 }
241 _dynamicGetters.add(selector);
242 }
243
244 void registerDynamicInvocation(UniverseSelector selector) {
245 if (_dynamicInvocations == null) {
246 _dynamicInvocations = new Setlet<UniverseSelector>();
247 _dynamicInvocations.addAll(worldImpact.dynamicInvocations);
248 }
249 _dynamicInvocations.add(selector);
250 }
251
252 void registerDynamicSetter(UniverseSelector selector) {
253 if (_dynamicSetters == null) {
254 _dynamicSetters = new Setlet<UniverseSelector>();
255 _dynamicSetters.addAll(worldImpact.dynamicSetters);
256 }
257 _dynamicSetters.add(selector);
258 }
259
260 void registerInstantiatedType(InterfaceType type) {
261 if (_instantiatedTypes == null) {
262 _instantiatedTypes = new Setlet<InterfaceType>();
263 _instantiatedTypes.addAll(worldImpact.instantiatedTypes);
264 }
265 _instantiatedTypes.add(type);
266 }
267
268 @override
269 Iterable<InterfaceType> get instantiatedTypes {
270 return _instantiatedTypes != null
271 ? _instantiatedTypes : worldImpact.instantiatedTypes;
272 }
273
274 @override
275 Iterable<DartType> get typeLiterals {
276 return worldImpact.typeLiterals;
277 }
278
279 void registerStaticUse(Element element) {
280 if (_staticUses == null) {
281 _staticUses = new Setlet<Element>();
282 _staticUses.addAll(worldImpact.staticUses);
283 }
284 _staticUses.add(element);
285 }
286
287 @override
288 Iterable<Element> get staticUses {
289 return _staticUses != null ? _staticUses : worldImpact.staticUses;
290 }
291
292 @override
293 Iterable<LocalFunctionElement> get closures => worldImpact.closures;
294
295 String toString() {
296 StringBuffer sb = new StringBuffer();
297 sb.write('TransformedWorldImpact($worldImpact)');
298 WorldImpact.printOn(sb, this);
299 return sb.toString();
300 }
301 }
302
303 // TODO(johnniwinther): Rename to `Resolver` or `ResolverContext`. 173 // TODO(johnniwinther): Rename to `Resolver` or `ResolverContext`.
304 abstract class Resolution { 174 abstract class Resolution {
305 Parsing get parsing; 175 Parsing get parsing;
306 DiagnosticReporter get reporter; 176 DiagnosticReporter get reporter;
307 CoreTypes get coreTypes; 177 CoreTypes get coreTypes;
308 178
309 void resolveTypedef(TypedefElement typdef); 179 void resolveTypedef(TypedefElement typdef);
310 void resolveClass(ClassElement cls); 180 void resolveClass(ClassElement cls);
311 void registerClass(ClassElement cls); 181 void registerClass(ClassElement cls);
312 void resolveMetadataAnnotation(MetadataAnnotation metadataAnnotation); 182 void resolveMetadataAnnotation(MetadataAnnotation metadataAnnotation);
313 FunctionSignature resolveSignature(FunctionElement function); 183 FunctionSignature resolveSignature(FunctionElement function);
314 DartType resolveTypeAnnotation(Element element, TypeAnnotation node); 184 DartType resolveTypeAnnotation(Element element, TypeAnnotation node);
315 185
316 bool hasBeenResolved(Element element); 186 bool hasBeenResolved(Element element);
317 WorldImpact getWorldImpact(Element element); 187 WorldImpact getWorldImpact(Element element);
318 WorldImpact computeWorldImpact(Element element); 188 WorldImpact computeWorldImpact(Element element);
319 } 189 }
320 190
321 // TODO(johnniwinther): Rename to `Parser` or `ParsingContext`. 191 // TODO(johnniwinther): Rename to `Parser` or `ParsingContext`.
322 abstract class Parsing { 192 abstract class Parsing {
323 DiagnosticReporter get reporter; 193 DiagnosticReporter get reporter;
324 void parsePatchClass(ClassElement cls); 194 void parsePatchClass(ClassElement cls);
325 measure(f()); 195 measure(f());
326 ScannerOptions getScannerOptionsFor(Element element); 196 ScannerOptions getScannerOptionsFor(Element element);
327 } 197 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/common/registry.dart ('k') | pkg/compiler/lib/src/compiler.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698