diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java index d005ef3004083d186714c13f14179001b20af266..0da95ba01fca995bcfe1730d715384c05f9ce3ad 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.resolve.java; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -25,6 +26,7 @@ import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.resolve.FqName; import org.jetbrains.jet.lang.types.*; +import org.jetbrains.jet.lang.types.checker.JetTypeChecker; import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.lang.types.lang.JetStandardLibrary; import org.jetbrains.jet.lang.types.lang.PrimitiveType; @@ -35,6 +37,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * @author abreslav @@ -126,6 +129,19 @@ public class JavaTypeTransformer { if (psiClass instanceof PsiTypeParameter) { PsiTypeParameter typeParameter = (PsiTypeParameter) psiClass; + + PsiTypeParameterListOwner typeParameterListOwner = typeParameter.getOwner(); + if (typeParameterListOwner instanceof PsiMethod) { + PsiMethod psiMethod = (PsiMethod) typeParameterListOwner; + if (psiMethod.isConstructor()) { + Set supertypesJet = Sets.newHashSet(); + for (PsiClassType supertype : typeParameter.getExtendsListTypes()) { + supertypesJet.add(transformToType(supertype, TypeUsage.UPPER_BOUND, typeVariableResolver)); + } + return TypeUtils.intersect(JetTypeChecker.INSTANCE, supertypesJet); + } + } + TypeParameterDescriptor typeParameterDescriptor = typeVariableResolver.getTypeVariable(typeParameter.getName()); if (howThisTypeIsUsed == TypeUsage.TYPE_ARGUMENT || howThisTypeIsUsed == TypeUsage.UPPER_BOUND) { diff --git a/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.java b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.java new file mode 100644 index 0000000000000000000000000000000000000000..602193d79e3a14ddac6dae8a66742ded6b3adaa2 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.java @@ -0,0 +1,5 @@ +package test; + +class ConstructorGenericDeep { +

ConstructorGenericDeep(java.lang.Class

cl) {} +} diff --git a/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.kt b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.kt new file mode 100644 index 0000000000000000000000000000000000000000..6768daf92d538b77bc538e49457115e08be5d514 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.kt @@ -0,0 +1,3 @@ +package test + +open class ConstructorGenericDeep(p0: java.lang.Class?) : java.lang.Object() diff --git a/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.txt b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.txt new file mode 100644 index 0000000000000000000000000000000000000000..e6cc796b4b375599fba92fb8aebe2d0d2217a115 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.txt @@ -0,0 +1,5 @@ +namespace test + +open class test.ConstructorGenericDeep : java.lang.Object { + final /*constructor*/ fun (/*0*/ p0: java.lang.Class?): test.ConstructorGenericDeep +} diff --git a/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.java b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.java new file mode 100644 index 0000000000000000000000000000000000000000..84326f2a8d374c6fed436b793e9ca7a7bb0968b4 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.java @@ -0,0 +1,5 @@ +package test; + +class ConstructorGenericSimple { +

ConstructorGenericSimple(P p) {} +} diff --git a/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.kt b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.kt new file mode 100644 index 0000000000000000000000000000000000000000..83979465a4d3ff02b0c3c40e7b04aa8f5e413b9e --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.kt @@ -0,0 +1,3 @@ +package test + +open class ConstructorGenericSimple(p0: Any?) : java.lang.Object() diff --git a/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.txt b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.txt new file mode 100644 index 0000000000000000000000000000000000000000..fba82a89b0e140e61c635d01bd1d9def6fb1bb5f --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.txt @@ -0,0 +1,5 @@ +namespace test + +open class test.ConstructorGenericSimple : java.lang.Object { + final /*constructor*/ fun (/*0*/ p0: jet.Any?): test.ConstructorGenericSimple +} diff --git a/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.java b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.java new file mode 100644 index 0000000000000000000000000000000000000000..877f78eff791eeca1f4a2efbf07f571785a82a5b --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.java @@ -0,0 +1,5 @@ +package test; + +class ConstructorGenericUpperBound { +

ConstructorGenericUpperBound(P p) {} +} diff --git a/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.kt b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.kt new file mode 100644 index 0000000000000000000000000000000000000000..604fb2c9e11176e0994cf968cc39b5cfa73dc033 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.kt @@ -0,0 +1,3 @@ +package test + +open class ConstructorGenericUpperBound(p0: java.util.RandomAccess?) : java.lang.Object() diff --git a/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.txt b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.txt new file mode 100644 index 0000000000000000000000000000000000000000..52489e9a4d8c197a2f9a6067067b61e4f45ce776 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.txt @@ -0,0 +1,5 @@ +namespace test + +open class test.ConstructorGenericUpperBound : java.lang.Object { + final /*constructor*/ fun (/*0*/ p0: java.util.RandomAccess?): test.ConstructorGenericUpperBound +}