diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java index 6d0aa41bac7..013cd627aeb 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java @@ -684,6 +684,12 @@ public class FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated extend runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/IgnoreAnnotations.kt"); } + @Test + @TestMetadata("interconnectedGenerics.kt") + public void testInterconnectedGenerics() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.kt"); + } + @Test @TestMetadata("kt47396.kt") public void testKt47396() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java index 9f8d70c45ba..0958252dc73 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java @@ -684,6 +684,12 @@ public class FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingT runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/IgnoreAnnotations.kt"); } + @Test + @TestMetadata("interconnectedGenerics.kt") + public void testInterconnectedGenerics() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.kt"); + } + @Test @TestMetadata("kt47396.kt") public void testKt47396() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated.java index 41068e5c793..062b7292a53 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated.java @@ -684,6 +684,12 @@ public class FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated extends runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/IgnoreAnnotations.kt"); } + @Test + @TestMetadata("interconnectedGenerics.kt") + public void testInterconnectedGenerics() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.kt"); + } + @Test @TestMetadata("kt47396.kt") public void testKt47396() throws Exception { diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.fir.kt new file mode 100644 index 00000000000..56f37620841 --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.fir.kt @@ -0,0 +1,137 @@ +// JSPECIFY_STATE: strict +// WITH_STDLIB +// FIR_DUMP +// ISSUE: KT-59514 + +// FILE: lib/En.java + +package lib; + +public interface En extends Se {} + +// FILE: lib/Ke.java + +package lib; + +public interface Ke extends Ta {} + +// FILE: lib/Pr.java + +package lib; + +public interface Pr extends Ke {} + +// FILE: lib/R.java + +package lib; + +public interface R { + interface MR extends R {} + interface F extends R {} + interface FMR extends F, MR {} +} + +// FILE: lib/Se.java + +package lib; + +public interface Se { +} + +// FILE: lib/Ta.java + +package lib; + +public interface Ta { +} + +// FILE: lib/Il.java + +package lib; + +import org.jspecify.nullness.NullMarked; + +@NullMarked +public abstract class Il implements java.util.List { +} + +// FILE: lib/a/C.java + +package lib.a; + +import lib.Ta; +import lib.Se; +import lib.R; +import lib.Il; + +class B {} + +public final class C { + public static > Fr from(Class c) { + return null; + } + + public interface WithL> + extends CanWithB, R.F> {} + + public interface CanWithL> { + WithL withL(int l); + } + + public interface Fr> + extends CanWithL, R.F> {} + + public interface CanWithB> extends R.F> { + WithB withB(B b); + } + + public interface WithB> extends R.F> {} + + static public class MyWithL> implements WithL { + public WithB withB(B b) { + return null; + } + } +} + +// FILE: lib/a/Eq.kt + +package lib.a + +import lib.Se +import lib.Ta + +data class A>(val a: Class) { + companion object { + @JvmStatic + fun > of(b: Class): A = A(b) + } +} + +class Eq>(val a: A) : C.Fr { + override fun withL(l: Int): C.WithL { + return C.MyWithL() + } +} + +// FILE: repro/Repro.kt + +package repro + +import lib.R +import lib.a.C +import lib.Ke +import lib.Pr +import lib.En + +abstract class Repro { + abstract fun f(r: R): T + abstract fun

> g(p: P): R.FMR + private fun isTableValid(c: Class>, key: Pr, b: Boolean) { + if (b) { + f(g(key)) + } else { + f(C.from(c).withL(1)) + } + } +} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.fir.txt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.fir.txt new file mode 100644 index 00000000000..f6d0e836d57 --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.fir.txt @@ -0,0 +1,65 @@ +FILE: Eq.kt + package lib.a + + public final data class A|> : R|kotlin/Any| { + public constructor|>(a: R|java/lang/Class|): R|lib/a/A| { + super() + } + + public final val a: R|java/lang/Class| = R|/a| + public get(): R|java/lang/Class| + + public final companion object Companion : R|kotlin/Any| { + private constructor(): R|lib/a/A.Companion| { + super() + } + + @R|kotlin/jvm/JvmStatic|() public final fun |> of(b: R|java/lang/Class|): R|lib/a/A| { + ^of R|lib/a/A.A|(R|/b|) + } + + } + + public final operator fun component1(): R|java/lang/Class| + + public final fun copy(a: R|java/lang/Class| = this@R|lib/a/A|.R|lib/a/A.a|): R|lib/a/A| + + } + public final class Eq|> : R|lib/a/C.Fr| { + public constructor|>(a: R|lib/a/A|): R|lib/a/Eq| { + super() + } + + public final val a: R|lib/a/A| = R|/a| + public get(): R|lib/a/A| + + public open override fun withL(l: R|kotlin/Int|): R|lib/a/C.WithL| { + ^withL Q|lib/a/C|.R|lib/a/C.MyWithL.MyWithL|() + } + + } +FILE: Repro.kt + package repro + + public abstract class Repro : R|kotlin/Any| { + public constructor(): R|repro/Repro| { + super() + } + + public abstract fun f(r: R|lib/R|): R|T| + + public abstract fun

|> g(p: R|P|): R|lib/R.FMR| + + private final fun isTableValid(c: R|java/lang/Class>|, key: R|lib/Pr|, b: R|kotlin/Boolean|): R|kotlin/Unit| { + when () { + R|/b| -> { + this@R|repro/Repro|.R|repro/Repro.f|, lib/En?>|>(this@R|repro/Repro|.R|repro/Repro.g|, lib/En?>|>(R|/key|)) + } + else -> { + this@R|repro/Repro|.R|repro/Repro.f|, @EnhancedNullability lib/En?>>, lib/Il, @EnhancedNullability lib/En?>>?>|>(Q|lib/a/C|.R|lib/a/C.from*s|, lib/En?>|>(R|/c|).R|SubstitutionOverride, lib/En?>>, lib/a/C.WithL, lib/En?>>?>|>|(Int(1))) + } + } + + } + + } diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.kt new file mode 100644 index 00000000000..74b0a0da061 --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.kt @@ -0,0 +1,137 @@ +// JSPECIFY_STATE: strict +// WITH_STDLIB +// FIR_DUMP +// ISSUE: KT-59514 + +// FILE: lib/En.java + +package lib; + +public interface En extends Se {} + +// FILE: lib/Ke.java + +package lib; + +public interface Ke extends Ta {} + +// FILE: lib/Pr.java + +package lib; + +public interface Pr extends Ke {} + +// FILE: lib/R.java + +package lib; + +public interface R { + interface MR extends R {} + interface F extends R {} + interface FMR extends F, MR {} +} + +// FILE: lib/Se.java + +package lib; + +public interface Se { +} + +// FILE: lib/Ta.java + +package lib; + +public interface Ta { +} + +// FILE: lib/Il.java + +package lib; + +import org.jspecify.nullness.NullMarked; + +@NullMarked +public abstract class Il implements java.util.List { +} + +// FILE: lib/a/C.java + +package lib.a; + +import lib.Ta; +import lib.Se; +import lib.R; +import lib.Il; + +class B {} + +public final class C { + public static > Fr from(Class c) { + return null; + } + + public interface WithL> + extends CanWithB, R.F> {} + + public interface CanWithL> { + WithL withL(int l); + } + + public interface Fr> + extends CanWithL, R.F> {} + + public interface CanWithB> extends R.F> { + WithB withB(B b); + } + + public interface WithB> extends R.F> {} + + static public class MyWithL> implements WithL { + public WithB withB(B b) { + return null; + } + } +} + +// FILE: lib/a/Eq.kt + +package lib.a + +import lib.Se +import lib.Ta + +data class A>(val a: Class) { + companion object { + @JvmStatic + fun > of(b: Class): A = A(b) + } +} + +class Eq>(val a: A) : C.Fr { + override fun withL(l: Int): C.WithL { + return C.MyWithL() + } +} + +// FILE: repro/Repro.kt + +package repro + +import lib.R +import lib.a.C +import lib.Ke +import lib.Pr +import lib.En + +abstract class Repro { + abstract fun f(r: R): T + abstract fun

