diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index f7182ba2dc5..0e5e03da741 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -13743,6 +13743,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt"); } + @Test + @TestMetadata("innerClassGenericBounds.kt") + public void testInnerClassGenericBounds() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt"); + } + @Test @TestMetadata("innerSuperCall.kt") public void testInnerSuperCall() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 57a179f9395..26d3a86e8fd 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -13743,6 +13743,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt"); } + @Test + @TestMetadata("innerClassGenericBounds.kt") + public void testInnerClassGenericBounds() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt"); + } + @Test @TestMetadata("innerSuperCall.kt") public void testInnerSuperCall() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index e01bd7797d8..ff2231c2252 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -13743,6 +13743,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt"); } + @Test + @TestMetadata("innerClassGenericBounds.kt") + public void testInnerClassGenericBounds() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt"); + } + @Test @TestMetadata("innerSuperCall.kt") public void testInnerSuperCall() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 19b0af95571..04e535cc37a 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -13749,6 +13749,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt"); } + @Test + @TestMetadata("innerClassGenericBounds.kt") + public void testInnerClassGenericBounds() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt"); + } + @Test @TestMetadata("innerSuperCall.kt") public void testInnerSuperCall() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirUpperBoundViolatedHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirUpperBoundViolatedHelpers.kt index d948363714d..5362767bbbb 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirUpperBoundViolatedHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirUpperBoundViolatedHelpers.kt @@ -219,13 +219,15 @@ fun ConeClassLikeType.fullyExpandedTypeWithSource( useSiteSession: FirSession, ): ConeClassLikeType? { val typeRefAndSourcesForArguments = extractArgumentsTypeRefAndSource(typeRef) ?: return null - // Avoid issues with nested type aliases and context receivers on function types as source information isn't returned. - if (typeRefAndSourcesForArguments.size != typeArguments.size) return null // Add source information to arguments of non-expanded type, which is preserved during expansion. - val typeArguments = - typeArguments.zip(typeRefAndSourcesForArguments) { projection, source -> projection.withSource(source) } - .toTypedArray() + val typeArguments = typeArguments.mapIndexed { i, projection -> + // typeRefAndSourcesForArguments can have fewer elements than there are type arguments + // because in FIR, inner types of generic outer types have the generic arguments of the outer type added to the end of their list + // of type arguments but there is no source for them. + val source = typeRefAndSourcesForArguments.elementAtOrNull(i) ?: return@mapIndexed projection + projection.withSource(source) + }.toTypedArray() return withArguments(typeArguments).fullyExpandedType(useSiteSession) } diff --git a/compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.fir.kt b/compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.fir.kt new file mode 100644 index 00000000000..81e712de4e5 --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.fir.kt @@ -0,0 +1,41 @@ +// ISSUE: KT-61068, KT-35566 +// FILE: generic.kt +package generic + +interface Foo + +open class SuperOuter { + open inner class SuperInner(database: D) +} + +class SubOuter : SuperOuter() { + inner class SubInner(database: Any?) : SuperInner<Any?>(database) +} + +// FILE: nongeneric.kt +package nongeneric + +interface Foo + +open class SuperOuter { + open inner class SuperInner(database: D) +} + +class SubOuter : SuperOuter() { + inner class SubInner(database: Any?) : SuperInner<Any?>(database) +} + +// FILE: kt35566.kt +package kt35566 + +open class Case1 { + open inner class Case1_1 : Case1() where L : CharSequence { + var x: L? = null + + inner class Case1_2(m: M) : Case1.Case1_1<M>() where M : Map { + init { + x = m + } + } + } +} diff --git a/compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt b/compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt new file mode 100644 index 00000000000..5771ee8cd02 --- /dev/null +++ b/compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt @@ -0,0 +1,41 @@ +// ISSUE: KT-61068, KT-35566 +// FILE: generic.kt +package generic + +interface Foo + +open class SuperOuter { + open inner class SuperInner(database: D) +} + +class SubOuter : SuperOuter() { + inner class SubInner(database: Any?) : SuperInner(database) +} + +// FILE: nongeneric.kt +package nongeneric + +interface Foo + +open class SuperOuter { + open inner class SuperInner(database: D) +} + +class SubOuter : SuperOuter() { + inner class SubInner(database: Any?) : SuperInner<Any?>(database) +} + +// FILE: kt35566.kt +package kt35566 + +open class Case1 { + open inner class Case1_1 : Case1() where L : CharSequence { + var x: L? = null + + inner class Case1_2(m: M) : Case1.Case1_1() where M : Map { + init { + x = m + } + } + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 84ddf90097a..23056025a48 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -13749,6 +13749,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/generics/innerClasses/importedInner.kt"); } + @Test + @TestMetadata("innerClassGenericBounds.kt") + public void testInnerClassGenericBounds() throws Exception { + runTest("compiler/testData/diagnostics/tests/generics/innerClasses/innerClassGenericBounds.kt"); + } + @Test @TestMetadata("innerSuperCall.kt") public void testInnerSuperCall() throws Exception {