| 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 '../compiler.dart' show Compiler; | 8 import '../compiler.dart' show Compiler; |
| 9 import '../compile_time_constants.dart'; |
| 9 import '../constants/expressions.dart' show ConstantExpression; | 10 import '../constants/expressions.dart' show ConstantExpression; |
| 11 import '../constants/values.dart' show ConstantValue; |
| 10 import '../core_types.dart' show CoreClasses, CoreTypes; | 12 import '../core_types.dart' show CoreClasses, CoreTypes; |
| 11 import '../dart_types.dart' show DartType, InterfaceType, Types; | 13 import '../dart_types.dart' show DartType, InterfaceType, Types; |
| 12 import '../elements/elements.dart' | 14 import '../elements/elements.dart' |
| 13 show | 15 show |
| 14 AstElement, | 16 AstElement, |
| 15 ClassElement, | 17 ClassElement, |
| 18 ConstructorElement, |
| 16 Element, | 19 Element, |
| 17 ExecutableElement, | 20 ExecutableElement, |
| 18 FunctionElement, | 21 FunctionElement, |
| 19 FunctionSignature, | 22 FunctionSignature, |
| 20 LibraryElement, | 23 LibraryElement, |
| 21 MetadataAnnotation, | 24 MetadataAnnotation, |
| 25 MethodElement, |
| 22 ResolvedAst, | 26 ResolvedAst, |
| 23 TypedefElement; | 27 TypedefElement; |
| 24 import '../enqueue.dart' show ResolutionEnqueuer; | 28 import '../enqueue.dart' show ResolutionEnqueuer; |
| 25 import '../options.dart' show ParserOptions; | 29 import '../id_generator.dart'; |
| 30 import '../mirrors_used.dart'; |
| 31 import '../options.dart' show CompilerOptions, ParserOptions; |
| 26 import '../parser/element_listener.dart' show ScannerOptions; | 32 import '../parser/element_listener.dart' show ScannerOptions; |
| 27 import '../parser/parser_task.dart'; | 33 import '../parser/parser_task.dart'; |
| 28 import '../patch_parser.dart'; | 34 import '../patch_parser.dart'; |
| 29 import '../tree/tree.dart' show TypeAnnotation; | 35 import '../resolution/resolution.dart'; |
| 36 import '../tree/tree.dart' show Send, TypeAnnotation; |
| 37 import '../universe/call_structure.dart' show CallStructure; |
| 30 import '../universe/world_impact.dart' show WorldImpact; | 38 import '../universe/world_impact.dart' show WorldImpact; |
| 31 import 'backend_api.dart'; | 39 import 'backend_api.dart'; |
| 32 import 'work.dart' show ItemCompilationContext, WorkItem; | 40 import 'work.dart' show ItemCompilationContext, WorkItem; |
| 33 | 41 |
| 34 /// [WorkItem] used exclusively by the [ResolutionEnqueuer]. | 42 /// [WorkItem] used exclusively by the [ResolutionEnqueuer]. |
| 35 class ResolutionWorkItem extends WorkItem { | 43 class ResolutionWorkItem extends WorkItem { |
| 36 bool _isAnalyzed = false; | 44 bool _isAnalyzed = false; |
| 37 | 45 |
| 38 ResolutionWorkItem( | 46 ResolutionWorkItem( |
| 39 AstElement element, ItemCompilationContext compilationContext) | 47 AstElement element, ItemCompilationContext compilationContext) |
| 40 : super(element, compilationContext); | 48 : super(element, compilationContext); |
| 41 | 49 |
| 42 WorldImpact run(Compiler compiler, ResolutionEnqueuer world) { | 50 WorldImpact run(Compiler compiler, ResolutionEnqueuer world) { |
| 43 WorldImpact impact = compiler.analyze(this, world); | 51 WorldImpact impact = compiler.analyze(this, world); |
| 44 _isAnalyzed = true; | 52 _isAnalyzed = true; |
| 45 return impact; | 53 return impact; |
| 46 } | 54 } |
| 47 | 55 |
| 48 bool get isAnalyzed => _isAnalyzed; | 56 bool get isAnalyzed => _isAnalyzed; |
| 49 } | 57 } |
| 50 | 58 |
| 51 class ResolutionImpact extends WorldImpact { | 59 class ResolutionImpact extends WorldImpact { |
| 52 const ResolutionImpact(); | 60 const ResolutionImpact(); |
| 53 | 61 |
| 54 Iterable<Feature> get features => const <Feature>[]; | 62 Iterable<Feature> get features => const <Feature>[]; |
| 55 Iterable<MapLiteralUse> get mapLiterals => const <MapLiteralUse>[]; | 63 Iterable<MapLiteralUse> get mapLiterals => const <MapLiteralUse>[]; |
| 56 Iterable<ListLiteralUse> get listLiterals => const <ListLiteralUse>[]; | 64 Iterable<ListLiteralUse> get listLiterals => const <ListLiteralUse>[]; |
| 57 Iterable<String> get constSymbolNames => const <String>[]; | 65 Iterable<String> get constSymbolNames => const <String>[]; |
| 58 Iterable<ConstantExpression> get constantLiterals { | 66 Iterable<ConstantExpression> get constantLiterals => |
| 59 return const <ConstantExpression>[]; | 67 const <ConstantExpression>[]; |
| 60 } | |
| 61 | 68 |
| 62 Iterable<dynamic> get nativeData => const <dynamic>[]; | 69 Iterable<dynamic> get nativeData => const <dynamic>[]; |
| 63 } | 70 } |
| 64 | 71 |
| 65 /// A language feature seen during resolution. | 72 /// A language feature seen during resolution. |
| 66 // TODO(johnniwinther): Should mirror usage be part of this? | 73 // TODO(johnniwinther): Should mirror usage be part of this? |
| 67 enum Feature { | 74 enum Feature { |
| 68 /// Invocation of a generative construction on an abstract class. | 75 /// Invocation of a generative construction on an abstract class. |
| 69 ABSTRACT_CLASS_INSTANTIATION, | 76 ABSTRACT_CLASS_INSTANTIATION, |
| 70 | 77 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 /// Interface defining target-specific behavior for resolution. | 206 /// Interface defining target-specific behavior for resolution. |
| 200 abstract class Target { | 207 abstract class Target { |
| 201 /// Returns `true` if [library] is a target specific library whose members | 208 /// Returns `true` if [library] is a target specific library whose members |
| 202 /// have special treatment, such as being allowed to extends blacklisted | 209 /// have special treatment, such as being allowed to extends blacklisted |
| 203 /// classes or members being eagerly resolved. | 210 /// classes or members being eagerly resolved. |
| 204 bool isTargetSpecificLibrary(LibraryElement element); | 211 bool isTargetSpecificLibrary(LibraryElement element); |
| 205 | 212 |
| 206 /// Resolve target specific information for [element] and register it with | 213 /// Resolve target specific information for [element] and register it with |
| 207 /// [registry]. | 214 /// [registry]. |
| 208 void resolveNativeElement(Element element, NativeRegistry registry) {} | 215 void resolveNativeElement(Element element, NativeRegistry registry) {} |
| 216 |
| 217 /// Processes [element] for resolution and returns the [MethodElement] that |
| 218 /// defines the implementation of [element]. |
| 219 MethodElement resolveExternalFunction(MethodElement element) => element; |
| 220 |
| 221 /// Called when resolving a call to a foreign function. If a non-null value |
| 222 /// is returned, this is stored as native data for [node] in the resolved |
| 223 /// AST. |
| 224 dynamic resolveForeignCall(Send node, Element element, |
| 225 CallStructure callStructure, ForeignResolver resolver) { |
| 226 return null; |
| 227 } |
| 228 |
| 229 /// Returns the default superclass for the given [element] in this target. |
| 230 ClassElement defaultSuperclass(ClassElement element); |
| 231 |
| 232 /// Returns `true` if [element] is a native element, that is, that the |
| 233 /// corresponding entity already exists in the target language. |
| 234 bool isNative(Element element) => false; |
| 235 |
| 236 /// Returns `true` if [element] is a foreign element, that is, that the |
| 237 /// backend has specialized handling for the element. |
| 238 bool isForeign(Element element) => false; |
| 239 |
| 240 /// Returns `true` if this target supports async/await. |
| 241 bool get supportsAsyncAwait => true; |
| 209 } | 242 } |
| 210 | 243 |
| 211 // TODO(johnniwinther): Rename to `Resolver` or `ResolverContext`. | 244 // TODO(johnniwinther): Rename to `Resolver` or `ResolverContext`. |
| 212 abstract class Resolution implements Frontend { | 245 abstract class Resolution implements Frontend { |
| 213 ParsingContext get parsingContext; | 246 ParsingContext get parsingContext; |
| 214 DiagnosticReporter get reporter; | 247 DiagnosticReporter get reporter; |
| 215 CoreClasses get coreClasses; | 248 CoreClasses get coreClasses; |
| 216 CoreTypes get coreTypes; | 249 CoreTypes get coreTypes; |
| 217 Types get types; | 250 Types get types; |
| 218 Target get target; | 251 Target get target; |
| 252 ResolverTask get resolver; |
| 253 ResolutionEnqueuer get enqueuer; |
| 254 CompilerOptions get options; |
| 255 IdGenerator get idGenerator; |
| 256 ConstantEnvironment get constants; |
| 257 MirrorUsageAnalyzerTask get mirrorUsageAnalyzerTask; |
| 258 |
| 259 // TODO(het): Move all elements into common/elements.dart |
| 260 LibraryElement get coreLibrary; |
| 261 FunctionElement get identicalFunction; |
| 262 ClassElement get mirrorSystemClass; |
| 263 FunctionElement get mirrorSystemGetNameFunction; |
| 264 ConstructorElement get mirrorsUsedConstructor; |
| 265 ConstructorElement get symbolConstructor; |
| 266 |
| 267 // TODO(het): This is only referenced in a test... |
| 268 /// The constant for the [proxy] variable defined in dart:core. |
| 269 ConstantValue get proxyConstant; |
| 219 | 270 |
| 220 /// If set to `true` resolution caches will not be cleared. Use this only for | 271 /// If set to `true` resolution caches will not be cleared. Use this only for |
| 221 /// testing. | 272 /// testing. |
| 222 bool retainCachesForTesting; | 273 bool retainCachesForTesting; |
| 223 | 274 |
| 224 void resolveTypedef(TypedefElement typdef); | 275 void resolveTypedef(TypedefElement typdef); |
| 225 void resolveClass(ClassElement cls); | 276 void resolveClass(ClassElement cls); |
| 226 void registerClass(ClassElement cls); | 277 void registerClass(ClassElement cls); |
| 227 void resolveMetadataAnnotation(MetadataAnnotation metadataAnnotation); | 278 void resolveMetadataAnnotation(MetadataAnnotation metadataAnnotation); |
| 228 FunctionSignature resolveSignature(FunctionElement function); | 279 FunctionSignature resolveSignature(FunctionElement function); |
| 229 DartType resolveTypeAnnotation(Element element, TypeAnnotation node); | 280 DartType resolveTypeAnnotation(Element element, TypeAnnotation node); |
| 230 | 281 |
| 231 /// Returns `true` if [element] has been resolved. | 282 /// Returns `true` if [element] has been resolved. |
| 232 // TODO(johnniwinther): Normalize semantics between normal and deserialized | 283 // TODO(johnniwinther): Normalize semantics between normal and deserialized |
| 233 // elements; deserialized elements are always resolved but the method will | 284 // elements; deserialized elements are always resolved but the method will |
| 234 // return `false`. | 285 // return `false`. |
| 235 bool hasBeenResolved(Element element); | 286 bool hasBeenResolved(Element element); |
| 236 | 287 |
| 237 /// Resolve [element] if it has not already been resolved. | 288 /// Resolve [element] if it has not already been resolved. |
| 238 void ensureResolved(Element element); | 289 void ensureResolved(Element element); |
| 239 | 290 |
| 291 /// Called whenever a class has been resolved. |
| 292 void onClassResolved(ClassElement element); |
| 293 |
| 294 /// Registers that [element] has a compile time error. |
| 295 /// |
| 296 /// The error itself is given in [message]. |
| 297 void registerCompileTimeError(Element element, DiagnosticMessage message); |
| 298 |
| 240 ResolutionWorkItem createWorkItem( | 299 ResolutionWorkItem createWorkItem( |
| 241 Element element, ItemCompilationContext compilationContext); | 300 Element element, ItemCompilationContext compilationContext); |
| 242 | 301 |
| 243 /// Returns `true` if [element] as a fully computed [ResolvedAst]. | 302 /// Returns `true` if [element] as a fully computed [ResolvedAst]. |
| 244 bool hasResolvedAst(ExecutableElement element); | 303 bool hasResolvedAst(ExecutableElement element); |
| 245 | 304 |
| 246 /// Returns the `ResolvedAst` for the [element]. | 305 /// Returns the `ResolvedAst` for the [element]. |
| 247 ResolvedAst getResolvedAst(ExecutableElement element); | 306 ResolvedAst getResolvedAst(ExecutableElement element); |
| 248 | 307 |
| 249 /// Returns `true` if the [ResolutionImpact] for [element] is cached. | 308 /// Returns `true` if the [ResolutionImpact] for [element] is cached. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 267 /// Removes the [WorldImpact] for [element] from the resolution cache. Later | 326 /// Removes the [WorldImpact] for [element] from the resolution cache. Later |
| 268 /// calls to [getWorldImpact] or [computeWorldImpact] returns an empty impact. | 327 /// calls to [getWorldImpact] or [computeWorldImpact] returns an empty impact. |
| 269 void uncacheWorldImpact(Element element); | 328 void uncacheWorldImpact(Element element); |
| 270 | 329 |
| 271 /// Removes the [WorldImpact]s for all [Element]s in the resolution cache. , | 330 /// Removes the [WorldImpact]s for all [Element]s in the resolution cache. , |
| 272 /// Later calls to [getWorldImpact] or [computeWorldImpact] returns an empty | 331 /// Later calls to [getWorldImpact] or [computeWorldImpact] returns an empty |
| 273 /// impact. | 332 /// impact. |
| 274 void emptyCache(); | 333 void emptyCache(); |
| 275 | 334 |
| 276 void forgetElement(Element element); | 335 void forgetElement(Element element); |
| 336 |
| 337 /// Returns `true` if [value] is the top-level [proxy] annotation from the |
| 338 /// core library. |
| 339 bool isProxyConstant(ConstantValue value); |
| 277 } | 340 } |
| 278 | 341 |
| 279 /// A container of commonly used dependencies for tasks that involve parsing. | 342 /// A container of commonly used dependencies for tasks that involve parsing. |
| 280 abstract class ParsingContext { | 343 abstract class ParsingContext { |
| 281 factory ParsingContext( | 344 factory ParsingContext( |
| 282 DiagnosticReporter reporter, | 345 DiagnosticReporter reporter, |
| 283 ParserOptions parserOptions, | 346 ParserOptions parserOptions, |
| 284 ParserTask parser, | 347 ParserTask parser, |
| 285 PatchParserTask patchParser, | 348 PatchParserTask patchParser, |
| 286 Backend backend) = _ParsingContext; | 349 Backend backend) = _ParsingContext; |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 if (cls.isPatch) { | 384 if (cls.isPatch) { |
| 322 patchParser.parsePatchClassNode(cls); | 385 patchParser.parsePatchClassNode(cls); |
| 323 } | 386 } |
| 324 }); | 387 }); |
| 325 } | 388 } |
| 326 | 389 |
| 327 @override | 390 @override |
| 328 ScannerOptions getScannerOptionsFor(Element element) => new ScannerOptions( | 391 ScannerOptions getScannerOptionsFor(Element element) => new ScannerOptions( |
| 329 canUseNative: backend.canLibraryUseNative(element.library)); | 392 canUseNative: backend.canLibraryUseNative(element.library)); |
| 330 } | 393 } |
| OLD | NEW |