From 7af5282a266812d546caf40ccceb49927740d7d7 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sat, 28 Apr 2012 17:43:52 +0400 Subject: [PATCH] resolve generic constructor --- .../lang/resolve/java/JavaTypeTransformer.java | 16 ++++++++++++++++ .../constructor/ConstructorGenericDeep.java | 5 +++++ .../constructor/ConstructorGenericDeep.kt | 3 +++ .../constructor/ConstructorGenericDeep.txt | 5 +++++ .../constructor/ConstructorGenericSimple.java | 5 +++++ .../constructor/ConstructorGenericSimple.kt | 3 +++ .../constructor/ConstructorGenericSimple.txt | 5 +++++ .../ConstructorGenericUpperBound.java | 5 +++++ .../constructor/ConstructorGenericUpperBound.kt | 3 +++ .../constructor/ConstructorGenericUpperBound.txt | 5 +++++ 10 files changed, 55 insertions(+) create mode 100644 compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.java create mode 100644 compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.kt create mode 100644 compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericDeep.txt create mode 100644 compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.java create mode 100644 compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.kt create mode 100644 compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericSimple.txt create mode 100644 compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.java create mode 100644 compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.kt create mode 100644 compiler/testData/readJavaBinaryClass/constructor/ConstructorGenericUpperBound.txt 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 d005ef30040..0da95ba01fc 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 00000000000..602193d79e3 --- /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 00000000000..6768daf92d5 --- /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 00000000000..e6cc796b4b3 --- /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 00000000000..84326f2a8d3 --- /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 00000000000..83979465a4d --- /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 00000000000..fba82a89b0e --- /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 00000000000..877f78eff79 --- /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 00000000000..604fb2c9e11 --- /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 00000000000..52489e9a4d8 --- /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 +}