Fixed EA-70681
This commit is contained in:
@@ -16,28 +16,21 @@
|
||||
|
||||
package org.jetbrains.kotlin.j2k
|
||||
|
||||
import org.jetbrains.kotlin.j2k.ast.Type
|
||||
import org.jetbrains.kotlin.j2k.ast.Nullability
|
||||
import com.intellij.psi.*
|
||||
import org.jetbrains.kotlin.j2k.ast.assignPrototype
|
||||
import com.intellij.psi.CommonClassNames.JAVA_LANG_OBJECT
|
||||
import org.jetbrains.kotlin.j2k.ast.assignNoPrototype
|
||||
import org.jetbrains.kotlin.j2k.ast.ErrorType
|
||||
import com.intellij.codeInsight.NullableNotNullManager
|
||||
import org.jetbrains.kotlin.j2k.ast.ArrayType
|
||||
import org.jetbrains.kotlin.j2k.ast.ClassType
|
||||
import org.jetbrains.kotlin.j2k.ast.ReferenceElement
|
||||
import org.jetbrains.kotlin.j2k.ast.Identifier
|
||||
import java.util.HashMap
|
||||
import org.jetbrains.kotlin.j2k.ast.Mutability
|
||||
import java.util.HashSet
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.CommonClassNames.JAVA_LANG_OBJECT
|
||||
import org.jetbrains.kotlin.asJava.KotlinLightElement
|
||||
import org.jetbrains.kotlin.psi.JetCallableDeclaration
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.j2k.ast.*
|
||||
import org.jetbrains.kotlin.psi.JetCallableDeclaration
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.types.TypeUtils
|
||||
import java.util.HashMap
|
||||
import java.util.HashSet
|
||||
|
||||
class TypeConverter(val converter: Converter) {
|
||||
private val typesBeingConverted = HashSet<PsiType>()
|
||||
|
||||
public fun convertType(
|
||||
type: PsiType?,
|
||||
nullability: Nullability = Nullability.Default,
|
||||
@@ -46,7 +39,14 @@ class TypeConverter(val converter: Converter) {
|
||||
): Type {
|
||||
if (type == null) return ErrorType().assignNoPrototype()
|
||||
|
||||
if (!typesBeingConverted.add(type)) { // recursion in conversion
|
||||
return ErrorType().assignNoPrototype()
|
||||
}
|
||||
|
||||
val result = type.accept<Type>(TypeVisitor(converter, type, mutability, inAnnotationType))!!.assignNoPrototype()
|
||||
|
||||
typesBeingConverted.remove(type)
|
||||
|
||||
return when (nullability) {
|
||||
Nullability.NotNull -> result.toNotNullType()
|
||||
Nullability.Nullable -> result.toNullableType()
|
||||
|
||||
@@ -106,7 +106,7 @@ class TypeVisitor(
|
||||
if (targetClass != null) {
|
||||
return targetClass.getTypeParameters().map {
|
||||
val superType = it.getSuperTypes().first() // there must be at least one super type always
|
||||
ClassType(constructReferenceElement(superType, mutability), Nullability.Default, converter.settings).assignNoPrototype()
|
||||
typeConverter.convertType(superType, Nullability.Default, mutability, inAnnotationType).assignNoPrototype()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
class JavaClass1<T extends JavaClass2> {
|
||||
}
|
||||
|
||||
class JavaClass2<T extends JavaClass1> {
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
class JavaClass1<T : JavaClass2<JavaClass1<???>>>
|
||||
|
||||
class JavaClass2<T : JavaClass1<JavaClass2<???>>>
|
||||
@@ -3709,6 +3709,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/rawGenerics"), Pattern.compile("^(.+)\\.java$"), true);
|
||||
}
|
||||
|
||||
@TestMetadata("cycle.java")
|
||||
public void testCycle() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/rawGenerics/cycle.java");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt-540.java")
|
||||
public void testKt_540() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/rawGenerics/kt-540.java");
|
||||
|
||||
@@ -3709,6 +3709,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/rawGenerics"), Pattern.compile("^(.+)\\.java$"), true);
|
||||
}
|
||||
|
||||
@TestMetadata("cycle.java")
|
||||
public void testCycle() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/rawGenerics/cycle.java");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt-540.java")
|
||||
public void testKt_540() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/rawGenerics/kt-540.java");
|
||||
|
||||
Reference in New Issue
Block a user