anchor.diff:        ConstructorElement constructor) {
       HashSet<ConstructorElement> constructorsVisited =
           new HashSet<ConstructorElement>();
  -    while (constructor.isFactory) {
  -      if (identical(
  -          constructor.enclosingElement.type, typeProvider.symbolType)) {
  -        // The dart:core.Symbol has a const factory constructor that redirects
  -        // to dart:_internal.Symbol.  That in turn redirects to an external
  -        // const constructor, which we won't be able to evaluate.
  -        // So stop following the chain of redirections at dart:core.Symbol, and
  -        // let [evaluateInstanceCreationExpression] handle it specially.
  +    while (true) {
  +      ConstructorElement redirectedConstructor =
  +          _getConstRedirectedConstructor(constructor);
  +      if (redirectedConstructor == null) {
           break;
  -      }
  -      ConstructorElement constructorBase = _getConstructorBase(constructor);
  -      constructorsVisited.add(constructorBase);
  -      ConstructorElement redirectedConstructor =
  -          constructor.redirectedConstructor;
  -      if (redirectedConstructor == null) {
  -        // This can happen if constructor is an external factory constructor.
  -        break;
  -      }
  -      if (!redirectedConstructor.isConst) {
  -        // Delegating to a non-const constructor--this is not allowed (and
  -        // is checked elsewhere--see
  -        // [ErrorVerifier.checkForRedirectToNonConstConstructor()]).
  -        break;
  -      }
  -      ConstructorElement redirectedConstructorBase =
  -          _getConstructorBase(redirectedConstructor);
  -      if (constructorsVisited.contains(redirectedConstructorBase)) {
  -        // Cycle in redirecting factory constructors--this is not allowed
  -        // and is checked elsewhere--see
  -        // [ErrorVerifier.checkForRecursiveFactoryRedirect()]).
  -        break;
  +      } else {
  +        ConstructorElement constructorBase = _getConstructorBase(constructor);
  +        constructorsVisited.add(constructorBase);
  +        ConstructorElement redirectedConstructorBase =
  +            _getConstructorBase(redirectedConstructor);
  +        if (constructorsVisited.contains(redirectedConstructorBase)) {
  +          // Cycle in redirecting factory constructors--this is not allowed
  +          // and is checked elsewhere--see
  +          // [ErrorVerifier.checkForRecursiveFactoryRedirect()]).
  +          break;
  +        }
         }
         constructor = redirectedConstructor;
       }
  
positive.code:    */
    void _generateCycleError(List<AstNode> cycle, AstNode constant) {
      // TODO(brianwilkerson) Implement this.
    }
  
    ConstructorElement _getConstructorBase(ConstructorElement constructor) {
  
negative.code:     });
      constructorDeclarationMap.forEach((ConstructorElement element,
          ConstructorDeclaration declaration) {
        ConstructorElement redirectedConstructor =
            _getConstRedirectedConstructor(element);
        if (redirectedConstructor != null) {
          ConstructorElement redirectedConstructorBase =
              _getConstructorBase(redirectedConstructor);
          ConstructorDeclaration redirectedConstructorDeclaration =
              findConstructorDeclaration(redirectedConstructorBase);
          referenceGraph.addEdge(declaration, redirectedConstructorDeclaration);
          return;
        }
        ReferenceFinder referenceFinder = new ReferenceFinder(declaration,
            referenceGraph, _variableDeclarationMap, constructorDeclarationMap);
        referenceGraph.addNode(declaration);
  