Chromium Code Reviews| Index: pkg/compiler/lib/src/resolution/resolution.dart |
| diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart |
| index f77519078554fdd3435b4a9270104b57fe86c583..85758863a2b3617bf2704a676da7279aa51c3cf2 100644 |
| --- a/pkg/compiler/lib/src/resolution/resolution.dart |
| +++ b/pkg/compiler/lib/src/resolution/resolution.dart |
| @@ -9,10 +9,9 @@ import 'dart:collection' show Queue; |
| import '../common.dart'; |
| import '../common/names.dart' show Identifiers; |
| import '../common/resolution.dart' |
| - show Feature, ParsingContext, Resolution, ResolutionImpact; |
| -import '../common/tasks.dart' show CompilerTask; |
| + show Feature, ParsingContext, Resolution, ResolutionImpact, Target; |
| +import '../common/tasks.dart' show CompilerTask, Measurer; |
| import '../compile_time_constants.dart' show ConstantCompiler; |
| -import '../compiler.dart' show Compiler; |
| import '../constants/expressions.dart' |
| show |
| ConstantExpression, |
| @@ -36,6 +35,8 @@ import '../elements/modelx.dart' |
| ParameterMetadataAnnotation, |
| SetterElementX, |
| TypedefElementX; |
| +import '../enqueue.dart'; |
| +import '../options.dart'; |
| import '../tokens/token.dart' |
| show |
| isBinaryOperator, |
| @@ -48,36 +49,35 @@ import '../universe/call_structure.dart' show CallStructure; |
| import '../universe/use.dart' show StaticUse, TypeUse; |
| import '../universe/world_impact.dart' show WorldImpact; |
| import '../util/util.dart' show Link, Setlet; |
| +import '../world.dart'; |
| import 'class_hierarchy.dart'; |
| import 'class_members.dart' show MembersCreator; |
| import 'constructors.dart'; |
| import 'members.dart'; |
| import 'registry.dart'; |
| import 'resolution_result.dart'; |
| -import 'scope.dart' show MutableScope; |
| import 'signatures.dart'; |
| import 'tree_elements.dart'; |
| import 'typedefs.dart'; |
| class ResolverTask extends CompilerTask { |
| final ConstantCompiler constantCompiler; |
| - final Compiler compiler; |
| + final Resolution resolution; |
| + final World world; |
| - ResolverTask(Compiler compiler, this.constantCompiler) |
| - : compiler = compiler, |
| - super(compiler.measurer); |
| + ResolverTask( |
| + this.resolution, this.constantCompiler, this.world, Measurer measurer) |
| + : super(measurer); |
| String get name => 'Resolver'; |
| - DiagnosticReporter get reporter => compiler.reporter; |
| - |
| - Resolution get resolution => compiler.resolution; |
| - |
| - ParsingContext get parsingContext => compiler.parsingContext; |
| - |
| - CoreClasses get coreClasses => compiler.coreClasses; |
| - |
| - CoreTypes get coreTypes => compiler.coreTypes; |
| + DiagnosticReporter get reporter => resolution.reporter; |
| + Target get target => resolution.target; |
| + CoreTypes get coreTypes => resolution.coreTypes; |
| + CoreClasses get coreClasses => resolution.coreClasses; |
| + ParsingContext get parsingContext => resolution.parsingContext; |
| + CompilerOptions get options => resolution.options; |
| + ResolutionEnqueuer get enqueuer => resolution.enqueuer; |
| ResolutionImpact resolve(Element element) { |
| return measure(() { |
| @@ -115,7 +115,7 @@ class ResolverTask extends CompilerTask { |
| return processMetadata(resolveTypedef(typdef)); |
| } |
| - compiler.unimplemented(element, "resolve($element)"); |
| + reporter.internalError(element, "resolve($element) not implemented."); |
| }); |
| } |
| @@ -142,72 +142,66 @@ class ResolverTask extends CompilerTask { |
| } |
| } |
| - static void processAsyncMarker(Compiler compiler, |
| + static void processAsyncMarker(Resolution resolution, |
| BaseFunctionElementX element, ResolutionRegistry registry) { |
| - DiagnosticReporter reporter = compiler.reporter; |
| - Resolution resolution = compiler.resolution; |
| - CoreClasses coreClasses = compiler.coreClasses; |
| + DiagnosticReporter reporter = resolution.reporter; |
| + CoreClasses coreClasses = resolution.coreClasses; |
| FunctionExpression functionExpression = element.node; |
| AsyncModifier asyncModifier = functionExpression.asyncModifier; |
| if (asyncModifier != null) { |
| - if (!compiler.backend.supportsAsyncAwait) { |
| - reporter.reportErrorMessage(functionExpression.asyncModifier, |
| - MessageKind.ASYNC_AWAIT_NOT_SUPPORTED); |
| + if (asyncModifier.isAsynchronous) { |
|
Harry Terkelsen
2016/07/06 22:44:45
this diff looks a lot crazier than it actually is.
|
| + element.asyncMarker = asyncModifier.isYielding |
| + ? AsyncMarker.ASYNC_STAR |
| + : AsyncMarker.ASYNC; |
| } else { |
| - if (asyncModifier.isAsynchronous) { |
| - element.asyncMarker = asyncModifier.isYielding |
| - ? AsyncMarker.ASYNC_STAR |
| - : AsyncMarker.ASYNC; |
| - } else { |
| - element.asyncMarker = AsyncMarker.SYNC_STAR; |
| - } |
| - if (element.isAbstract) { |
| + element.asyncMarker = AsyncMarker.SYNC_STAR; |
| + } |
| + if (element.isAbstract) { |
| + reporter.reportErrorMessage( |
| + asyncModifier, |
| + MessageKind.ASYNC_MODIFIER_ON_ABSTRACT_METHOD, |
| + {'modifier': element.asyncMarker}); |
| + } else if (element.isConstructor) { |
| + reporter.reportErrorMessage( |
| + asyncModifier, |
| + MessageKind.ASYNC_MODIFIER_ON_CONSTRUCTOR, |
| + {'modifier': element.asyncMarker}); |
| + } else { |
| + if (element.isSetter) { |
| reporter.reportErrorMessage( |
| asyncModifier, |
| - MessageKind.ASYNC_MODIFIER_ON_ABSTRACT_METHOD, |
| + MessageKind.ASYNC_MODIFIER_ON_SETTER, |
| {'modifier': element.asyncMarker}); |
| - } else if (element.isConstructor) { |
| + } |
| + if (functionExpression.body.asReturn() != null && |
| + element.asyncMarker.isYielding) { |
| reporter.reportErrorMessage( |
| asyncModifier, |
| - MessageKind.ASYNC_MODIFIER_ON_CONSTRUCTOR, |
| + MessageKind.YIELDING_MODIFIER_ON_ARROW_BODY, |
| {'modifier': element.asyncMarker}); |
| - } else { |
| - if (element.isSetter) { |
| - reporter.reportErrorMessage( |
| - asyncModifier, |
| - MessageKind.ASYNC_MODIFIER_ON_SETTER, |
| - {'modifier': element.asyncMarker}); |
| - } |
| - if (functionExpression.body.asReturn() != null && |
| - element.asyncMarker.isYielding) { |
| - reporter.reportErrorMessage( |
| - asyncModifier, |
| - MessageKind.YIELDING_MODIFIER_ON_ARROW_BODY, |
| - {'modifier': element.asyncMarker}); |
| - } |
| - } |
| - switch (element.asyncMarker) { |
| - case AsyncMarker.ASYNC: |
| - registry.registerFeature(Feature.ASYNC); |
| - coreClasses.futureClass.ensureResolved(resolution); |
| - break; |
| - case AsyncMarker.ASYNC_STAR: |
| - registry.registerFeature(Feature.ASYNC_STAR); |
| - coreClasses.streamClass.ensureResolved(resolution); |
| - break; |
| - case AsyncMarker.SYNC_STAR: |
| - registry.registerFeature(Feature.SYNC_STAR); |
| - coreClasses.iterableClass.ensureResolved(resolution); |
| - break; |
| } |
| } |
| + switch (element.asyncMarker) { |
| + case AsyncMarker.ASYNC: |
| + registry.registerFeature(Feature.ASYNC); |
| + coreClasses.futureClass.ensureResolved(resolution); |
| + break; |
| + case AsyncMarker.ASYNC_STAR: |
| + registry.registerFeature(Feature.ASYNC_STAR); |
| + coreClasses.streamClass.ensureResolved(resolution); |
| + break; |
| + case AsyncMarker.SYNC_STAR: |
| + registry.registerFeature(Feature.SYNC_STAR); |
| + coreClasses.iterableClass.ensureResolved(resolution); |
| + break; |
| + } |
| } |
| } |
| bool _isNativeClassOrExtendsNativeClass(ClassElement classElement) { |
| assert(classElement != null); |
| while (classElement != null) { |
| - if (compiler.backend.isNative(classElement)) return true; |
| + if (target.isNative(classElement)) return true; |
| classElement = classElement.superclass; |
| } |
| return false; |
| @@ -239,7 +233,7 @@ class ResolverTask extends CompilerTask { |
| ResolutionRegistry registry = visitor.registry; |
| registry.defineFunction(tree, element); |
| visitor.setupFunction(tree, element); // Modifies the scope. |
| - processAsyncMarker(compiler, element, registry); |
| + processAsyncMarker(resolution, element, registry); |
| if (element.isGenerativeConstructor) { |
| // Even if there is no initializer list we still have to do the |
| @@ -248,7 +242,7 @@ class ResolverTask extends CompilerTask { |
| new InitializerResolver(visitor, element, tree); |
| FunctionElement redirection = resolver.resolveInitializers( |
| enableInitializingFormalAccess: |
| - compiler.options.enableInitializingFormalAccess); |
| + options.enableInitializingFormalAccess); |
| if (redirection != null) { |
| resolveRedirectingConstructor(resolver, tree, element, redirection); |
| } |
| @@ -257,8 +251,7 @@ class ResolverTask extends CompilerTask { |
| tree, MessageKind.FUNCTION_WITH_INITIALIZER); |
| } |
| - if (!compiler.options.analyzeSignaturesOnly || |
| - tree.isRedirectingFactory) { |
| + if (!options.analyzeSignaturesOnly || tree.isRedirectingFactory) { |
| // We need to analyze the redirecting factory bodies to ensure that |
| // we can analyze compile-time constants. |
| visitor.visit(tree.body); |
| @@ -274,7 +267,7 @@ class ResolverTask extends CompilerTask { |
| if (enclosingClass != null) { |
| // TODO(johnniwinther): Find another way to obtain mixin uses. |
| Iterable<MixinApplicationElement> mixinUses = |
| - compiler.world.allMixinUsesOf(enclosingClass); |
| + world.allMixinUsesOf(enclosingClass); |
| ClassElement mixin = enclosingClass; |
| for (MixinApplicationElement mixinApplication in mixinUses) { |
| checkMixinSuperUses(resolutionTree, mixinApplication, mixin); |
| @@ -298,7 +291,7 @@ class ResolverTask extends CompilerTask { |
| WorldImpact resolveMethodElement(FunctionElementX element) { |
| assert(invariant(element, element.isDeclaration)); |
| return reporter.withCurrentElement(element, () { |
| - if (compiler.enqueuer.resolution.hasBeenProcessed(element)) { |
| + if (enqueuer.hasBeenProcessed(element)) { |
| // TODO(karlklose): Remove the check for [isConstructor]. [elememts] |
| // should never be non-null, not even for constructors. |
| assert(invariant(element, element.isConstructor, |
| @@ -309,7 +302,7 @@ class ResolverTask extends CompilerTask { |
| if (element.isSynthesized) { |
| if (element.isGenerativeConstructor) { |
| ResolutionRegistry registry = |
| - new ResolutionRegistry(compiler, _ensureTreeElements(element)); |
| + new ResolutionRegistry(this.target, _ensureTreeElements(element)); |
| ConstructorElement constructor = element.asFunctionElement(); |
| ConstructorElement target = constructor.definingConstructor; |
| // Ensure the signature of the synthesized element is |
| @@ -331,7 +324,7 @@ class ResolverTask extends CompilerTask { |
| element.computeType(resolution); |
| FunctionElementX implementation = element; |
| if (element.isExternal) { |
| - implementation = compiler.backend.resolveExternalFunction(element); |
| + implementation = target.resolveExternalFunction(element); |
| } |
| return resolveMethodElementImplementation( |
| implementation, implementation.node); |
| @@ -346,8 +339,8 @@ class ResolverTask extends CompilerTask { |
| /// This method should only be used by this library (or tests of |
| /// this library). |
| ResolverVisitor visitorFor(Element element, {bool useEnclosingScope: false}) { |
| - return new ResolverVisitor(compiler, element, |
| - new ResolutionRegistry(compiler, _ensureTreeElements(element)), |
| + return new ResolverVisitor(resolution, element, |
| + new ResolutionRegistry(target, _ensureTreeElements(element)), |
| useEnclosingScope: useEnclosingScope); |
| } |
| @@ -545,7 +538,7 @@ class ResolverTask extends CompilerTask { |
| // TODO(ahe): Cache the node in cls. |
| cls |
| .parseNode(parsingContext) |
| - .accept(new ClassSupertypeResolver(compiler, cls)); |
| + .accept(new ClassSupertypeResolver(resolution, cls)); |
| if (cls.supertypeLoadState != STATE_DONE) { |
| cls.supertypeLoadState = STATE_DONE; |
| } |
| @@ -610,8 +603,8 @@ class ResolverTask extends CompilerTask { |
| TreeElements resolveClass(BaseClassElementX element) { |
| return _resolveTypeDeclaration(element, () { |
| // TODO(johnniwinther): Store the mapping in the resolution enqueuer. |
| - ResolutionRegistry registry = |
| - new ResolutionRegistry(compiler, _ensureTreeElements(element)); |
| + ResolutionRegistry registry = new ResolutionRegistry( |
| + resolution.target, _ensureTreeElements(element)); |
| resolveClassInternal(element, registry); |
| return element.treeElements; |
| }); |
| @@ -637,10 +630,10 @@ class ResolverTask extends CompilerTask { |
| loadSupertypes(element, tree); |
| ClassResolverVisitor visitor = |
| - new ClassResolverVisitor(compiler, element, registry); |
| + new ClassResolverVisitor(resolution, element, registry); |
| visitor.visit(tree); |
| element.resolutionState = STATE_DONE; |
| - compiler.onClassResolved(element); |
| + resolution.onClassResolved(element); |
| pendingClassesToBePostProcessed.add(element); |
| })); |
| if (element.isPatched) { |
| @@ -671,8 +664,8 @@ class ResolverTask extends CompilerTask { |
| for (MetadataAnnotation metadata in element.implementation.metadata) { |
| metadata.ensureResolved(resolution); |
| ConstantValue value = |
| - compiler.constants.getConstantValue(metadata.constant); |
| - if (!element.isProxy && compiler.isProxyConstant(value)) { |
| + resolution.constants.getConstantValue(metadata.constant); |
| + if (!element.isProxy && resolution.isProxyConstant(value)) { |
| element.isProxy = true; |
| } |
| } |
| @@ -760,7 +753,7 @@ class ResolverTask extends CompilerTask { |
| // mixin application has been performed. |
| // TODO(johnniwinther): Obtain the [TreeElements] for [member] |
| // differently. |
| - if (compiler.enqueuer.resolution.hasBeenProcessed(member)) { |
| + if (resolution.enqueuer.hasBeenProcessed(member)) { |
| if (member.resolvedAst.kind == ResolvedAstKind.PARSED) { |
| checkMixinSuperUses( |
| member.resolvedAst.elements, mixinApplication, mixin); |
| @@ -1009,13 +1002,14 @@ class ResolverTask extends CompilerTask { |
| return reporter.withCurrentElement(element, () { |
| FunctionExpression node = element.parseNode(parsingContext); |
| return measure(() => SignatureResolver.analyze( |
| - compiler, |
| + resolution, |
| element.enclosingElement.buildScope(), |
| node.typeVariables, |
| node.parameters, |
| node.returnType, |
| element, |
| - new ResolutionRegistry(compiler, _ensureTreeElements(element)), |
| + new ResolutionRegistry( |
| + resolution.target, _ensureTreeElements(element)), |
| defaultValuesError: defaultValuesError, |
| createRealParameters: true)); |
| }); |
| @@ -1023,17 +1017,17 @@ class ResolverTask extends CompilerTask { |
| WorldImpact resolveTypedef(TypedefElementX element) { |
| if (element.isResolved) return const ResolutionImpact(); |
| - compiler.world.allTypedefs.add(element); |
| + world.allTypedefs.add(element); |
| return _resolveTypeDeclaration(element, () { |
| - ResolutionRegistry registry = |
| - new ResolutionRegistry(compiler, _ensureTreeElements(element)); |
| + ResolutionRegistry registry = new ResolutionRegistry( |
| + resolution.target, _ensureTreeElements(element)); |
| return reporter.withCurrentElement(element, () { |
| return measure(() { |
| assert(element.resolutionState == STATE_NOT_STARTED); |
| element.resolutionState = STATE_STARTED; |
| Typedef node = element.parseNode(parsingContext); |
| TypedefResolverVisitor visitor = |
| - new TypedefResolverVisitor(compiler, element, registry); |
| + new TypedefResolverVisitor(resolution, element, registry); |
| visitor.visit(node); |
| element.resolutionState = STATE_DONE; |
| return registry.worldImpact; |