diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolver.java index 9357e43f733..1ed3c556672 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolver.java @@ -16,10 +16,62 @@ package org.jetbrains.jet.lang.resolve.java; +import com.intellij.openapi.util.Condition; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; -public interface TypeVariableResolver { +import java.util.List; + +public class TypeVariableResolver { @NotNull - TypeParameterDescriptor getTypeVariable(@NotNull String name); + protected final List typeParameters; + @NotNull + protected final DeclarationDescriptor owner; + @NotNull + protected final String context; + + public TypeVariableResolver( + @NotNull List typeParameters, + @NotNull DeclarationDescriptor owner, + @NotNull String context + ) { + this.typeParameters = typeParameters; + this.owner = owner; + this.context = context; + + assert ContainerUtil.and(typeParameters, new Condition() { + @Override + public boolean value(TypeParameterDescriptor descriptor) { + return descriptor.getContainingDeclaration() == TypeVariableResolver.this.owner; + } + }) : "Type parameters should be parameters of owner: " + owner + "; " + typeParameters; + } + + @NotNull + public TypeParameterDescriptor getTypeVariable(@NotNull String name) { + return getTypeVariable(name, typeParameters, owner); + } + + @NotNull + private TypeParameterDescriptor getTypeVariable( + @NotNull String name, + @NotNull List typeParameters, + @NotNull DeclarationDescriptor owner + ) { + for (TypeParameterDescriptor typeParameter : typeParameters) { + if (typeParameter.getName().asString().equals(name)) { + return typeParameter; + } + } + + DeclarationDescriptor container = owner.getContainingDeclaration(); + if (container instanceof ClassDescriptor) { + return getTypeVariable(name, ((ClassDescriptor) container).getTypeConstructor().getParameters(), container); + } + + throw new IllegalStateException("Type parameter not found by name '" + name + "' in " + context); + } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolverFromTypeDescriptors.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolverFromTypeDescriptors.java deleted file mode 100644 index a8d75fd101b..00000000000 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolverFromTypeDescriptors.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2010-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.lang.resolve.java; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor; -import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; - -import java.util.List; - -public class TypeVariableResolverFromTypeDescriptors implements TypeVariableResolver { - - @NotNull - private final List typeParameters; - @NotNull - private final DeclarationDescriptor typeParametersOwner; - @NotNull - private final String context; - - public TypeVariableResolverFromTypeDescriptors( - @NotNull List typeParameters, - @NotNull DeclarationDescriptor owner, - @NotNull String context) { - this.typeParameters = typeParameters; - this.typeParametersOwner = owner; - this.context = context; - - for (TypeParameterDescriptor typeParameter : typeParameters) { - if (typeParameter.getContainingDeclaration() != owner) { - throw new IllegalStateException(); - } - } - } - - @NotNull - @Override - public TypeParameterDescriptor getTypeVariable(@NotNull String name) { - return getTypeVariable(name, typeParameters, typeParametersOwner, context); - } - - @NotNull - private static TypeParameterDescriptor getTypeVariable( - @NotNull String name, - @NotNull List typeParameters, - @NotNull DeclarationDescriptor owner, - @NotNull String context) { - for (TypeParameterDescriptor typeParameter : typeParameters) { - if (typeParameter.getName().asString().equals(name)) { - return typeParameter; - } - } - - DeclarationDescriptor containingDeclaration = owner.getContainingDeclaration(); - if (containingDeclaration != null) { - return getTypeVariable( - name, - TypeVariableResolvers.getTypeParameterDescriptors((ClassOrNamespaceDescriptor) containingDeclaration), - containingDeclaration, - context); - } - throw new RuntimeException("type parameter not found by name '" + name + "' in " + context); - } -} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolvers.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolvers.java deleted file mode 100644 index 11eafc93986..00000000000 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/TypeVariableResolvers.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2010-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.lang.resolve.java; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.*; - -import java.util.ArrayList; -import java.util.List; - -public class TypeVariableResolvers { - - @NotNull - public static List getTypeParameterDescriptors(@NotNull ClassOrNamespaceDescriptor clazz) { - if (clazz instanceof ClassDescriptor) { - return ((ClassDescriptor) clazz).getTypeConstructor().getParameters(); - } - else { - return new ArrayList(0); - } - } - - @NotNull - public static TypeVariableResolver classTypeVariableResolver(@NotNull ClassOrNamespaceDescriptor clazz, @NotNull String context) { - return typeVariableResolverFromTypeParameters(getTypeParameterDescriptors(clazz), clazz, context); - } - - @NotNull - public static TypeVariableResolver typeVariableResolverFromTypeParameters( - @NotNull List typeParameters, @NotNull DeclarationDescriptor owner, @NotNull String context) { - - return new TypeVariableResolverFromTypeDescriptors(typeParameters, owner, context); - } - -} diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java index c6cd8b4f92f..4aa17a50282 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaConstructorResolver.java @@ -75,11 +75,11 @@ public final class JavaConstructorResolver { PsiClass psiClass = classData.getPsiClass(); - TypeVariableResolver resolverForTypeParameters = TypeVariableResolvers.classTypeVariableResolver( - containingClass, "class " + psiClass.getQualifiedName()); - List typeParameters = containingClass.getTypeConstructor().getParameters(); + TypeVariableResolver typeVariableResolver = + new TypeVariableResolver(typeParameters, containingClass, "class " + psiClass.getQualifiedName()); + PsiMethod[] psiConstructors = psiClass.getConstructors(); boolean isStatic = psiClass.hasModifierProperty(PsiModifier.STATIC); @@ -128,7 +128,7 @@ public final class JavaConstructorResolver { JetType varargElementType = null; if (i == methods.length - 1 && (returnType instanceof PsiArrayType)) { varargElementType = typeTransformer - .transformToType(((PsiArrayType) returnType).getComponentType(), resolverForTypeParameters); + .transformToType(((PsiArrayType) returnType).getComponentType(), typeVariableResolver); } assert returnType != null; @@ -137,7 +137,7 @@ public final class JavaConstructorResolver { i, Collections.emptyList(), Name.identifier(method.getName()), - typeTransformer.transformToType(returnType, resolverForTypeParameters), + typeTransformer.transformToType(returnType, typeVariableResolver), annotationMethod.getDefaultValue() != null, varargElementType)); } @@ -184,10 +184,12 @@ public final class JavaConstructorResolver { Collections.emptyList(), // TODO false); - String context = "constructor of class " + psiClass.getQualifiedName(); + List typeParameters = classDescriptor.getTypeConstructor().getParameters(); + JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors = valueParameterResolver.resolveParameterDescriptors( constructorDescriptor, constructor.getParameters(), - TypeVariableResolvers.classTypeVariableResolver(classDescriptor, context)); + new TypeVariableResolver(typeParameters, classDescriptor, "constructor of class " + psiClass.getQualifiedName()) + ); if (valueParameterDescriptors.getReceiverType() != null) { throw new IllegalStateException(); @@ -204,7 +206,7 @@ public final class JavaConstructorResolver { Collections.singletonList(alternativeMethodSignatureData.getError())); } - constructorDescriptor.initialize(classDescriptor.getTypeConstructor().getParameters(), + constructorDescriptor.initialize(typeParameters, valueParameterDescriptors.getDescriptors(), DescriptorResolverUtils.resolveVisibility(psiConstructor), aStatic); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java index be4c73361c3..fa5092042b2 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java @@ -128,15 +128,10 @@ public final class JavaFunctionResolver { CallableMemberDescriptor.Kind.DECLARATION ); - String context = "method " + method.getName() + " in class " + psiClass.getQualifiedName(); + List methodTypeParameters = signatureResolver.resolveMethodTypeParameters(method, functionDescriptorImpl); - List methodTypeParameters = - signatureResolver.resolveMethodTypeParameters(method, - functionDescriptorImpl); - - TypeVariableResolver methodTypeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(methodTypeParameters, - functionDescriptorImpl, - context); + TypeVariableResolver methodTypeVariableResolver = new TypeVariableResolver( + methodTypeParameters, functionDescriptorImpl, "method " + method.getName() + " in class " + psiClass.getQualifiedName()); JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors = parameterResolver .resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java index 23f242269a3..c79c3322d5b 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaPropertyResolver.java @@ -158,8 +158,9 @@ public final class JavaPropertyResolver { propertyDescriptor.initialize(null, null); - TypeVariableResolver typeVariableResolverForPropertyInternals = TypeVariableResolvers.typeVariableResolverFromTypeParameters( - Collections.emptyList(), propertyDescriptor, "property " + propertyName + " in " + context); + TypeVariableResolver typeVariableResolverForPropertyInternals = + new TypeVariableResolver(Collections.emptyList(), propertyDescriptor, + "property " + propertyName + " in " + context); JetType propertyType = getPropertyType(field, typeVariableResolverForPropertyInternals); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSignatureResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSignatureResolver.java index d512d39357b..1011e25f973 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSignatureResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSignatureResolver.java @@ -30,7 +30,6 @@ import org.jetbrains.jet.lang.descriptors.impl.TypeParameterDescriptorImpl; import org.jetbrains.jet.lang.resolve.java.JavaSemanticServices; import org.jetbrains.jet.lang.resolve.java.TypeUsage; import org.jetbrains.jet.lang.resolve.java.TypeVariableResolver; -import org.jetbrains.jet.lang.resolve.java.TypeVariableResolvers; import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.Variance; @@ -137,9 +136,8 @@ public final class JavaSignatureResolver { for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) { prevTypeParameters.add(psiTypeParameter.descriptor); - initializeTypeParameter(psiTypeParameter, - TypeVariableResolvers - .typeVariableResolverFromTypeParameters(typeParameters, typeParametersOwner, context)); + + initializeTypeParameter(psiTypeParameter, new TypeVariableResolver(typeParameters, typeParametersOwner, context)); } } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSupertypeResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSupertypeResolver.java index d5c92ef4c25..4b23501237a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSupertypeResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaSupertypeResolver.java @@ -67,8 +67,7 @@ public final class JavaSupertypeResolver { String context = "class " + psiClass.getQualifiedName(); - TypeVariableResolver typeVariableResolverForSupertypes = - TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, classDescriptor, context); + TypeVariableResolver typeVariableResolverForSupertypes = new TypeVariableResolver(typeParameters, classDescriptor, context); transformSupertypeList(result, psiClass.getExtendsListTypes(), typeVariableResolverForSupertypes); transformSupertypeList(result, psiClass.getImplementsListTypes(), typeVariableResolverForSupertypes);