Chromium Code Reviews| Index: pkg/compiler/lib/src/serialization/modelz.dart |
| diff --git a/pkg/compiler/lib/src/serialization/modelz.dart b/pkg/compiler/lib/src/serialization/modelz.dart |
| index a067b9e6ebf65dc3c3440a5b576370bc6ed731ba..33563f8832f4002fe05300061b12545bc7950ea9 100644 |
| --- a/pkg/compiler/lib/src/serialization/modelz.dart |
| +++ b/pkg/compiler/lib/src/serialization/modelz.dart |
| @@ -196,7 +196,7 @@ class MappedContainer { |
| String setterName = '$name,='; |
| bool hasSetterId = members.containsKey(setterName); |
| Element element; |
| - Element setterElement; |
| + SetterElement setterElement; |
| if (!hasId && !hasSetterId) { |
| _lookupCache[name] = null; |
| return null; |
| @@ -334,7 +334,18 @@ class AbstractFieldElementZ extends ElementZ |
| final GetterElementZ getter; |
| final SetterElementZ setter; |
| - AbstractFieldElementZ(this.name, this.getter, this.setter) { |
| + factory AbstractFieldElementZ( |
| + String name, GetterElement getter, SetterElement setter) { |
| + if (getter != null && getter.abstractField != null) { |
|
Harry Terkelsen
2016/07/13 18:06:46
if (getter?.abstractField != null)
Johnni Winther
2016/07/15 08:15:20
Done.
|
| + return getter.abstractField; |
| + } else if (setter != null && setter.abstractField != null) { |
| + return setter.abstractField; |
| + } else { |
| + return new AbstractFieldElementZ._(name, getter, setter); |
| + } |
| + } |
| + |
| + AbstractFieldElementZ._(this.name, this.getter, this.setter) { |
| if (getter != null) { |
| getter.abstractField = this; |
| getter.setter = setter; |
| @@ -398,6 +409,7 @@ class LibraryElementZ extends DeserializedElementZ |
| List<ExportElement> _exports; |
| ListedContainer _exportsMap; |
| ListedContainer _importsMap; |
| + Map<Element, List<ImportElement>> _importsFor; |
| LibraryElementZ(ObjectDecoder decoder) : super(decoder); |
| @@ -497,7 +509,28 @@ class LibraryElementZ extends DeserializedElementZ |
| void _ensureImports() { |
| if (_importsMap == null) { |
| - _importsMap = new ListedContainer(_decoder.getElements(Key.IMPORT_SCOPE)); |
| + _importsMap = new ListedContainer( |
| + _decoder.getElements(Key.IMPORT_SCOPE, isOptional: true)); |
| + _importsFor = <Element, List<ImportElement>>{}; |
| + |
| + ListDecoder importsDecoder = _decoder.getList(Key.IMPORTS_FOR); |
| + for (int index = 0; index < importsDecoder.length; index++) { |
| + ObjectDecoder objectDecoder = importsDecoder.getObject(index); |
|
Harry Terkelsen
2016/07/13 18:06:46
maybe ListDecoder can implement Iterable<Decoder>?
Johnni Winther
2016/07/15 08:15:20
The elements are either ObjectDecoder or MapDecode
|
| + Element key = objectDecoder.getElement(Key.ELEMENT); |
| + List<ImportElement> imports = |
| + objectDecoder.getElements(Key.IMPORTS, isOptional: true); |
| + |
| + // Imports are mapped to [AbstractFieldElement] which are not serialized |
| + // so we use getter (or setter if there is no getter) as the key. |
| + Element importedElement = key; |
| + if (key.isDeferredLoaderGetter) { |
| + // Use as [importedElement]. |
| + } else if (key.isAccessor) { |
| + AccessorElement accessor = key; |
| + importedElement = accessor.abstractField; |
| + } |
| + _importsFor[importedElement] = imports; |
| + } |
| } |
| } |
| @@ -509,9 +542,8 @@ class LibraryElementZ extends DeserializedElementZ |
| @override |
| Iterable<ImportElement> getImportsFor(Element element) { |
| - // TODO(johnniwinther): Serialize this to support deferred access to |
| - // serialized entities. |
| - return <ImportElement>[]; |
| + _ensureImports(); |
| + return _importsFor[element] ?? const <ImportElement>[]; |
| } |
| String toString() { |