diff --git a/compiler/testData/codegen/boxAgainstJava/recursiveRawTypes/kt16528.kt b/compiler/testData/codegen/boxAgainstJava/recursiveRawTypes/kt16528.kt new file mode 100644 index 00000000000..c556592861d --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/recursiveRawTypes/kt16528.kt @@ -0,0 +1,19 @@ +// FILE: JavaScriptParser.java +public class JavaScriptParser { + public String foo() {return "OK";} +} +// FILE: JSPsiTypeParser.java +public class JSPsiTypeParser {} + +// FILE: ES6Parser.java + +public class ES6Parser extends JavaScriptParser {} + +// FILE: main.kt + +fun createParser(): JavaScriptParser<*> { + return ES6Parser>() +} + +fun box(): String = createParser().foo() + diff --git a/compiler/testData/codegen/boxAgainstJava/recursiveRawTypes/kt16639.kt b/compiler/testData/codegen/boxAgainstJava/recursiveRawTypes/kt16639.kt new file mode 100644 index 00000000000..41a21c41c7c --- /dev/null +++ b/compiler/testData/codegen/boxAgainstJava/recursiveRawTypes/kt16639.kt @@ -0,0 +1,21 @@ +// WITH_RUNTIME +// FILE: Device.java +import java.util.Collection; + +public class Device { + public static Collection> getLoop() { + return null; + } +} + +// FILE: Service.java + +public class Service { +} + +// FILE: loop.kt + +fun box(): String { + val x = Device.getLoop()?.firstOrNull() // compilation error + return "OK" +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.kt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.kt new file mode 100644 index 00000000000..a0351f21e5c --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.kt @@ -0,0 +1,4 @@ +// FILE: JavaScriptParser.java +public class JavaScriptParser {} +// FILE: JSPsiTypeParser.java +public class JSPsiTypeParser {} diff --git a/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.txt b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.txt new file mode 100644 index 00000000000..b704791a33b --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.txt @@ -0,0 +1,15 @@ +package + +public open class JSPsiTypeParser!>!> { + public constructor JSPsiTypeParser!>!>() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public open class JavaScriptParser!>!> { + public constructor JavaScriptParser!>!>() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index cf360dcb14a..e9c6058ec8b 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -15273,6 +15273,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("interClassesRecursion.kt") + public void testInterClassesRecursion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/rawTypes/interClassesRecursion.kt"); + doTest(fileName); + } + @TestMetadata("nonGenericRawMember.kt") public void testNonGenericRawMember() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/rawTypes/nonGenericRawMember.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java index 24a71d97837..24b3db77bf9 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxAgainstJavaCodegenTestGenerated.java @@ -477,6 +477,27 @@ public class BlackBoxAgainstJavaCodegenTestGenerated extends AbstractBlackBoxAga } } + @TestMetadata("compiler/testData/codegen/boxAgainstJava/recursiveRawTypes") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class RecursiveRawTypes extends AbstractBlackBoxAgainstJavaCodegenTest { + public void testAllFilesPresentInRecursiveRawTypes() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxAgainstJava/recursiveRawTypes"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("kt16528.kt") + public void testKt16528() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/recursiveRawTypes/kt16528.kt"); + doTest(fileName); + } + + @TestMetadata("kt16639.kt") + public void testKt16639() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxAgainstJava/recursiveRawTypes/kt16639.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/boxAgainstJava/reflection") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/JavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/JavaTypeResolver.kt index bc4958ce1e0..f0044598a6a 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/JavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/lazy/types/JavaTypeResolver.kt @@ -218,8 +218,10 @@ class JavaTypeResolver( // so we get A<*, *>. // Summary result for upper bound of T is `A, A<*, *>>..A, out A<*, *>>` val erasedUpperBound = - parameter.getErasedUpperBound(attr.upperBoundOfTypeParameter) { - constructor.declarationDescriptor!!.defaultType.replaceArgumentsWithStarProjections() + LazyWrappedType(c.storageManager) { + parameter.getErasedUpperBound(attr.upperBoundOfTypeParameter) { + constructor.declarationDescriptor!!.defaultType.replaceArgumentsWithStarProjections() + } } RawSubstitution.computeProjection(parameter, attr, erasedUpperBound)