diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassifierTypeImpl.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassifierTypeImpl.java index e5485edd124..27420dd9fae 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassifierTypeImpl.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/structure/impl/JavaClassifierTypeImpl.java @@ -17,14 +17,13 @@ package org.jetbrains.kotlin.load.java.structure.impl; import com.intellij.psi.*; +import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.load.java.structure.*; import java.util.*; -import static org.jetbrains.kotlin.load.java.structure.impl.JavaElementCollectionFromPsiArrayUtil.types; - public class JavaClassifierTypeImpl extends JavaTypeImpl implements JavaClassifierType { private static class ResolutionResult { private final JavaClassifier classifier; @@ -110,6 +109,33 @@ public class JavaClassifierTypeImpl extends JavaTypeImpl implement @Override @NotNull public List getTypeArguments() { - return types(getPsi().getParameters()); + JavaClassifier classifier = getClassifier(); + + // parameters including ones from outer class + Iterable parameters = classifier instanceof JavaClassImpl + ? getReversedTypeParameters((JavaClassImpl) classifier) + : Collections.emptyList(); + + JavaTypeSubstitutor substitutor = getSubstitutor(); + + List result = new ArrayList(); + for (PsiTypeParameter typeParameter : parameters) { + result.add(substitutor.substitute(new JavaTypeParameterImpl(typeParameter))); + } + + return result; + } + + private static Collection getReversedTypeParameters(@NotNull JavaClassImpl classifier) { + Iterable parameters = PsiUtil.typeParametersIterable(classifier.getPsi()); + List result = new ArrayList(); + + for (PsiTypeParameter parameter : parameters) { + result.add(parameter); + } + + Collections.reverse(result); + + return result; } } diff --git a/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.runtime.txt b/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.runtime.txt new file mode 100644 index 00000000000..60d412a808d --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.runtime.txt @@ -0,0 +1,14 @@ +package test + +public open class InnerClassesInGeneric { + public constructor InnerClassesInGeneric() + + public open inner class Inner { + public constructor Inner() + } + + public open inner class Inner2 : test.InnerClassesInGeneric.Inner { + public constructor Inner2() + public open operator fun iterator(): kotlin.(Mutable)Iterator! + } +} diff --git a/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.txt b/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.txt index 906bdfee6f0..49810c01454 100644 --- a/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.txt +++ b/compiler/testData/loadJava/compiledJava/InnerClassesInGeneric.txt @@ -7,7 +7,7 @@ public open class InnerClassesInGeneric.Inner { public constructor Inner2() public open operator fun iterator(): kotlin.(Mutable)Iterator! } diff --git a/compiler/testData/loadJava/compiledJava/InnerOfGeneric.runtime.txt b/compiler/testData/loadJava/compiledJava/InnerOfGeneric.runtime.txt new file mode 100644 index 00000000000..f8561cb2933 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/InnerOfGeneric.runtime.txt @@ -0,0 +1,28 @@ +package test + +public open class InnerOfGeneric { + public constructor InnerOfGeneric() + + public abstract inner class A { + public constructor A() + + public abstract inner class Inner : test.InnerOfGeneric.S { + public constructor Inner() + public open override /*1*/ /*fake_override*/ fun iterator(): kotlin.(Mutable)Iterator! + } + } + + public open inner class B : test.InnerOfGeneric.A { + public constructor B() + + public open inner class SubInner : test.InnerOfGeneric.A.Inner { + public constructor SubInner() + public open override /*1*/ fun iterator(): kotlin.(Mutable)Iterator! + } + } + + public open inner class S { + public constructor S() + public open operator fun iterator(): kotlin.(Mutable)Iterator! + } +} diff --git a/compiler/testData/loadJava/compiledJava/InnerOfGeneric.txt b/compiler/testData/loadJava/compiledJava/InnerOfGeneric.txt index 90a6ee865fa..18b30001978 100644 --- a/compiler/testData/loadJava/compiledJava/InnerOfGeneric.txt +++ b/compiler/testData/loadJava/compiledJava/InnerOfGeneric.txt @@ -15,7 +15,7 @@ public open class InnerOfGeneric { public open inner class B : test.InnerOfGeneric.A { public constructor B() - public open inner class SubInner : test.InnerOfGeneric.A.Inner { + public open inner class SubInner : test.InnerOfGeneric.A.Inner { public constructor SubInner() public open override /*1*/ fun iterator(): kotlin.(Mutable)Iterator! } diff --git a/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.runtime.txt b/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.runtime.txt new file mode 100644 index 00000000000..873bc62f412 --- /dev/null +++ b/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.runtime.txt @@ -0,0 +1,22 @@ +package test + +public interface ReturnInnerSubclassOfSupersInner { + + public open class Sub : test.ReturnInnerSubclassOfSupersInner.Super { + public constructor Sub() + + public/*package*/ open inner class Inner : test.ReturnInnerSubclassOfSupersInner.Super.Inner { + public/*package*/ constructor Inner() + public/*package*/ open override /*1*/ fun get(): test.ReturnInnerSubclassOfSupersInner.Sub! + } + } + + public open class Super { + public constructor Super() + + public/*package*/ open inner class Inner { + public/*package*/ constructor Inner() + public/*package*/ open fun get(): test.ReturnInnerSubclassOfSupersInner.Super! + } + } +} diff --git a/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.txt b/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.txt index 3aff37ed373..f09f06068ab 100644 --- a/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.txt +++ b/compiler/testData/loadJava/compiledJava/signaturePropagation/ReturnInnerSubclassOfSupersInner.txt @@ -5,7 +5,7 @@ public interface ReturnInnerSubclassOfSupersInner { public open class Sub : test.ReturnInnerSubclassOfSupersInner.Super { public constructor Sub() - public/*package*/ open inner class Inner : test.ReturnInnerSubclassOfSupersInner.Super.Inner { + public/*package*/ open inner class Inner : test.ReturnInnerSubclassOfSupersInner.Super.Inner { public/*package*/ constructor Inner() public/*package*/ open override /*1*/ fun get(): test.ReturnInnerSubclassOfSupersInner.Sub! } diff --git a/compiler/testData/loadJava/sourceJava/ReturnInnerSubclassOfSupersInner.txt b/compiler/testData/loadJava/sourceJava/ReturnInnerSubclassOfSupersInner.txt index 3aff37ed373..f09f06068ab 100644 --- a/compiler/testData/loadJava/sourceJava/ReturnInnerSubclassOfSupersInner.txt +++ b/compiler/testData/loadJava/sourceJava/ReturnInnerSubclassOfSupersInner.txt @@ -5,7 +5,7 @@ public interface ReturnInnerSubclassOfSupersInner { public open class Sub : test.ReturnInnerSubclassOfSupersInner.Super { public constructor Sub() - public/*package*/ open inner class Inner : test.ReturnInnerSubclassOfSupersInner.Super.Inner { + public/*package*/ open inner class Inner : test.ReturnInnerSubclassOfSupersInner.Super.Inner { public/*package*/ constructor Inner() public/*package*/ open override /*1*/ fun get(): test.ReturnInnerSubclassOfSupersInner.Sub! } diff --git a/compiler/testData/loadJava/sourceJava/WrongNumberOfGenericParameters.java b/compiler/testData/loadJava/sourceJava/WrongNumberOfGenericParameters.java index 12c12f8b2c4..003cb566f03 100644 --- a/compiler/testData/loadJava/sourceJava/WrongNumberOfGenericParameters.java +++ b/compiler/testData/loadJava/sourceJava/WrongNumberOfGenericParameters.java @@ -8,6 +8,7 @@ public interface WrongNumberOfGenericParameters { Zero z(); One o0(); + // Our Java resolve supposes that return type has exactly one argument One o2(); // This does not produce the expected result, because IDEA thinks Two is a raw type diff --git a/compiler/testData/loadJava/sourceJava/WrongNumberOfGenericParameters.txt b/compiler/testData/loadJava/sourceJava/WrongNumberOfGenericParameters.txt index bd79cc1c916..4728b149d01 100644 --- a/compiler/testData/loadJava/sourceJava/WrongNumberOfGenericParameters.txt +++ b/compiler/testData/loadJava/sourceJava/WrongNumberOfGenericParameters.txt @@ -2,7 +2,7 @@ package test public interface WrongNumberOfGenericParameters { public abstract fun o0(): test.WrongNumberOfGenericParameters.One<(raw) kotlin.Any!>! - public abstract fun o2(): test.WrongNumberOfGenericParameters.One<[ERROR : T]>! + public abstract fun o2(): test.WrongNumberOfGenericParameters.One! public abstract fun t1(): test.WrongNumberOfGenericParameters.Two<(raw) kotlin.Any!, (raw) kotlin.Any!>! public abstract fun z(): test.WrongNumberOfGenericParameters.Zero! diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaClassifierType.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaClassifierType.kt index e3e7840aea3..d46270525cf 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaClassifierType.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/java/structure/reflect/ReflectJavaClassifierType.kt @@ -45,7 +45,9 @@ public class ReflectJavaClassifierType(public override val type: Type) : Reflect override fun isRaw(): Boolean = with(type) { this is Class<*> && getTypeParameters().isNotEmpty() } override fun getTypeArguments(): List { - return (type as? ParameterizedType)?.getActualTypeArguments()?.map { ReflectJavaType.create(it) } ?: listOf() + return sequence({type as? ParameterizedType}, { it.ownerType as? ParameterizedType }).flatMap { + it.actualTypeArguments.asSequence().map { ReflectJavaType.create(it) } + }.toList() } override fun getAnnotations(): Collection {