From 9d84e4b60ad300aa8927167f0d307307242f854c Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 28 Jul 2015 14:35:44 +0300 Subject: [PATCH] Fixed EA-70681 --- .../org/jetbrains/kotlin/j2k/TypeConverter.kt | 34 +++++++++---------- .../org/jetbrains/kotlin/j2k/TypeVisitor.kt | 2 +- .../fileOrElement/rawGenerics/cycle.java | 5 +++ .../fileOrElement/rawGenerics/cycle.kt | 3 ++ ...otlinConverterForWebDemoTestGenerated.java | 6 ++++ ...otlinConverterSingleFileTestGenerated.java | 6 ++++ 6 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 j2k/testData/fileOrElement/rawGenerics/cycle.java create mode 100644 j2k/testData/fileOrElement/rawGenerics/cycle.kt diff --git a/j2k/src/org/jetbrains/kotlin/j2k/TypeConverter.kt b/j2k/src/org/jetbrains/kotlin/j2k/TypeConverter.kt index e2f12cf2b70..2480f41352d 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/TypeConverter.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/TypeConverter.kt @@ -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() + 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(TypeVisitor(converter, type, mutability, inAnnotationType))!!.assignNoPrototype() + + typesBeingConverted.remove(type) + return when (nullability) { Nullability.NotNull -> result.toNotNullType() Nullability.Nullable -> result.toNullableType() diff --git a/j2k/src/org/jetbrains/kotlin/j2k/TypeVisitor.kt b/j2k/src/org/jetbrains/kotlin/j2k/TypeVisitor.kt index aae370235e1..dd1abf45cae 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/TypeVisitor.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/TypeVisitor.kt @@ -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() } } } diff --git a/j2k/testData/fileOrElement/rawGenerics/cycle.java b/j2k/testData/fileOrElement/rawGenerics/cycle.java new file mode 100644 index 00000000000..dec86461f9c --- /dev/null +++ b/j2k/testData/fileOrElement/rawGenerics/cycle.java @@ -0,0 +1,5 @@ +class JavaClass1 { +} + +class JavaClass2 { +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/rawGenerics/cycle.kt b/j2k/testData/fileOrElement/rawGenerics/cycle.kt new file mode 100644 index 00000000000..f9eecf9ef51 --- /dev/null +++ b/j2k/testData/fileOrElement/rawGenerics/cycle.kt @@ -0,0 +1,3 @@ +class JavaClass1>> + +class JavaClass2>> diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index 3b2bfe64fb9..34affe05706 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -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"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 2112ee1469e..be55787d206 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.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");