> g(p: P): R.FMR + private fun isTableValid(c: Class>, key: Pr, b: Boolean) { + if (b) { + f(g(key)) + } else { + f(C.from(c).withL(1)) + } + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java index 05f24327ccb..dbe33a69909 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java @@ -684,6 +684,12 @@ public class ForeignAnnotationsCompiledJavaTestGenerated extends AbstractForeign runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/IgnoreAnnotations.kt"); } + @Test + @TestMetadata("interconnectedGenerics.kt") + public void testInterconnectedGenerics() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.kt"); + } + @Test @TestMetadata("kt47396.kt") public void testKt47396() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java index 329be5c5a25..aead8437434 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java @@ -684,6 +684,12 @@ public class ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated exte runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/IgnoreAnnotations.kt"); } + @Test + @TestMetadata("interconnectedGenerics.kt") + public void testInterconnectedGenerics() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.kt"); + } + @Test @TestMetadata("kt47396.kt") public void testKt47396() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java index 100369f0e11..f6acb311765 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java @@ -684,6 +684,12 @@ public class ForeignAnnotationsSourceJavaTestGenerated extends AbstractForeignAn runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/IgnoreAnnotations.kt"); } + @Test + @TestMetadata("interconnectedGenerics.kt") + public void testInterconnectedGenerics() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/interconnectedGenerics.kt"); + } + @Test @TestMetadata("kt47396.kt") public void testKt47396() throws Exception {