KT-62458 Fix generation of type parameters for local classes
diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt
index e4f2620..3af5d3b 100644
--- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt
+++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/lazy/resolve/RawFirNonLocalDeclarationBuilder.kt
@@ -133,14 +133,14 @@
     }
 
     override fun addCapturedTypeParameters(
-        status: Boolean,
+        isInner: Boolean,
         declarationSource: KtSourceElement?,
         currentFirTypeParameters: List<FirTypeParameterRef>,
     ) {
         if (originalDeclaration is FirTypeParameterRefsOwner && declarationSource?.psi == originalDeclaration.psi) {
-            super.addCapturedTypeParameters(status, declarationSource, originalDeclaration.typeParameters)
+            super.addCapturedTypeParameters(isInner, declarationSource, originalDeclaration.typeParameters)
         } else {
-            super.addCapturedTypeParameters(status, declarationSource, currentFirTypeParameters)
+            super.addCapturedTypeParameters(isInner, declarationSource, currentFirTypeParameters)
         }
     }
 
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java
index 7e5cda8..ae74050 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirBlackBoxCodegenBasedTestGenerated.java
@@ -28353,6 +28353,12 @@
         }
 
         @Test
+        @TestMetadata("kt62584.kt")
+        public void testKt62584() throws Exception {
+            runTest("compiler/testData/codegen/box/innerNested/kt62584.kt");
+        }
+
+        @Test
         @TestMetadata("kt63732.kt")
         public void testKt63732() throws Exception {
             runTest("compiler/testData/codegen/box/innerNested/kt63732.kt");
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java
index 4f96a07..72ceece 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirReversedBlackBoxCodegenBasedTestGenerated.java
@@ -28353,6 +28353,12 @@
         }
 
         @Test
+        @TestMetadata("kt62584.kt")
+        public void testKt62584() throws Exception {
+            runTest("compiler/testData/codegen/box/innerNested/kt62584.kt");
+        }
+
+        @Test
         @TestMetadata("kt63732.kt")
         public void testKt63732() throws Exception {
             runTest("compiler/testData/codegen/box/innerNested/kt63732.kt");
diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java
index f9381e9..abe9047 100644
--- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java
+++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java
@@ -28006,6 +28006,12 @@
         }
 
         @Test
+        @TestMetadata("kt62584.kt")
+        public void testKt62584() throws Exception {
+            runTest("compiler/testData/codegen/box/innerNested/kt62584.kt");
+        }
+
+        @Test
         @TestMetadata("kt63732.kt")
         public void testKt63732() throws Exception {
             runTest("compiler/testData/codegen/box/innerNested/kt63732.kt");
diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java
index 1a444e1..f6882d8 100644
--- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java
+++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java
@@ -28006,6 +28006,12 @@
         }
 
         @Test
+        @TestMetadata("kt62584.kt")
+        public void testKt62584() throws Exception {
+            runTest("compiler/testData/codegen/box/innerNested/kt62584.kt");
+        }
+
+        @Test
         @TestMetadata("kt63732.kt")
         public void testKt63732() throws Exception {
             runTest("compiler/testData/codegen/box/innerNested/kt63732.kt");
diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java
index a394308..3f10885 100644
--- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java
+++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java
@@ -28006,6 +28006,12 @@
         }
 
         @Test
