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 dart2js.mirrors_used; | 5 library dart2js.mirrors_used; |
6 | 6 |
7 import 'common/tasks.dart' show CompilerTask; | 7 import 'common/tasks.dart' show CompilerTask; |
8 import 'common.dart'; | 8 import 'common.dart'; |
9 import 'compile_time_constants.dart' show ConstantCompiler; | 9 import 'compile_time_constants.dart' show ConstantCompiler; |
10 import 'compiler.dart' show Compiler; | 10 import 'compiler.dart' show Compiler; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 | 84 |
85 MirrorUsageAnalyzerTask(Compiler compiler) | 85 MirrorUsageAnalyzerTask(Compiler compiler) |
86 : compiler = compiler, | 86 : compiler = compiler, |
87 super(compiler.measurer) { | 87 super(compiler.measurer) { |
88 analyzer = new MirrorUsageAnalyzer(compiler, this); | 88 analyzer = new MirrorUsageAnalyzer(compiler, this); |
89 } | 89 } |
90 | 90 |
91 /// Collect @MirrorsUsed annotations in all libraries. Called by the | 91 /// Collect @MirrorsUsed annotations in all libraries. Called by the |
92 /// compiler after all libraries are loaded, but before resolution. | 92 /// compiler after all libraries are loaded, but before resolution. |
93 void analyzeUsage(LibraryElement mainApp) { | 93 void analyzeUsage(LibraryElement mainApp) { |
94 if (mainApp == null || compiler.mirrorsLibrary == null) return; | 94 if (mainApp == null || compiler.commonElements.mirrorsLibrary == null) { |
| 95 return; |
| 96 } |
95 measure(analyzer.run); | 97 measure(analyzer.run); |
96 List<String> symbols = analyzer.mergedMirrorUsage.symbols; | 98 List<String> symbols = analyzer.mergedMirrorUsage.symbols; |
97 List<Element> targets = analyzer.mergedMirrorUsage.targets; | 99 List<Element> targets = analyzer.mergedMirrorUsage.targets; |
98 List<Element> metaTargets = analyzer.mergedMirrorUsage.metaTargets; | 100 List<Element> metaTargets = analyzer.mergedMirrorUsage.metaTargets; |
99 compiler.backend.registerMirrorUsage( | 101 compiler.backend.registerMirrorUsage( |
100 symbols == null ? null : new Set<String>.from(symbols), | 102 symbols == null ? null : new Set<String>.from(symbols), |
101 targets == null ? null : new Set<Element>.from(targets), | 103 targets == null ? null : new Set<Element>.from(targets), |
102 metaTargets == null ? null : new Set<Element>.from(metaTargets)); | 104 metaTargets == null ? null : new Set<Element>.from(metaTargets)); |
103 librariesWithUsage = analyzer.librariesWithUsage; | 105 librariesWithUsage = analyzer.librariesWithUsage; |
104 } | 106 } |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 usageMap.putIfAbsent(overridden, () => <MirrorUsage>[]); | 236 usageMap.putIfAbsent(overridden, () => <MirrorUsage>[]); |
235 usages.addAll(overriddenUsages); | 237 usages.addAll(overriddenUsages); |
236 }); | 238 }); |
237 } | 239 } |
238 | 240 |
239 /// Find @MirrorsUsed annotations on the given import [tag] in [library]. The | 241 /// Find @MirrorsUsed annotations on the given import [tag] in [library]. The |
240 /// annotations are represented as [MirrorUsage]. | 242 /// annotations are represented as [MirrorUsage]. |
241 List<MirrorUsage> mirrorsUsedOnLibraryTag( | 243 List<MirrorUsage> mirrorsUsedOnLibraryTag( |
242 LibraryElement library, ImportElement import) { | 244 LibraryElement library, ImportElement import) { |
243 LibraryElement importedLibrary = import.importedLibrary; | 245 LibraryElement importedLibrary = import.importedLibrary; |
244 if (importedLibrary != compiler.mirrorsLibrary) { | 246 if (importedLibrary != compiler.commonElements.mirrorsLibrary) { |
245 return null; | 247 return null; |
246 } | 248 } |
247 List<MirrorUsage> result = <MirrorUsage>[]; | 249 List<MirrorUsage> result = <MirrorUsage>[]; |
248 for (MetadataAnnotation metadata in import.metadata) { | 250 for (MetadataAnnotation metadata in import.metadata) { |
249 metadata.ensureResolved(compiler.resolution); | 251 metadata.ensureResolved(compiler.resolution); |
250 ConstantValue value = | 252 ConstantValue value = |
251 compiler.constants.getConstantValue(metadata.constant); | 253 compiler.constants.getConstantValue(metadata.constant); |
252 Element element = value.getType(compiler.coreTypes).element; | 254 Element element = value.getType(compiler.coreTypes).element; |
253 if (element == compiler.mirrorsUsedClass) { | 255 if (element == compiler.commonElements.mirrorsUsedClass) { |
254 result.add(buildUsage(value)); | 256 result.add(buildUsage(value)); |
255 } | 257 } |
256 } | 258 } |
257 return result; | 259 return result; |
258 } | 260 } |
259 | 261 |
260 /// Merge all [MirrorUsage] instances accross all libraries. | 262 /// Merge all [MirrorUsage] instances accross all libraries. |
261 MirrorUsage mergeUsages(Map<LibraryElement, List<MirrorUsage>> usageMap) { | 263 MirrorUsage mergeUsages(Map<LibraryElement, List<MirrorUsage>> usageMap) { |
262 Set<MirrorUsage> usagesToMerge = new Set<MirrorUsage>(); | 264 Set<MirrorUsage> usagesToMerge = new Set<MirrorUsage>(); |
263 usageMap.forEach((LibraryElement library, List<MirrorUsage> usages) { | 265 usageMap.forEach((LibraryElement library, List<MirrorUsage> usages) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 } else if (metaTargets != wildcard && b.metaTargets != null) { | 308 } else if (metaTargets != wildcard && b.metaTargets != null) { |
307 metaTargets.addAll(b.metaTargets); | 309 metaTargets.addAll(b.metaTargets); |
308 } | 310 } |
309 return new MirrorUsage(symbols, targets, metaTargets, null); | 311 return new MirrorUsage(symbols, targets, metaTargets, null); |
310 } | 312 } |
311 | 313 |
312 /// Convert a [constant] to an instance of [MirrorUsage] using information | 314 /// Convert a [constant] to an instance of [MirrorUsage] using information |
313 /// that was resolved during [MirrorUsageAnalyzerTask.validate]. | 315 /// that was resolved during [MirrorUsageAnalyzerTask.validate]. |
314 MirrorUsage buildUsage(ConstructedConstantValue constant) { | 316 MirrorUsage buildUsage(ConstructedConstantValue constant) { |
315 Map<Element, ConstantValue> fields = constant.fields; | 317 Map<Element, ConstantValue> fields = constant.fields; |
316 VariableElement symbolsField = | 318 ClassElement cls = compiler.commonElements.mirrorsUsedClass; |
317 compiler.mirrorsUsedClass.lookupLocalMember('symbols'); | 319 VariableElement symbolsField = cls.lookupLocalMember('symbols'); |
318 VariableElement targetsField = | 320 VariableElement targetsField = cls.lookupLocalMember('targets'); |
319 compiler.mirrorsUsedClass.lookupLocalMember('targets'); | 321 VariableElement metaTargetsField = cls.lookupLocalMember('metaTargets'); |
320 VariableElement metaTargetsField = | 322 VariableElement overrideField = cls.lookupLocalMember('override'); |
321 compiler.mirrorsUsedClass.lookupLocalMember('metaTargets'); | |
322 VariableElement overrideField = | |
323 compiler.mirrorsUsedClass.lookupLocalMember('override'); | |
324 | 323 |
325 return new MirrorUsage( | 324 return new MirrorUsage( |
326 cachedStrings[fields[symbolsField]], | 325 cachedStrings[fields[symbolsField]], |
327 cachedElements[fields[targetsField]], | 326 cachedElements[fields[targetsField]], |
328 cachedElements[fields[metaTargetsField]], | 327 cachedElements[fields[metaTargetsField]], |
329 cachedElements[fields[overrideField]]); | 328 cachedElements[fields[overrideField]]); |
330 } | 329 } |
331 } | 330 } |
332 | 331 |
333 /// Used to represent a resolved MirrorsUsed constant. | 332 /// Used to represent a resolved MirrorsUsed constant. |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
565 // @MirrorsUsed(targets: fisk) | 564 // @MirrorsUsed(targets: fisk) |
566 // ^^^^ | 565 // ^^^^ |
567 // | 566 // |
568 // Instead of saying 'fisk' should pretty print the problematic constant | 567 // Instead of saying 'fisk' should pretty print the problematic constant |
569 // value. | 568 // value. |
570 return spannable; | 569 return spannable; |
571 } | 570 } |
572 return node; | 571 return node; |
573 } | 572 } |
574 } | 573 } |
OLD | NEW |