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