OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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.common.resolution; | 5 library dart2js.common.resolution; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../compile_time_constants.dart'; | 8 import '../compile_time_constants.dart'; |
9 import '../compiler.dart' show Compiler; | 9 import '../compiler.dart' show Compiler; |
10 import '../constants/expressions.dart' show ConstantExpression; | 10 import '../constants/expressions.dart' show ConstantExpression; |
(...skipping 23 matching lines...) Expand all Loading... |
34 import '../patch_parser.dart'; | 34 import '../patch_parser.dart'; |
35 import '../resolution/resolution.dart'; | 35 import '../resolution/resolution.dart'; |
36 import '../tree/tree.dart' show Send, TypeAnnotation; | 36 import '../tree/tree.dart' show Send, TypeAnnotation; |
37 import '../universe/call_structure.dart' show CallStructure; | 37 import '../universe/call_structure.dart' show CallStructure; |
38 import '../universe/world_impact.dart' show WorldImpact; | 38 import '../universe/world_impact.dart' show WorldImpact; |
39 import '../universe/feature.dart'; | 39 import '../universe/feature.dart'; |
40 import 'backend_api.dart'; | 40 import 'backend_api.dart'; |
41 import 'work.dart' show WorkItem; | 41 import 'work.dart' show WorkItem; |
42 | 42 |
43 /// [WorkItem] used exclusively by the [ResolutionEnqueuer]. | 43 /// [WorkItem] used exclusively by the [ResolutionEnqueuer]. |
44 class ResolutionWorkItem extends WorkItem { | 44 abstract class ResolutionWorkItem implements WorkItem { |
| 45 factory ResolutionWorkItem(Resolution resolution, AstElement element) = |
| 46 _ResolutionWorkItem; |
| 47 } |
| 48 |
| 49 class _ResolutionWorkItem extends WorkItem implements ResolutionWorkItem { |
45 bool _isAnalyzed = false; | 50 bool _isAnalyzed = false; |
| 51 final Resolution resolution; |
46 | 52 |
47 ResolutionWorkItem(AstElement element) : super(element); | 53 _ResolutionWorkItem(this.resolution, AstElement element) : super(element); |
48 | 54 |
49 WorldImpact run(Compiler compiler, ResolutionEnqueuer world) { | 55 WorldImpact run() { |
50 WorldImpact impact = compiler.analyze(this, world); | 56 assert(invariant(element, !_isAnalyzed, |
| 57 message: 'Element ${element} has already been analyzed')); |
| 58 WorldImpact impact = resolution.computeWorldImpact(element); |
51 _isAnalyzed = true; | 59 _isAnalyzed = true; |
52 return impact; | 60 return impact; |
53 } | 61 } |
54 | |
55 bool get isAnalyzed => _isAnalyzed; | |
56 } | 62 } |
57 | 63 |
58 class ResolutionImpact extends WorldImpact { | 64 class ResolutionImpact extends WorldImpact { |
59 const ResolutionImpact(); | 65 const ResolutionImpact(); |
60 | 66 |
61 Iterable<Feature> get features => const <Feature>[]; | 67 Iterable<Feature> get features => const <Feature>[]; |
62 Iterable<MapLiteralUse> get mapLiterals => const <MapLiteralUse>[]; | 68 Iterable<MapLiteralUse> get mapLiterals => const <MapLiteralUse>[]; |
63 Iterable<ListLiteralUse> get listLiterals => const <ListLiteralUse>[]; | 69 Iterable<ListLiteralUse> get listLiterals => const <ListLiteralUse>[]; |
64 Iterable<String> get constSymbolNames => const <String>[]; | 70 Iterable<String> get constSymbolNames => const <String>[]; |
65 Iterable<ConstantExpression> get constantLiterals => | 71 Iterable<ConstantExpression> get constantLiterals => |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 | 209 |
204 void forgetElement(Element element); | 210 void forgetElement(Element element); |
205 | 211 |
206 /// Returns `true` if [value] is the top-level [proxy] annotation from the | 212 /// Returns `true` if [value] is the top-level [proxy] annotation from the |
207 /// core library. | 213 /// core library. |
208 bool isProxyConstant(ConstantValue value); | 214 bool isProxyConstant(ConstantValue value); |
209 } | 215 } |
210 | 216 |
211 /// A container of commonly used dependencies for tasks that involve parsing. | 217 /// A container of commonly used dependencies for tasks that involve parsing. |
212 abstract class ParsingContext { | 218 abstract class ParsingContext { |
213 factory ParsingContext( | 219 factory ParsingContext(DiagnosticReporter reporter, ParserTask parser, |
214 DiagnosticReporter reporter, | 220 PatchParserTask patchParser, Backend backend) = _ParsingContext; |
215 ParserTask parser, | |
216 PatchParserTask patchParser, | |
217 Backend backend) = _ParsingContext; | |
218 | 221 |
219 DiagnosticReporter get reporter; | 222 DiagnosticReporter get reporter; |
220 ParserTask get parser; | 223 ParserTask get parser; |
221 PatchParserTask get patchParser; | 224 PatchParserTask get patchParser; |
222 | 225 |
223 /// Use [patchParser] directly instead. | 226 /// Use [patchParser] directly instead. |
224 @deprecated | 227 @deprecated |
225 void parsePatchClass(ClassElement cls); | 228 void parsePatchClass(ClassElement cls); |
226 | 229 |
227 /// Use [parser] and measure directly instead. | 230 /// Use [parser] and measure directly instead. |
228 @deprecated | 231 @deprecated |
229 measure(f()); | 232 measure(f()); |
230 | 233 |
231 /// Get the [ScannerOptions] to scan the given [element]. | 234 /// Get the [ScannerOptions] to scan the given [element]. |
232 ScannerOptions getScannerOptionsFor(Element element); | 235 ScannerOptions getScannerOptionsFor(Element element); |
233 } | 236 } |
234 | 237 |
235 class _ParsingContext implements ParsingContext { | 238 class _ParsingContext implements ParsingContext { |
236 final DiagnosticReporter reporter; | 239 final DiagnosticReporter reporter; |
237 final ParserTask parser; | 240 final ParserTask parser; |
238 final PatchParserTask patchParser; | 241 final PatchParserTask patchParser; |
239 final Backend backend; | 242 final Backend backend; |
240 | 243 |
241 _ParsingContext(this.reporter, this.parser, | 244 _ParsingContext(this.reporter, this.parser, this.patchParser, this.backend); |
242 this.patchParser, this.backend); | |
243 | 245 |
244 @override | 246 @override |
245 measure(f()) => parser.measure(f); | 247 measure(f()) => parser.measure(f); |
246 | 248 |
247 @override | 249 @override |
248 void parsePatchClass(ClassElement cls) { | 250 void parsePatchClass(ClassElement cls) { |
249 patchParser.measure(() { | 251 patchParser.measure(() { |
250 if (cls.isPatch) { | 252 if (cls.isPatch) { |
251 patchParser.parsePatchClassNode(cls); | 253 patchParser.parsePatchClassNode(cls); |
252 } | 254 } |
253 }); | 255 }); |
254 } | 256 } |
255 | 257 |
256 @override | 258 @override |
257 ScannerOptions getScannerOptionsFor(Element element) => new ScannerOptions( | 259 ScannerOptions getScannerOptionsFor(Element element) => new ScannerOptions( |
258 canUseNative: backend.canLibraryUseNative(element.library)); | 260 canUseNative: backend.canLibraryUseNative(element.library)); |
259 } | 261 } |
OLD | NEW |