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 99c1c3c129c339086edae64724c094a5e55c4095..723a87af8bddcdc817f0589bd60adc1db38f080e 100644 |
| --- a/pkg/compiler/lib/src/universe/world_impact.dart |
| +++ b/pkg/compiler/lib/src/universe/world_impact.dart |
| @@ -61,12 +61,18 @@ class WorldImpact { |
| } |
| } |
| -class WorldImpactBuilder { |
| +abstract class WorldImpactBuilder { |
| + void registerDynamicUse(DynamicUse dynamicUse); |
| + void registerTypeUse(TypeUse typeUse); |
| + void registerStaticUse(StaticUse staticUse); |
| +} |
| + |
| +class WorldImpactBuilderImpl extends WorldImpact implements WorldImpactBuilder { |
| // TODO(johnniwinther): Do we benefit from lazy initialization of the |
| // [Setlet]s? |
|
Harry Terkelsen
2016/09/19 21:17:52
Setlet -> Set
|
| - Setlet<DynamicUse> _dynamicUses; |
| - Setlet<StaticUse> _staticUses; |
| - Setlet<TypeUse> _typeUses; |
| + Set<DynamicUse> _dynamicUses; |
| + Set<StaticUse> _staticUses; |
| + Set<TypeUse> _typeUses; |
| void registerDynamicUse(DynamicUse dynamicUse) { |
| assert(dynamicUse != null); |
| @@ -105,9 +111,60 @@ class WorldImpactBuilder { |
| } |
| } |
| +/// [WorldImpactBuilder] that can create and collect a sequence of |
| +/// [WorldImpact]s. |
| +class StagedWorldImpactBuilder implements WorldImpactBuilder { |
| + final bool collectImpacts; |
| + WorldImpactBuilderImpl _currentBuilder; |
| + List<WorldImpactBuilderImpl> _builders = <WorldImpactBuilderImpl>[]; |
| + |
| + StagedWorldImpactBuilder({this.collectImpacts: false}); |
| + |
| + void _ensureBuilder() { |
| + if (_currentBuilder == null) { |
| + _currentBuilder = new WorldImpactBuilderImpl(); |
| + if (collectImpacts) { |
| + _builders.add(_currentBuilder); |
| + } |
| + } |
| + } |
| + |
| + @override |
| + void registerTypeUse(TypeUse typeUse) { |
| + _ensureBuilder(); |
| + _currentBuilder.registerTypeUse(typeUse); |
| + } |
| + |
| + @override |
| + void registerDynamicUse(DynamicUse dynamicUse) { |
| + _ensureBuilder(); |
| + _currentBuilder.registerDynamicUse(dynamicUse); |
| + } |
| + |
| + @override |
| + void registerStaticUse(StaticUse staticUse) { |
| + _ensureBuilder(); |
| + _currentBuilder.registerStaticUse(staticUse); |
| + } |
| + |
| + /// Returns the [WorldImpact] built so far with this builder. The builder |
| + /// is reset, and if [collectImpacts] is `true` the impact is cached for |
| + /// [worldImpacts]. |
| + WorldImpact flush() { |
| + if (_currentBuilder == null) return const WorldImpact(); |
| + WorldImpact worldImpact = _currentBuilder; |
| + _currentBuilder = null; |
| + return worldImpact; |
| + } |
| + |
| + /// If [collectImpacts] is `true` this returns all [WorldImpact]s built with |
| + /// this builder. |
| + Iterable<WorldImpact> get worldImpacts => _builders; |
| +} |
| + |
| /// Mutable implementation of [WorldImpact] used to transform |
| /// [ResolutionImpact] or [CodegenImpact] to [WorldImpact]. |
| -class TransformedWorldImpact implements WorldImpact { |
| +class TransformedWorldImpact implements WorldImpact, WorldImpactBuilder { |
| final WorldImpact worldImpact; |
| Setlet<StaticUse> _staticUses; |