| Index: pkg/compiler/lib/src/resolution/registry.dart
|
| diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
|
| index 70209b22239136802089f1308ae41df6f467eb92..afa0fc37ef5370ac4c83581e43786df8f4220d33 100644
|
| --- a/pkg/compiler/lib/src/resolution/registry.dart
|
| +++ b/pkg/compiler/lib/src/resolution/registry.dart
|
| @@ -8,14 +8,177 @@ part of resolution;
|
| /// related information in a [TreeElements] mapping and registers calls with
|
| /// [Backend], [World] and [Enqueuer].
|
| // TODO(johnniwinther): Split this into an interface and implementation class.
|
| -class ResolutionRegistry extends Registry {
|
| +
|
| +class EagerRegistry implements Registry {
|
| final Compiler compiler;
|
| final TreeElementMapping mapping;
|
|
|
| + EagerRegistry(this.compiler, this.mapping);
|
| +
|
| + ResolutionEnqueuer get world => compiler.enqueuer.resolution;
|
| +
|
| + @override
|
| + bool get isForResolution => true;
|
| +
|
| + @override
|
| + Iterable<Element> get otherDependencies => mapping.otherDependencies;
|
| +
|
| + @override
|
| + void registerDependency(Element element) {
|
| + mapping.registerDependency(element);
|
| + }
|
| +
|
| + @override
|
| + void registerDynamicGetter(Selector selector) {
|
| + world.registerDynamicGetter(selector);
|
| + }
|
| +
|
| + @override
|
| + void registerDynamicInvocation(Selector selector) {
|
| + world.registerDynamicInvocation(selector);
|
| + }
|
| +
|
| + @override
|
| + void registerDynamicSetter(Selector selector) {
|
| + world.registerDynamicSetter(selector);
|
| + }
|
| +
|
| + @override
|
| + void registerGetOfStaticFunction(FunctionElement element) {
|
| + world.registerGetOfStaticFunction(element);
|
| + }
|
| +
|
| + @override
|
| + void registerInstantiation(InterfaceType type) {
|
| + // TODO(johnniwinther): Remove the need for passing `this`.
|
| + world.registerInstantiatedType(type, this);
|
| + }
|
| +
|
| + @override
|
| + void registerStaticInvocation(Element element) {
|
| + registerDependency(element);
|
| + world.registerStaticUse(element);
|
| + }
|
| +}
|
| +
|
| +class ResolutionWorldImpact implements WorldImpact {
|
| + final Registry registry;
|
| + Setlet<Selector> _dynamicInvocations;
|
| + Setlet<Selector> _dynamicGetters;
|
| + Setlet<Selector> _dynamicSetters;
|
| + Setlet<InterfaceType> _instantiatedTypes;
|
| + Setlet<Element> _staticUses;
|
| + Setlet<DartType> _checkedTypes;
|
| + Setlet<MethodElement> _closurizedFunctions;
|
| +
|
| + ResolutionWorldImpact(Compiler compiler, TreeElementMapping mapping)
|
| + : this.registry = new EagerRegistry(compiler, mapping);
|
| +
|
| + void registerDynamicGetter(Selector selector) {
|
| + if (_dynamicGetters == null) {
|
| + _dynamicGetters = new Setlet<Selector>();
|
| + }
|
| + _dynamicGetters.add(selector);
|
| + }
|
| +
|
| + @override
|
| + Iterable<Selector> get dynamicGetters {
|
| + return _dynamicGetters != null ? _dynamicGetters : const <Selector>[];
|
| + }
|
| +
|
| + void registerDynamicInvocation(Selector selector) {
|
| + if (_dynamicInvocations == null) {
|
| + _dynamicInvocations = new Setlet<Selector>();
|
| + }
|
| + _dynamicInvocations.add(selector);
|
| + }
|
| +
|
| + @override
|
| + Iterable<Selector> get dynamicInvocations {
|
| + return _dynamicInvocations != null
|
| + ? _dynamicInvocations : const <Selector>[];
|
| + }
|
| +
|
| + void registerDynamicSetter(Selector selector) {
|
| + if (_dynamicSetters == null) {
|
| + _dynamicSetters = new Setlet<Selector>();
|
| + }
|
| + _dynamicSetters.add(selector);
|
| + }
|
| +
|
| + @override
|
| + Iterable<Selector> get dynamicSetters {
|
| + return _dynamicSetters != null ? _dynamicSetters : const <Selector>[];
|
| + }
|
| +
|
| + void registerInstantiatedType(InterfaceType type) {
|
| + // TODO(johnniwinther): Enable this when registration doesn't require a
|
| + // [Registry].
|
| + throw new UnsupportedError(
|
| + 'Lazy registration of instantiated not supported.');
|
| + if (_instantiatedTypes == null) {
|
| + _instantiatedTypes = new Setlet<InterfaceType>();
|
| + }
|
| + _instantiatedTypes.add(type);
|
| + }
|
| +
|
| + @override
|
| + Iterable<InterfaceType> get instantiatedTypes {
|
| + return _instantiatedTypes != null
|
| + ? _instantiatedTypes : const <InterfaceType>[];
|
| + }
|
| +
|
| + void registerStaticUse(Element element) {
|
| + if (_staticUses == null) {
|
| + _staticUses = new Setlet<Element>();
|
| + }
|
| + _staticUses.add(element);
|
| + }
|
| +
|
| + @override
|
| + Iterable<Element> get staticUses {
|
| + return _staticUses != null ? _staticUses : const <Element>[];
|
| + }
|
| +
|
| + void registerCheckedType(DartType type) {
|
| + if (_checkedTypes == null) {
|
| + _checkedTypes = new Setlet<DartType>();
|
| + }
|
| + _checkedTypes.add(type);
|
| + }
|
| +
|
| + @override
|
| + Iterable<DartType> get checkedTypes {
|
| + return _checkedTypes != null
|
| + ? _checkedTypes : const <DartType>[];
|
| + }
|
| +
|
| + void registerClosurizedFunction(MethodElement element) {
|
| + if (_closurizedFunctions == null) {
|
| + _closurizedFunctions = new Setlet<MethodElement>();
|
| + }
|
| + _closurizedFunctions.add(element);
|
| + }
|
| +
|
| + @override
|
| + Iterable<MethodElement> get closurizedFunctions {
|
| + return _closurizedFunctions != null
|
| + ? _closurizedFunctions : const <MethodElement>[];
|
| + }
|
| +}
|
| +
|
| +class ResolutionRegistry implements Registry {
|
| + final Compiler compiler;
|
| + final TreeElementMapping mapping;
|
| + final ResolutionWorldImpact worldImpact;
|
| +
|
| ResolutionRegistry(Compiler compiler, Element element)
|
| : this.internal(compiler, _ensureTreeElements(element));
|
|
|
| - ResolutionRegistry.internal(this.compiler, this.mapping);
|
| + ResolutionRegistry.internal(Compiler compiler, TreeElementMapping mapping)
|
| + : this.compiler = compiler,
|
| + this.mapping = mapping,
|
| + this.worldImpact = new ResolutionWorldImpact(compiler, mapping);
|
|
|
| bool get isForResolution => true;
|
|
|
| @@ -190,15 +353,19 @@ class ResolutionRegistry extends Registry {
|
| //////////////////////////////////////////////////////////////////////////////
|
|
|
| void registerStaticUse(Element element) {
|
| - world.registerStaticUse(element);
|
| + worldImpact.registerStaticUse(element);
|
| }
|
|
|
| void registerImplicitSuperCall(FunctionElement superConstructor) {
|
| universe.registerImplicitSuperCall(this, superConstructor);
|
| }
|
|
|
| + // TODO(johnniwinther): Remove this.
|
| + // Use [registerInstantiatedType] of `rawType` instead.
|
| + @deprecated
|
| void registerInstantiatedClass(ClassElement element) {
|
| - world.registerInstantiatedClass(element, this);
|
| + element.ensureResolved(compiler);
|
| + registerInstantiatedType(element.rawType);
|
| }
|
|
|
| void registerLazyField() {
|
| @@ -223,7 +390,7 @@ class ResolutionRegistry extends Registry {
|
| }
|
|
|
| void registerIsCheck(DartType type) {
|
| - world.registerIsCheck(type, this);
|
| + worldImpact.registerCheckedType(type);
|
| backend.resolutionCallbacks.onIsCheck(type, this);
|
| }
|
|
|
| @@ -241,7 +408,7 @@ class ResolutionRegistry extends Registry {
|
| }
|
|
|
| void registerDynamicInvocation(Selector selector) {
|
| - world.registerDynamicInvocation(selector);
|
| + worldImpact.registerDynamicInvocation(selector);
|
| }
|
|
|
| void registerSuperNoSuchMethod() {
|
| @@ -259,7 +426,7 @@ class ResolutionRegistry extends Registry {
|
| void registerTypeLiteral(Send node, DartType type) {
|
| mapping.setType(node, type);
|
| backend.resolutionCallbacks.onTypeLiteral(type, this);
|
| - world.registerInstantiatedClass(compiler.typeClass, this);
|
| + world.registerInstantiatedType(compiler.coreTypes.typeType, this);
|
| }
|
|
|
| void registerMapLiteral(Node node, DartType type, bool isConstant) {
|
| @@ -286,15 +453,15 @@ class ResolutionRegistry extends Registry {
|
| }
|
|
|
| void registerGetOfStaticFunction(FunctionElement element) {
|
| - world.registerGetOfStaticFunction(element);
|
| + worldImpact.registerClosurizedFunction(element);
|
| }
|
|
|
| void registerDynamicGetter(Selector selector) {
|
| - world.registerDynamicGetter(selector);
|
| + worldImpact.registerDynamicGetter(selector);
|
| }
|
|
|
| void registerDynamicSetter(Selector selector) {
|
| - world.registerDynamicSetter(selector);
|
| + worldImpact.registerDynamicSetter(selector);
|
| }
|
|
|
| void registerConstSymbol(String name) {
|
| @@ -362,8 +529,7 @@ class ResolutionRegistry extends Registry {
|
|
|
| void registerStaticInvocation(Element element) {
|
| if (element == null) return;
|
| - world.addToWorkList(element);
|
| - registerDependency(element);
|
| + registerStaticUse(element);
|
| }
|
|
|
| void registerInstantiation(InterfaceType type) {
|
|
|