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 e77d5c0925c5c208536f281d8d0e72c22483dcf7..2bfb6e13987cb7c3029e9e077c9940ef56bbdeb6 100644 |
| --- a/pkg/compiler/lib/src/serialization/modelz.dart |
| +++ b/pkg/compiler/lib/src/serialization/modelz.dart |
| @@ -30,6 +30,7 @@ import '../tree/tree.dart'; |
| import '../util/util.dart' show Link, LinkBuilder; |
| import 'keys.dart'; |
| import 'serialization.dart'; |
| +import 'serialization_util.dart'; |
| /// Compute a [Link] from an [Iterable]. |
| Link toLink(Iterable iterable) { |
| @@ -1065,6 +1066,7 @@ abstract class ConstructorElementZ extends DeserializedElementZ |
| MemberElementMixin |
| implements ConstructorElement { |
| ConstantConstructor _constantConstructor; |
| + ConstructorElement _effectiveTarget; |
| ConstructorElementZ(ObjectDecoder decoder) : super(decoder); |
| @@ -1103,24 +1105,29 @@ abstract class ConstructorElementZ extends DeserializedElementZ |
| AsyncMarker get asyncMarker => AsyncMarker.SYNC; |
| @override |
| - InterfaceType computeEffectiveTargetType(InterfaceType newType) { |
| - return _unsupported('computeEffectiveTargetType'); |
| - } |
| - |
| - @override |
| ConstructorElement get definingConstructor { |
| - return _unsupported('definingConstructor'); |
| + String name = |
| + _decoder.getString(Key.DEFINING_CONSTRUCTOR, isOptional: true); |
| + if (name != null) { |
| + return enclosingClass.superclass.lookupConstructor(name); |
| + } |
| + return null; |
| } |
| @override |
| ConstructorElement get effectiveTarget { |
| - return _unsupported('effectiveTarget'); |
| + if (_effectiveTarget == null) { |
| + _effectiveTarget = |
| + _decoder.getElement(Key.EFFECTIVE_TARGET, isOptional: true); |
| + if (_effectiveTarget == null) { |
| + _effectiveTarget = this; |
| + } |
| + } |
| + return _effectiveTarget; |
| } |
| @override |
| - ConstructorElement get immediateRedirectionTarget { |
| - return _unsupported('immediateRedirectionTarget'); |
| - } |
| + ConstructorElement get immediateRedirectionTarget => null; |
| @override |
| bool get isEffectiveTargetMalformed { |
| @@ -1128,18 +1135,19 @@ abstract class ConstructorElementZ extends DeserializedElementZ |
| } |
| @override |
| - bool get isRedirectingFactory => _unsupported('isRedirectingFactory'); |
| + bool get isCyclicRedirection => _unsupported('isCyclicRedirection'); |
| @override |
| - bool get isRedirectingGenerative => _unsupported('isRedirectingGenerative'); |
| + bool get isRedirectingFactory => false; |
| @override |
| - bool get isCyclicRedirection => _unsupported('isCyclicRedirection'); |
| + bool get isRedirectingGenerative => false; |
| @override |
| - PrefixElement get redirectionDeferredPrefix { |
| - return _unsupported('redirectionDeferredPrefix'); |
| - } |
| + PrefixElement get redirectionDeferredPrefix => null; |
| + |
| + @override |
| + InterfaceType computeEffectiveTargetType(InterfaceType newType) => newType; |
| } |
| class GenerativeConstructorElementZ extends ConstructorElementZ { |
| @@ -1149,8 +1157,7 @@ class GenerativeConstructorElementZ extends ConstructorElementZ { |
| ElementKind get kind => ElementKind.GENERATIVE_CONSTRUCTOR; |
| @override |
| - bool get isEffectiveTargetMalformed => |
| - _unsupported('isEffectiveTargetMalformed'); |
| + bool get isRedirectingGenerative => _decoder.getBool(Key.IS_REDIRECTING); |
| } |
| class FactoryConstructorElementZ extends ConstructorElementZ { |
| @@ -1158,10 +1165,66 @@ class FactoryConstructorElementZ extends ConstructorElementZ { |
| @override |
| ElementKind get kind => ElementKind.FACTORY_CONSTRUCTOR; |
| +} |
| + |
| +class RedirectingFactoryConstructorElementZ extends ConstructorElementZ { |
| + InterfaceType _effectiveTargetType; |
| + ConstructorElement _immediateRedirectionTarget; |
| + PrefixElement _redirectionDeferredPrefix; |
| + |
| + RedirectingFactoryConstructorElementZ(ObjectDecoder decoder) : super(decoder); |
| + |
| + @override |
| + ElementKind get kind => ElementKind.FACTORY_CONSTRUCTOR; |
| @override |
| - bool get isEffectiveTargetMalformed => |
| - _unsupported('isEffectiveTargetMalformed'); |
| + bool get isRedirectingFactory => true; |
| + |
| + void _ensureEffectiveTarget() { |
| + if (_effectiveTarget == null) { |
| + _effectiveTarget = |
| + _decoder.getElement(Key.EFFECTIVE_TARGET, isOptional: true); |
| + if (_effectiveTarget == null) { |
| + _effectiveTarget = this; |
| + _effectiveTargetType = enclosingClass.thisType; |
| + } else { |
| + _effectiveTargetType = _decoder.getType(Key.EFFECTIVE_TARGET_TYPE); |
| + } |
| + } |
| + } |
| + |
| + @override |
| + ConstructorElement get effectiveTarget { |
| + _ensureEffectiveTarget(); |
| + return _effectiveTarget; |
| + } |
| + |
| + @override |
| + InterfaceType computeEffectiveTargetType(InterfaceType newType) { |
| + _ensureEffectiveTarget(); |
| + return _effectiveTargetType.substByContext(newType); |
| + } |
| + |
| + void _ensureRedirection() { |
| + if (_immediateRedirectionTarget == null) { |
| + _immediateRedirectionTarget = |
| + _decoder.getElement(Key.IMMEDIATE_REDIRECTION_TARGET); |
| + _redirectionDeferredPrefix = |
| + _decoder.getElement(Key.PREFIX, isOptional: true); |
| + } |
| + } |
| + |
| + @override |
| + ConstructorElement get immediateRedirectionTarget { |
|
Siggi Cherem (dart-lang)
2016/04/29 20:20:23
optional suggestion, probably not worth it.
I'd e
Johnni Winther
2016/04/30 09:04:46
I think it's only really worthwhile to deserialize
Siggi Cherem (dart-lang)
2016/05/02 16:58:35
Yeah, I look forward to the new format. At that po
|
| + _ensureRedirection(); |
| + return _immediateRedirectionTarget; |
| + } |
| + |
| + @override |
| + PrefixElement get redirectionDeferredPrefix { |
| + _ensureRedirection(); |
| + return _redirectionDeferredPrefix; |
| + } |
| } |
| class ForwardingConstructorElementZ extends ElementZ |