+        @TestMetadata("kt62584.kt")
+        public void testKt62584() throws Exception {
+            runTest("compiler/testData/codegen/box/innerNested/kt62584.kt");
+        }
+
+        @Test
         @TestMetadata("kt63732.kt")
         public void testKt63732() throws Exception {
             runTest("compiler/testData/codegen/box/innerNested/kt63732.kt");
diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt
index e41aeb3..442db17 100644
--- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt
+++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/LightTreeRawFirDeclarationBuilder.kt
@@ -504,7 +504,7 @@
 
                 typeParameterList?.let { firTypeParameters += convertTypeParameters(it, typeConstraints, classSymbol) }
 
-                withCapturedTypeParameters(status.isInner || isLocal, classNode.toFirSourceElement(), firTypeParameters) {
+                withCapturedTypeParameters(status.isInner, classNode.toFirSourceElement(), firTypeParameters) {
                     var delegatedFieldsMap: Map<Int, FirFieldSymbol>? = null
                     buildRegularClass {
                         source = classNode.toFirSourceElement()
diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt
index dcbe12f..40238a9 100644
--- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt
+++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/PsiRawFirBuilder.kt
@@ -1522,7 +1522,7 @@
                         isExternal = classOrObject.hasModifier(EXTERNAL_KEYWORD)
                     }
 
-                    withCapturedTypeParameters(status.isInner || isLocal, sourceElement, listOf()) {
+                    withCapturedTypeParameters(status.isInner, sourceElement, listOf()) {
                         var delegatedFieldsMap: Map<Int, FirFieldSymbol>?
                         buildRegularClass {
                             source = sourceElement
@@ -1539,7 +1539,7 @@
 
                             context.appendOuterTypeParameters(ignoreLastLevel = true, typeParameters)
                             context.pushFirTypeParameters(
-                                status.isInner || isLocal,
+                                status.isInner,
                                 typeParameters.subList(0, classOrObject.typeParameters.size)
                             )
 
diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt
index b0aeb8b..8d5475c 100644
--- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt
+++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt
@@ -132,12 +132,12 @@
     }
 
     protected inline fun <T> withCapturedTypeParameters(
-        status: Boolean,
+        isInner: Boolean,
         declarationSource: KtSourceElement? = null,
         currentFirTypeParameters: List<FirTypeParameterRef>,
         block: () -> T,
     ): T {
-        addCapturedTypeParameters(status, declarationSource, currentFirTypeParameters)
+        addCapturedTypeParameters(isInner, declarationSource, currentFirTypeParameters)
         return try {
             block()
         } finally {
@@ -171,11 +171,11 @@
     }
 
     protected open fun addCapturedTypeParameters(
-        status: Boolean,
+        isInner: Boolean,
         declarationSource: KtSourceElement?,
         currentFirTypeParameters: List<FirTypeParameterRef>,
     ) {
-        context.pushFirTypeParameters(status, currentFirTypeParameters)
+        context.pushFirTypeParameters(isInner, currentFirTypeParameters)
     }
 
     fun callableIdForName(name: Name) =
diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Context.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Context.kt
index 227b52b..0b29d7a 100644
--- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Context.kt
+++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/Context.kt
@@ -57,8 +57,8 @@
     val dispatchReceiverTypesStack = mutableListOf<ConeClassLikeType>()
     var containerIsExpect: Boolean = false
 
-    fun pushFirTypeParameters(isInnerOrLocal: Boolean, parameters: List<FirTypeParameterRef>) {
-        capturedTypeParameters.add(StatusFirTypeParameterSymbolList(isInnerOrLocal, parameters.map { it.symbol }))
+    fun pushFirTypeParameters(isInner: Boolean, parameters: List<FirTypeParameterRef>) {
+        capturedTypeParameters.add(StatusFirTypeParameterSymbolList(isInner, parameters.map { it.symbol }))
     }
 
     fun popFirTypeParameters() {
@@ -76,7 +76,7 @@
                 }
             }
 
-            if (!element.isInnerOrLocal) {
+            if (!element.isInner) {
                 break
             }
         }
@@ -193,5 +193,5 @@
         }
     }
 
-    data class StatusFirTypeParameterSymbolList(val isInnerOrLocal: Boolean, val list: List<FirTypeParameterSymbol> = listOf())
+    data class StatusFirTypeParameterSymbolList(val isInner: Boolean, val list: List<FirTypeParameterSymbol> = listOf())
 }
diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt
index a0182e0..3553d761 100644
--- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt
+++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/types/IrTypeSystemContext.kt
@@ -613,7 +613,6 @@
                 is IrField -> current.parent
                 is IrClass -> when {
                     current.isInner -> current.parent as IrClass
-                    current.visibility == DescriptorVisibilities.LOCAL -> current.parent
                     else -> null
                 }
                 is IrConstructor -> current.parent as IrClass
diff --git a/compiler/testData/codegen/box/innerNested/kt62584.kt b/compiler/testData/codegen/box/innerNested/kt62584.kt
new file mode 100644
index 0000000..97b4eee
--- /dev/null
+++ b/compiler/testData/codegen/box/innerNested/kt62584.kt
@@ -0,0 +1,24 @@
+// TARGET_BACKEND: JVM
+// WITH_STDLIB
+class A<T>
+
+val <R> A<R>.p: Any
+    get() {
+        open class Local<X>
+        class AnotherLocal : Local<String>()
+        return AnotherLocal()
+    }
+
+fun <R> A<R>.foo(): Any {
+    open class Local<X>
+    class AnotherLocal : Local<String>()
+    return AnotherLocal()
+}
+
+fun box(): String {
+    val signatureInProperty = A<String>().p::class.java.genericSuperclass.toString()
+    if (signatureInProperty != "Kt62584Kt\$p\$Local<java.lang.String>") return signatureInProperty
+    val signatureInFunction = A<String>().foo()::class.java.genericSuperclass.toString()
+    if (signatureInFunction != "Kt62584Kt\$foo\$Local<java.lang.String>") return signatureInFunction
+    return "OK"
+}
\ No newline at end of file
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java
index bc58475..7fb2f97 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java
@@ -26746,6 +26746,12 @@
         }
 
         @Test
+        @TestMetadata("kt62584.kt")
+        public void testKt62584() throws Exception {
+            runTest("compiler/testData/codegen/box/innerNested/kt62584.kt");
+        }
+
+        @Test
         @TestMetadata("kt63732.kt")
         public void testKt63732() throws Exception {
             runTest("compiler/testData/codegen/box/innerNested/kt63732.kt");
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java
index cbed606..2b57311 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java
@@ -28006,6 +28006,12 @@
         }
 
         @Test
+        @TestMetadata("kt62584.kt")
+        public void testKt62584() throws Exception {
+            runTest("compiler/testData/codegen/box/innerNested/kt62584.kt");
+        }
+
+        @Test
         @TestMetadata("kt63732.kt")
         public void testKt63732() throws Exception {
             runTest("compiler/testData/codegen/box/innerNested/kt63732.kt");
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java
index 52433c3..268c916 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java
@@ -28006,6 +28006,12 @@
         }
 
         @Test
+        @TestMetadata("kt62584.kt")
+        public void testKt62584() throws Exception {
+            runTest("compiler/testData/codegen/box/innerNested/kt62584.kt");
+        }
+
+        @Test
         @TestMetadata("kt63732.kt")
         public void testKt63732() throws Exception {
             runTest("compiler/testData/codegen/box/innerNested/kt63732.kt");
diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java
index 7ddc87f..29b824b 100644
--- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java
+++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java
@@ -23610,6 +23610,11 @@
             runTest("compiler/testData/codegen/box/innerNested/kt5363.kt");
         }
 
+        @TestMetadata("kt62584.kt")
+        public void testKt62584() throws Exception {
+            runTest("compiler/testData/codegen/box/innerNested/kt62584.kt");
+        }
+
         @TestMetadata("kt63732.kt")
         public void testKt63732() throws Exception {
             runTest("compiler/testData/codegen/box/innerNested/kt63732.kt");
diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/typeParameterUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/typeParameterUtils.kt
index 46c0378..fb2992b 100644
--- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/typeParameterUtils.kt
+++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/typeParameterUtils.kt
@@ -26,7 +26,7 @@
 fun ClassifierDescriptorWithTypeParameters.computeConstructorTypeParameters(): List<TypeParameterDescriptor> {
     val declaredParameters = declaredTypeParameters
 
-    if (!isInner && containingDeclaration !is CallableDescriptor) return declaredParameters
+    if (!isInner) return declaredParameters
 
     val parametersFromContainingFunctions =
         parents.takeWhile { it is CallableDescriptor }