Chromium Code Reviews| Index: pkg/compiler/lib/src/universe/world_impact.dart |
| diff --git a/pkg/compiler/lib/src/universe/world_impact.dart b/pkg/compiler/lib/src/universe/world_impact.dart |
| index fe7822dbb57a4f8d8472ffe5486186d85d0d59d6..524b50680afbe6e13201f3a637b6f38a96628272 100644 |
| --- a/pkg/compiler/lib/src/universe/world_impact.dart |
| +++ b/pkg/compiler/lib/src/universe/world_impact.dart |
| @@ -34,6 +34,12 @@ class WorldImpact { |
| Iterable<TypeUse> get typeUses => const <TypeUse>[]; |
| + void apply(WorldImpactVisitor visitor) { |
| + staticUses.forEach(visitor.visitStaticUse); |
| + dynamicUses.forEach(visitor.visitDynamicUse); |
| + typeUses.forEach(visitor.visitTypeUse); |
| + } |
| + |
| String toString() => dump(this); |
| static String dump(WorldImpact worldImpact) { |
| @@ -154,6 +160,12 @@ class TransformedWorldImpact implements WorldImpact { |
| return _staticUses != null ? _staticUses : worldImpact.staticUses; |
| } |
| + void apply(WorldImpactVisitor visitor) { |
| + staticUses.forEach(visitor.visitStaticUse); |
| + dynamicUses.forEach(visitor.visitDynamicUse); |
| + typeUses.forEach(visitor.visitTypeUse); |
| + } |
| + |
| String toString() { |
| StringBuffer sb = new StringBuffer(); |
| sb.write('TransformedWorldImpact($worldImpact)'); |
| @@ -161,3 +173,69 @@ class TransformedWorldImpact implements WorldImpact { |
| return sb.toString(); |
| } |
| } |
| + |
| +class ImpactUse { |
|
sigurdm
2015/11/20 12:13:19
dartdoc
Johnni Winther
2015/11/20 13:49:36
Done + Renamed to ImpactUseCase.
|
| + final String name; |
| + |
| + const ImpactUse(this.name); |
| + |
| + String toString() => 'ImpactUse($name)'; |
| +} |
| + |
| +class ImpactStrategy { |
|
sigurdm
2015/11/20 12:13:19
Consider if this can be named more descriptively.
sigurdm
2015/11/20 12:13:19
dartdoc
Johnni Winther
2015/11/20 13:49:36
Acknowledged.
Johnni Winther
2015/11/20 13:49:36
Done.
|
| + const ImpactStrategy(); |
| + |
| + /// Applies [impact] to [visitor] for the [impactUse] of [element]. |
| + void visitImpact(Element element, |
| + WorldImpact impact, |
| + WorldImpactVisitor visitor, |
| + ImpactUse impactUse) { |
| + // Apply unconditionally. |
| + impact.apply(visitor); |
| + } |
| +} |
| + |
| +abstract class WorldImpactVisitor { |
|
sigurdm
2015/11/20 12:13:19
dartdoc
Johnni Winther
2015/11/20 13:49:36
Done.
|
| + void visitStaticUse(StaticUse staticUse); |
| + void visitDynamicUse(DynamicUse dynamicUse); |
| + void visitTypeUse(TypeUse typeUse); |
| +} |
| + |
| +// TODO(johnniwinther): Remove these when we get anonymous local classes. |
|
sigurdm
2015/11/20 12:13:19
Don't hold your breath though ;)
Johnni Winther
2015/11/20 13:49:36
Acknowledged.
|
| +typedef void VisitUse<U>(U use); |
| + |
| +class WorldImpactVisitorImpl implements WorldImpactVisitor { |
| + final VisitUse<StaticUse> _visitStaticUse; |
| + final VisitUse<DynamicUse> _visitDynamicUse; |
| + final VisitUse<TypeUse> _visitTypeUse; |
| + |
| + WorldImpactVisitorImpl( |
| + {VisitUse<StaticUse> visitStaticUse, |
| + VisitUse<DynamicUse> visitDynamicUse, |
| + VisitUse<TypeUse> visitTypeUse}) |
| + : _visitStaticUse = visitStaticUse, |
| + _visitDynamicUse = visitDynamicUse, |
| + _visitTypeUse = visitTypeUse; |
| + |
| + @override |
| + void visitStaticUse(StaticUse use) { |
| + if (_visitStaticUse != null) { |
| + _visitStaticUse(use); |
| + } |
| + } |
| + |
| + @override |
| + void visitDynamicUse(DynamicUse use) { |
| + if (_visitDynamicUse != null) { |
| + _visitDynamicUse(use); |
| + } |
| + } |
| + |
| + @override |
| + void visitTypeUse(TypeUse use) { |
| + if (_visitTypeUse != null) { |
| + _visitTypeUse(use); |
| + } |
| + } |
| +} |
| + |