Index: pkg/compiler/lib/src/serialization/impact_serialization.dart |
diff --git a/pkg/compiler/lib/src/serialization/impact_serialization.dart b/pkg/compiler/lib/src/serialization/impact_serialization.dart |
index ef86609a0d5136e33e7b7be69f68e7a1b233798c..d5d255ba29db180b13ccb723073fe3866b4b46c6 100644 |
--- a/pkg/compiler/lib/src/serialization/impact_serialization.dart |
+++ b/pkg/compiler/lib/src/serialization/impact_serialization.dart |
@@ -5,26 +5,58 @@ |
library dart2js.serialization.impact; |
import '../dart_types.dart'; |
+import '../common/resolution.dart'; |
+import '../constants/expressions.dart'; |
import '../elements/elements.dart'; |
import '../universe/call_structure.dart'; |
import '../universe/selector.dart'; |
import '../universe/world_impact.dart'; |
import '../universe/use.dart'; |
+import '../util/enumset.dart'; |
import 'keys.dart'; |
import 'serialization.dart'; |
-/// Visitor that serializes a [WorldImpact] object using an [ObjectEncoder]. |
+/// Visitor that serializes a [ResolutionImpact] object using an |
+/// [ObjectEncoder]. |
class ImpactSerializer implements WorldImpactVisitor { |
+ final ObjectEncoder objectEncoder; |
final ListEncoder staticUses; |
final ListEncoder dynamicUses; |
final ListEncoder typeUses; |
ImpactSerializer(ObjectEncoder objectEncoder) |
- : staticUses = objectEncoder.createList(Key.STATIC_USES), |
+ : this.objectEncoder = objectEncoder, |
+ staticUses = objectEncoder.createList(Key.STATIC_USES), |
dynamicUses = objectEncoder.createList(Key.DYNAMIC_USES), |
typeUses = objectEncoder.createList(Key.TYPE_USES); |
+ void serialize(ResolutionImpact resolutionImpact) { |
+ resolutionImpact.apply(this); |
+ objectEncoder.setStrings(Key.SYMBOLS, resolutionImpact.constSymbolNames); |
+ objectEncoder.setConstants( |
+ Key.CONSTANTS, resolutionImpact.constantLiterals); |
+ objectEncoder.setEnums(Key.FEATURES, resolutionImpact.features); |
+ if (resolutionImpact.listLiterals.isNotEmpty) { |
+ ListEncoder encoder = objectEncoder.createList(Key.LISTS); |
+ for (ListLiteralUse use in resolutionImpact.listLiterals) { |
+ ObjectEncoder useEncoder = encoder.createObject(); |
+ useEncoder.setType(Key.TYPE, use.type); |
+ useEncoder.setBool(Key.IS_CONST, use.isConstant); |
+ useEncoder.setBool(Key.IS_EMPTY, use.isEmpty); |
+ } |
+ } |
+ if (resolutionImpact.mapLiterals.isNotEmpty) { |
+ ListEncoder encoder = objectEncoder.createList(Key.MAPS); |
+ for (MapLiteralUse use in resolutionImpact.mapLiterals) { |
+ ObjectEncoder useEncoder = encoder.createObject(); |
+ useEncoder.setType(Key.TYPE, use.type); |
+ useEncoder.setBool(Key.IS_CONST, use.isConstant); |
+ useEncoder.setBool(Key.IS_EMPTY, use.isEmpty); |
+ } |
+ } |
+ } |
+ |
@override |
void visitDynamicUse(DynamicUse dynamicUse) { |
ObjectEncoder object = dynamicUses.createObject(); |
@@ -66,22 +98,47 @@ class ImpactSerializer implements WorldImpactVisitor { |
} |
/// A deserialized [WorldImpact] object. |
-class DeserializedWorldImpact extends WorldImpact with WorldImpactBuilder {} |
+class DeserializedResolutionImpact extends WorldImpact |
+ implements ResolutionImpact { |
+ final Iterable<String> constSymbolNames; |
+ final Iterable<ConstantExpression> constantLiterals; |
+ final Iterable<DynamicUse> dynamicUses; |
+ final EnumSet<Feature> _features; |
+ final Iterable<ListLiteralUse> listLiterals; |
+ final Iterable<MapLiteralUse> mapLiterals; |
+ final Iterable<StaticUse> staticUses; |
+ final Iterable<TypeUse> typeUses; |
+ |
+ DeserializedResolutionImpact({ |
+ this.constSymbolNames, |
+ this.constantLiterals, |
+ this.dynamicUses, |
+ EnumSet<Feature> features, |
+ this.listLiterals, |
+ this.mapLiterals, |
+ this.staticUses, |
+ this.typeUses}) |
+ : this._features = features; |
+ |
+ Iterable<Feature> get features => _features.iterable(Feature.values); |
+} |
class ImpactDeserializer { |
/// Deserializes a [WorldImpact] from [objectDecoder]. |
- static WorldImpact deserializeImpact(ObjectDecoder objectDecoder) { |
- DeserializedWorldImpact worldImpact = new DeserializedWorldImpact(); |
- ListDecoder staticUses = objectDecoder.getList(Key.STATIC_USES); |
- for (int index = 0; index < staticUses.length; index++) { |
- ObjectDecoder object = staticUses.getObject(index); |
+ static ResolutionImpact deserializeImpact(ObjectDecoder objectDecoder) { |
+ ListDecoder staticUseDecoder = objectDecoder.getList(Key.STATIC_USES); |
+ List<StaticUse> staticUses = <StaticUse>[]; |
+ for (int index = 0; index < staticUseDecoder.length; index++) { |
+ ObjectDecoder object = staticUseDecoder.getObject(index); |
StaticUseKind kind = object.getEnum(Key.KIND, StaticUseKind.values); |
Element element = object.getElement(Key.ELEMENT); |
- worldImpact.registerStaticUse(new StaticUse.internal(element, kind)); |
+ staticUses.add(new StaticUse.internal(element, kind)); |
} |
- ListDecoder dynamicUses = objectDecoder.getList(Key.DYNAMIC_USES); |
- for (int index = 0; index < dynamicUses.length; index++) { |
- ObjectDecoder object = dynamicUses.getObject(index); |
+ |
+ ListDecoder dynamicUseDecoder = objectDecoder.getList(Key.DYNAMIC_USES); |
+ List<DynamicUse> dynamicUses = <DynamicUse>[]; |
+ for (int index = 0; index < dynamicUseDecoder.length; index++) { |
+ ObjectDecoder object = dynamicUseDecoder.getObject(index); |
SelectorKind kind = object.getEnum(Key.KIND, SelectorKind.values); |
int argumentCount = object.getInt(Key.ARGUMENTS); |
List<String> namedArguments = |
@@ -89,7 +146,7 @@ class ImpactDeserializer { |
String name = object.getString(Key.NAME); |
bool isSetter = object.getBool(Key.IS_SETTER); |
LibraryElement library = object.getElement(Key.LIBRARY, isOptional: true); |
- worldImpact.registerDynamicUse( |
+ dynamicUses.add( |
new DynamicUse( |
new Selector( |
kind, |
@@ -97,13 +154,63 @@ class ImpactDeserializer { |
new CallStructure(argumentCount, namedArguments)), |
null)); |
} |
- ListDecoder typeUses = objectDecoder.getList(Key.TYPE_USES); |
- for (int index = 0; index < typeUses.length; index++) { |
- ObjectDecoder object = typeUses.getObject(index); |
+ |
+ ListDecoder typeUseDecoder = objectDecoder.getList(Key.TYPE_USES); |
+ List<TypeUse> typeUses = <TypeUse>[]; |
+ for (int index = 0; index < typeUseDecoder.length; index++) { |
+ ObjectDecoder object = typeUseDecoder.getObject(index); |
TypeUseKind kind = object.getEnum(Key.KIND, TypeUseKind.values); |
DartType type = object.getType(Key.TYPE); |
- worldImpact.registerTypeUse(new TypeUse.internal(type, kind)); |
+ typeUses.add(new TypeUse.internal(type, kind)); |
} |
- return worldImpact; |
+ |
+ List<String> constSymbolNames = |
+ objectDecoder.getStrings(Key.SYMBOLS, isOptional: true); |
+ |
+ List<ConstantExpression> constantLiterals = |
+ objectDecoder.getConstants(Key.CONSTANTS, isOptional: true); |
+ |
+ EnumSet<Feature> features = |
+ objectDecoder.getEnums(Key.FEATURES, isOptional: true); |
+ |
+ ListDecoder listLiteralDecoder = |
+ objectDecoder.getList(Key.LISTS, isOptional: true); |
+ List<ListLiteralUse> listLiterals = const <ListLiteralUse>[]; |
+ if (listLiteralDecoder != null) { |
+ listLiterals = <ListLiteralUse>[]; |
+ for (int i = 0; i < listLiteralDecoder.length; i++) { |
+ ObjectDecoder useDecoder = listLiteralDecoder.getObject(i); |
+ DartType type = useDecoder.getType(Key.TYPE); |
+ bool isConstant = useDecoder.getBool(Key.IS_CONST); |
+ bool isEmpty = useDecoder.getBool(Key.IS_EMPTY); |
+ listLiterals.add(new ListLiteralUse( |
+ type, isConstant: isConstant, isEmpty: isEmpty)); |
+ } |
+ } |
+ |
+ ListDecoder mapLiteralDecoder = |
+ objectDecoder.getList(Key.LISTS, isOptional: true); |
+ List<MapLiteralUse> mapLiterals = const <MapLiteralUse>[]; |
+ if (listLiteralDecoder != null) { |
+ mapLiterals = <MapLiteralUse>[]; |
+ for (int i = 0; i < mapLiteralDecoder.length; i++) { |
+ ObjectDecoder useDecoder = mapLiteralDecoder.getObject(i); |
+ DartType type = useDecoder.getType(Key.TYPE); |
+ bool isConstant = useDecoder.getBool(Key.IS_CONST); |
+ bool isEmpty = useDecoder.getBool(Key.IS_EMPTY); |
+ mapLiterals.add(new MapLiteralUse( |
+ type, isConstant: isConstant, isEmpty: isEmpty)); |
+ } |
+ } |
+ |
+ return new DeserializedResolutionImpact( |
+ constSymbolNames: constSymbolNames, |
+ constantLiterals: constantLiterals, |
+ dynamicUses: dynamicUses, |
+ features: features, |
+ listLiterals: listLiterals, |
+ mapLiterals: mapLiterals, |
+ staticUses: staticUses, |
+ typeUses: typeUses); |
} |
} |