Fixed EA-70681
This commit is contained in:
@@ -16,28 +16,21 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.j2k
|
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 com.intellij.codeInsight.NullableNotNullManager
|
||||||
import org.jetbrains.kotlin.j2k.ast.ArrayType
|
import com.intellij.psi.*
|
||||||
import org.jetbrains.kotlin.j2k.ast.ClassType
|
import com.intellij.psi.CommonClassNames.JAVA_LANG_OBJECT
|
||||||
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 org.jetbrains.kotlin.asJava.KotlinLightElement
|
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.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) {
|
class TypeConverter(val converter: Converter) {
|
||||||
|
private val typesBeingConverted = HashSet<PsiType>()
|
||||||
|
|
||||||
public fun convertType(
|
public fun convertType(
|
||||||
type: PsiType?,
|
type: PsiType?,
|
||||||
nullability: Nullability = Nullability.Default,
|
nullability: Nullability = Nullability.Default,
|
||||||
@@ -46,7 +39,14 @@ class TypeConverter(val converter: Converter) {
|
|||||||
): Type {
|
): Type {
|
||||||
if (type == null) return ErrorType().assignNoPrototype()
|
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()
|
val result = type.accept<Type>(TypeVisitor(converter, type, mutability, inAnnotationType))!!.assignNoPrototype()
|
||||||
|
|
||||||
|
typesBeingConverted.remove(type)
|
||||||
|
|
||||||
return when (nullability) {
|
return when (nullability) {
|
||||||
Nullability.NotNull -> result.toNotNullType()
|
Nullability.NotNull -> result.toNotNullType()
|
||||||
Nullability.Nullable -> result.toNullableType()
|
Nullability.Nullable -> result.toNullableType()
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ class TypeVisitor(
|
|||||||
if (targetClass != null) {
|
if (targetClass != null) {
|
||||||
return targetClass.getTypeParameters().map {
|
return targetClass.getTypeParameters().map {
|
||||||
val superType = it.getSuperTypes().first() // there must be at least one super type always
|
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);
|
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")
|
@TestMetadata("kt-540.java")
|
||||||
public void testKt_540() throws Exception {
|
public void testKt_540() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/rawGenerics/kt-540.java");
|
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);
|
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")
|
@TestMetadata("kt-540.java")
|
||||||
public void testKt_540() throws Exception {
|
public void testKt_540() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/rawGenerics/kt-540.java");
|
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/rawGenerics/kt-540.java");
|
||||||
|
|||||||
Reference in New Issue
Block a user