Chromium Code Reviews| Index: compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java |
| diff --git a/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java b/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java |
| index 133fac6e4465660fdf5f7f91e24919a51b5a46b0..3ac8bc4638b719626f90ca71fb16434220d69410 100644 |
| --- a/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java |
| +++ b/compiler/java/com/google/dart/compiler/resolver/ResolveVisitor.java |
| @@ -7,6 +7,7 @@ package com.google.dart.compiler.resolver; |
| import com.google.dart.compiler.ErrorCode; |
| import com.google.dart.compiler.ast.DartCatchBlock; |
| import com.google.dart.compiler.ast.DartFunction; |
| +import com.google.dart.compiler.ast.DartFunctionTypeAlias; |
| import com.google.dart.compiler.ast.DartNode; |
| import com.google.dart.compiler.ast.DartNodeTraverser; |
| import com.google.dart.compiler.ast.DartParameter; |
| @@ -35,22 +36,7 @@ abstract class ResolveVisitor extends DartNodeTraverser<Element> { |
| final MethodElement resolveFunction(DartFunction node, MethodElement element, |
| List<TypeVariable> typeVariables) { |
| - if (typeVariables != null) { |
| - for (TypeVariable typeParameter : typeVariables) { |
| - TypeVariableElement variable = (TypeVariableElement) typeParameter.getElement(); |
| - getContext().getScope().declareElement(variable.getName(), variable); |
| - DartTypeParameter typeParameterNode = (DartTypeParameter) variable.getNode(); |
| - DartTypeNode boundNode = typeParameterNode.getBound(); |
| - Type bound; |
| - if (boundNode != null) { |
| - bound = getContext().resolveType(boundNode, true, ResolverErrorCode.NO_SUCH_TYPE); |
| - boundNode.setType(bound); |
| - } else { |
| - bound = typeProvider.getObjectType(); |
| - } |
| - variable.setBound(bound); |
| - } |
| - } |
| + bindTypeVariables(typeVariables); |
| for (DartParameter parameter : node.getParams()) { |
| Elements.addParameter(element, (VariableElement) parameter.accept(this)); |
| } |
| @@ -67,6 +53,57 @@ abstract class ResolveVisitor extends DartNodeTraverser<Element> { |
| return element; |
| } |
| + private void bindReturnGenerics(DartTypeNode node) { |
| + for (DartTypeNode typeNode : node.getTypeArguments()) { |
| + if (!(typeNode.getType().getElement() instanceof TypeVariableElement)) { |
|
zundel
2011/11/29 21:53:46
better to use ElementKind.of()
codefu
2011/11/29 22:42:13
Done.
|
| + bindReturnGenerics(typeNode); |
| + continue; |
| + } |
| + bindTypeVariable((TypeVariableElement) typeNode.getType().getElement()); |
| + } |
| + } |
| + |
| + final FunctionAliasElement resolveFunctionAlias(DartFunctionTypeAlias node) { |
| + // The purpose of this to find generic types and make sure they are bound to object. |
| + DartTypeNode returnNode = node.getReturnTypeNode(); |
| + if (returnNode != null) { |
| + bindReturnGenerics(returnNode); |
| + } |
| + FunctionAliasElement funcAlias = node.getSymbol(); |
| + for (Type type : funcAlias.getTypeParameters()) { |
| + TypeVariableElement typeVar = (TypeVariableElement) type.getElement(); |
| + getContext().getScope().declareElement(typeVar.getName(), typeVar); |
| + } |
| + for (DartTypeParameter param : node.getTypeParameters()) { |
| + param.accept(this); |
| + } |
| + return null; |
| + } |
| + |
| + void bindTypeVariable(TypeVariableElement variable) { |
| + DartTypeParameter typeParameterNode = (DartTypeParameter) variable.getNode(); |
| + DartTypeNode boundNode = typeParameterNode.getBound(); |
| + Type bound; |
| + if (boundNode != null) { |
| + bound = getContext().resolveType(boundNode, true, ResolverErrorCode.NO_SUCH_TYPE); |
| + boundNode.setType(bound); |
| + } else { |
| + bound = typeProvider.getObjectType(); |
| + } |
| + variable.setBound(bound); |
| + } |
| + |
| + void bindTypeVariables(List<TypeVariable> typeVariables) { |
| + if (typeVariables == null) { |
| + return; |
| + } |
| + for (TypeVariable typeParameter : typeVariables) { |
| + TypeVariableElement variable = (TypeVariableElement) typeParameter.getElement(); |
| + bindTypeVariable(variable); |
| + getContext().getScope().declareElement(variable.getName(), variable); |
| + } |
| + } |
| + |
| abstract boolean isStaticContext(); |
| @Override |
| @@ -87,6 +124,10 @@ abstract class ResolveVisitor extends DartNodeTraverser<Element> { |
| } |
| ClassElement functionElement = typeProvider.getFunctionType().getElement(); |
| type = Types.makeFunctionType(getContext(), functionElement, parameterElements, type, null); |
| + DartTypeNode typeNode = node.getTypeNode(); |
| + if (typeNode != null) { |
| + typeNode.setType(type); |
| + } |
| } |
| Elements.setType(element, type); |
| return recordElement(node, element); |