Chromium Code Reviews| Index: pkg/compiler/lib/src/resolution/resolution.dart |
| diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart |
| index f77519078554fdd3435b4a9270104b57fe86c583..90e6ad267db066a43ad2854397d4e19b97760807 100644 |
| --- a/pkg/compiler/lib/src/resolution/resolution.dart |
| +++ b/pkg/compiler/lib/src/resolution/resolution.dart |
| @@ -448,11 +448,11 @@ class ResolverTask extends CompilerTask { |
| void resolveRedirectionChain(ConstructorElement constructor, Spannable node) { |
| ConstructorElement target = constructor; |
| - InterfaceType targetType; |
| - List<Element> seen = new List<Element>(); |
| + DartType targetType; |
| + List<ConstructorElement> seen = new List<ConstructorElement>(); |
| bool isMalformed = false; |
| // Follow the chain of redirections and check for cycles. |
| - while (target.isRedirectingFactory || target.isPatched) { |
| + while (target.isRedirectingFactory) { |
| if (target.hasEffectiveTarget) { |
| // We found a constructor that already has been processed. |
| // TODO(johnniwinther): Should `effectiveTargetType` be part of the |
| @@ -466,12 +466,7 @@ class ResolverTask extends CompilerTask { |
| break; |
| } |
| - Element nextTarget; |
| - if (target.isPatched) { |
| - nextTarget = target.patch; |
| - } else { |
| - nextTarget = target.immediateRedirectionTarget; |
| - } |
| + Element nextTarget = target.immediateRedirectionTarget; |
|
Harry Terkelsen
2016/07/06 16:40:07
much cleaner!
|
| if (seen.contains(nextTarget)) { |
| reporter.reportErrorMessage( |
| @@ -503,16 +498,14 @@ class ResolverTask extends CompilerTask { |
| // substitution of the target type with respect to the factory type. |
| while (!seen.isEmpty) { |
| ConstructorElementX factory = seen.removeLast(); |
| - TreeElements treeElements = factory.treeElements; |
| - assert(invariant(node, treeElements != null, |
| - message: 'No TreeElements cached for $factory.')); |
| - if (!factory.isPatched) { |
| - FunctionExpression functionNode = factory.node; |
| - RedirectingFactoryBody redirectionNode = functionNode.body; |
| - DartType factoryType = treeElements.getType(redirectionNode); |
| - if (!factoryType.isDynamic) { |
| - targetType = targetType.substByContext(factoryType); |
| - } |
| + ResolvedAst resolvedAst = factory.resolvedAst; |
| + assert(invariant(node, resolvedAst != null, |
| + message: 'No ResolvedAst for $factory.')); |
| + FunctionExpression functionNode = resolvedAst.node; |
| + RedirectingFactoryBody redirectionNode = resolvedAst.body; |
| + DartType factoryType = resolvedAst.elements.getType(redirectionNode); |
| + if (!factoryType.isDynamic) { |
| + targetType = targetType.substByContext(factoryType); |
| } |
| factory.setEffectiveTarget(target, targetType, isMalformed: isMalformed); |
| } |