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 bb6ac355a32783b9694fb33874dac21cacbdef25..745df3e6ad06df80c23e5c6b998fa9ea4b1afb27 100644 |
--- a/pkg/compiler/lib/src/universe/world_impact.dart |
+++ b/pkg/compiler/lib/src/universe/world_impact.dart |
@@ -246,3 +246,120 @@ class WorldImpactBuilder { |
? _closures : const <LocalFunctionElement>[]; |
} |
} |
+ |
+/// Mutable implementation of [WorldImpact] used to transform |
+/// [ResolutionImpact] or [CodegenImpact] to [WorldImpact]. |
+class TransformedWorldImpact implements WorldImpact { |
+ final WorldImpact worldImpact; |
+ |
+ Setlet<Element> _staticUses; |
+ Setlet<InterfaceType> _instantiatedTypes; |
+ Setlet<UniverseSelector> _dynamicGetters; |
+ Setlet<UniverseSelector> _dynamicInvocations; |
+ Setlet<UniverseSelector> _dynamicSetters; |
+ |
+ TransformedWorldImpact(this.worldImpact); |
+ |
+ @override |
+ Iterable<DartType> get asCasts => worldImpact.asCasts; |
+ |
+ @override |
+ Iterable<DartType> get checkedModeChecks => worldImpact.checkedModeChecks; |
+ |
+ @override |
+ Iterable<MethodElement> get closurizedFunctions { |
+ return worldImpact.closurizedFunctions; |
+ } |
+ |
+ @override |
+ Iterable<UniverseSelector> get dynamicGetters { |
+ return _dynamicGetters != null |
+ ? _dynamicGetters : worldImpact.dynamicGetters; |
+ } |
+ |
+ @override |
+ Iterable<UniverseSelector> get dynamicInvocations { |
+ return _dynamicInvocations != null |
+ ? _dynamicInvocations : worldImpact.dynamicInvocations; |
+ } |
+ |
+ @override |
+ Iterable<UniverseSelector> get dynamicSetters { |
+ return _dynamicSetters != null |
+ ? _dynamicSetters : worldImpact.dynamicSetters; |
+ } |
+ |
+ @override |
+ Iterable<DartType> get isChecks => worldImpact.isChecks; |
+ |
+ @override |
+ Iterable<DartType> get onCatchTypes => worldImpact.onCatchTypes; |
+ |
+ _unsupported(String message) => throw new UnsupportedError(message); |
+ |
+ void registerDynamicGetter(UniverseSelector selector) { |
+ if (_dynamicGetters == null) { |
+ _dynamicGetters = new Setlet<UniverseSelector>(); |
+ _dynamicGetters.addAll(worldImpact.dynamicGetters); |
+ } |
+ _dynamicGetters.add(selector); |
+ } |
+ |
+ void registerDynamicInvocation(UniverseSelector selector) { |
+ if (_dynamicInvocations == null) { |
+ _dynamicInvocations = new Setlet<UniverseSelector>(); |
+ _dynamicInvocations.addAll(worldImpact.dynamicInvocations); |
+ } |
+ _dynamicInvocations.add(selector); |
+ } |
+ |
+ void registerDynamicSetter(UniverseSelector selector) { |
+ if (_dynamicSetters == null) { |
+ _dynamicSetters = new Setlet<UniverseSelector>(); |
+ _dynamicSetters.addAll(worldImpact.dynamicSetters); |
+ } |
+ _dynamicSetters.add(selector); |
+ } |
+ |
+ void registerInstantiatedType(InterfaceType type) { |
+ if (_instantiatedTypes == null) { |
+ _instantiatedTypes = new Setlet<InterfaceType>(); |
+ _instantiatedTypes.addAll(worldImpact.instantiatedTypes); |
+ } |
+ _instantiatedTypes.add(type); |
+ } |
+ |
+ @override |
+ Iterable<InterfaceType> get instantiatedTypes { |
+ return _instantiatedTypes != null |
+ ? _instantiatedTypes : worldImpact.instantiatedTypes; |
+ } |
+ |
+ @override |
+ Iterable<DartType> get typeLiterals { |
+ return worldImpact.typeLiterals; |
+ } |
+ |
+ void registerStaticUse(Element element) { |
+ if (_staticUses == null) { |
+ _staticUses = new Setlet<Element>(); |
+ _staticUses.addAll(worldImpact.staticUses); |
+ } |
+ _staticUses.add(element); |
+ } |
+ |
+ @override |
+ Iterable<Element> get staticUses { |
+ return _staticUses != null ? _staticUses : worldImpact.staticUses; |
+ } |
+ |
+ @override |
+ Iterable<LocalFunctionElement> get closures => worldImpact.closures; |
+ |
+ String toString() { |
+ StringBuffer sb = new StringBuffer(); |
+ sb.write('TransformedWorldImpact($worldImpact)'); |
+ WorldImpact.printOn(sb, this); |
+ return sb.toString(); |
+ } |
+} |