| Index: pkg/compiler/lib/src/enqueue.dart
|
| diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
|
| index 53796dc0280bd5b91654605cabf17610745d66ce..3744f2dca440c95223549e6146cb792218090bff 100644
|
| --- a/pkg/compiler/lib/src/enqueue.dart
|
| +++ b/pkg/compiler/lib/src/enqueue.dart
|
| @@ -58,7 +58,9 @@ import 'universe/use.dart' show
|
| TypeUse,
|
| TypeUseKind;
|
| import 'universe/world_impact.dart' show
|
| - WorldImpact;
|
| + ImpactUseCase,
|
| + WorldImpact,
|
| + WorldImpactVisitor;
|
| import 'util/util.dart' show
|
| Link,
|
| Setlet;
|
| @@ -117,10 +119,14 @@ abstract class Enqueuer {
|
| bool hasEnqueuedReflectiveElements = false;
|
| bool hasEnqueuedReflectiveStaticFields = false;
|
|
|
| + WorldImpactVisitor impactVisitor;
|
| +
|
| Enqueuer(this.name,
|
| this.compiler,
|
| this.itemCompilationContextCreator,
|
| - this.strategy);
|
| + this.strategy) {
|
| + impactVisitor = new _EnqueuerImpactVisitor(this);
|
| + }
|
|
|
| // TODO(johnniwinther): Move this to [ResolutionEnqueuer].
|
| Resolution get resolution => compiler.resolution;
|
| @@ -142,6 +148,8 @@ abstract class Enqueuer {
|
|
|
| Iterable<ClassElement> get processedClasses => _processedClasses;
|
|
|
| + ImpactUseCase get impactUse;
|
| +
|
| /**
|
| * Documentation wanted -- johnniwinther
|
| *
|
| @@ -166,10 +174,8 @@ abstract class Enqueuer {
|
|
|
| /// Apply the [worldImpact] of processing [element] to this enqueuer.
|
| void applyImpact(Element element, WorldImpact worldImpact) {
|
| - // TODO(johnniwinther): Optimize the application of the world impact.
|
| - worldImpact.dynamicUses.forEach(registerDynamicUse);
|
| - worldImpact.staticUses.forEach(registerStaticUse);
|
| - worldImpact.typeUses.forEach(registerTypeUse);
|
| + compiler.impactStrategy.visitImpact(
|
| + element, worldImpact, impactVisitor, impactUse);
|
| }
|
|
|
| void registerInstantiatedType(InterfaceType type,
|
| @@ -741,6 +747,10 @@ class ResolutionEnqueuer extends Enqueuer {
|
| */
|
| final Queue<DeferredTask> deferredTaskQueue;
|
|
|
| + static const ImpactUseCase IMPACT_USE = const ImpactUseCase('ResolutionEnqueuer');
|
| +
|
| + ImpactUseCase get impactUse => IMPACT_USE;
|
| +
|
| ResolutionEnqueuer(Compiler compiler,
|
| ItemCompilationContext itemCompilationContextCreator(),
|
| EnqueuerStrategy strategy)
|
| @@ -896,6 +906,10 @@ class CodegenEnqueuer extends Enqueuer {
|
|
|
| bool enabledNoSuchMethod = false;
|
|
|
| + static const ImpactUseCase IMPACT_USE = const ImpactUseCase('CodegenEnqueuer');
|
| +
|
| + ImpactUseCase get impactUse => IMPACT_USE;
|
| +
|
| CodegenEnqueuer(Compiler compiler,
|
| ItemCompilationContext itemCompilationContextCreator(),
|
| EnqueuerStrategy strategy)
|
| @@ -1039,3 +1053,24 @@ class TreeShakingEnqueuerStrategy implements EnqueuerStrategy {
|
| enqueuer.handleUnseenSelectorInternal(dynamicUse);
|
| }
|
| }
|
| +
|
| +class _EnqueuerImpactVisitor implements WorldImpactVisitor {
|
| + final Enqueuer enqueuer;
|
| +
|
| + _EnqueuerImpactVisitor(this.enqueuer);
|
| +
|
| + @override
|
| + void visitDynamicUse(DynamicUse dynamicUse) {
|
| + enqueuer.registerDynamicUse(dynamicUse);
|
| + }
|
| +
|
| + @override
|
| + void visitStaticUse(StaticUse staticUse) {
|
| + enqueuer.registerStaticUse(staticUse);
|
| + }
|
| +
|
| + @override
|
| + void visitTypeUse(TypeUse typeUse) {
|
| + enqueuer.registerTypeUse(typeUse);
|
| + }
|
| +}
|
|
|