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 }