| Index: lib/compiler/implementation/elements/elements.dart
 | 
| diff --git a/lib/compiler/implementation/elements/elements.dart b/lib/compiler/implementation/elements/elements.dart
 | 
| index 8870678023f50765eec73cd5e53a196241a5571e..31536cde58e9e7e094262a869ad10fdd0e5cd2ea 100644
 | 
| --- a/lib/compiler/implementation/elements/elements.dart
 | 
| +++ b/lib/compiler/implementation/elements/elements.dart
 | 
| @@ -491,21 +491,37 @@ class PrefixElement extends Element {
 | 
|  }
 | 
|  
 | 
|  class TypedefElement extends Element implements TypeDeclarationElement {
 | 
| -  Type cachedType;
 | 
|    Typedef cachedNode;
 | 
| +  TypedefType cachedType;
 | 
| +  Type alias;
 | 
| +
 | 
| +  bool isResolved = false;
 | 
| +  bool isBeingResolved = false;
 | 
|  
 | 
|    TypedefElement(SourceString name, Element enclosing)
 | 
|        : super(name, ElementKind.TYPEDEF, enclosing);
 | 
|  
 | 
| -  Type computeType(Compiler compiler) {
 | 
| +  /**
 | 
| +   * Function signature for a typedef of a function type. The signature is
 | 
| +   * kept to provide full information about parameter names through the mirror
 | 
| +   * system.
 | 
| +   *
 | 
| +   * The [functionSignature] is not available until the typedef element has been
 | 
| +   * resolved.
 | 
| +   */
 | 
| +  FunctionSignature functionSignature;
 | 
| +
 | 
| +  TypedefType computeType(Compiler compiler) {
 | 
|      if (cachedType !== null) return cachedType;
 | 
| -    cachedType = new FunctionType(null, null, this);
 | 
| -    cachedType.initializeFrom(
 | 
| -        compiler.computeFunctionType(this, compiler.resolveTypedef(this)));
 | 
| +    Typedef node = parseNode(compiler);
 | 
| +    Link<Type> parameters =
 | 
| +        TypeDeclarationElement.createTypeVariables(this, node.typeParameters);
 | 
| +    cachedType = new TypedefType(this, parameters);
 | 
| +    compiler.resolveTypedef(this);
 | 
|      return cachedType;
 | 
|    }
 | 
|  
 | 
| -  Link<Type> get typeVariables() => const EmptyLink<Type>();
 | 
| +  Link<Type> get typeVariables() => cachedType.typeArguments;
 | 
|  
 | 
|    Scope buildScope() =>
 | 
|        new TypeDeclarationScope(enclosingElement.buildScope(), this);
 | 
| @@ -658,7 +674,7 @@ class VariableListElement extends Element {
 | 
|    VariableListElement cloneTo(Element enclosing, DiagnosticListener listener) {
 | 
|      VariableListElement result;
 | 
|      if (cachedNode !== null) {
 | 
| -      result = new VariableListElement(cachedNode, kind, enclosing);
 | 
| +      result = new VariableListElement.node(cachedNode, kind, enclosing);
 | 
|      } else {
 | 
|        result = new VariableListElement(kind, modifiers, enclosing);
 | 
|      }
 | 
| @@ -1489,7 +1505,7 @@ class TypeVariableElement extends Element {
 | 
|  
 | 
|    TypeVariableElement cloneTo(Element enclosing, DiagnosticListener listener) {
 | 
|      TypeVariableElement result =
 | 
| -        new TypeVariableElement(name, enclosing, node, type, bound);
 | 
| +        new TypeVariableElement(name, enclosing, cachedNode, type, bound);
 | 
|      return result;
 | 
|    }
 | 
|  }
 | 
| 
 |