From 1b7425f4282dc4a0e255d03da65207e491419354 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 21 May 2021 10:36:24 +0300 Subject: [PATCH] FIR mangler: handle situation with invisible type in f/o signature Before this commit, FIR mangler effectively dropped f/o parameter with invisible type from this module. It could lead to signature clashes. Now we insert classId in mangler string instead. This fixes FIR bootstrap. --- .../fir/backend/jvm/FirJvmMangleComputer.kt | 5 +++ .../FirBlackBoxCodegenTestGenerated.java | 6 ++++ ...amWithReceiverMavenProjectImportHandler.kt | 36 +++++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++ 4 files changed, 53 insertions(+) create mode 100644 compiler/testData/codegen/box/fir/SamWithReceiverMavenProjectImportHandler.kt diff --git a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmMangleComputer.kt b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmMangleComputer.kt index 57b3520f02c..a203a4ec1ae 100644 --- a/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmMangleComputer.kt +++ b/compiler/fir/fir2ir/jvm-backend/src/org/jetbrains/kotlin/fir/backend/jvm/FirJvmMangleComputer.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.resolve.fullyExpandedType import org.jetbrains.kotlin.fir.resolve.toSymbol +import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol @@ -214,6 +215,10 @@ open class FirJvmMangleComputer( } is FirClassSymbol -> symbol.fir.accept(copy(MangleMode.FQNAME), false) is FirTypeParameterSymbol -> tBuilder.mangleTypeParameterReference(symbol.fir) + // This is performed for a case with invisible class-like symbol in fake override + null -> (type.lookupTag as? ConeClassLikeLookupTag)?.let { + tBuilder.append(it.classId) + } } type.typeArguments.asList().ifNotEmpty { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index bb6e530051a..aabe8979fdb 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -15662,6 +15662,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/fir/noSymbolForIntRangeIterator.kt"); } + @Test + @TestMetadata("SamWithReceiverMavenProjectImportHandler.kt") + public void testSamWithReceiverMavenProjectImportHandler() throws Exception { + runTest("compiler/testData/codegen/box/fir/SamWithReceiverMavenProjectImportHandler.kt"); + } + @Test @TestMetadata("SuspendExtension.kt") public void testSuspendExtension() throws Exception { diff --git a/compiler/testData/codegen/box/fir/SamWithReceiverMavenProjectImportHandler.kt b/compiler/testData/codegen/box/fir/SamWithReceiverMavenProjectImportHandler.kt new file mode 100644 index 00000000000..56435e7bb5a --- /dev/null +++ b/compiler/testData/codegen/box/fir/SamWithReceiverMavenProjectImportHandler.kt @@ -0,0 +1,36 @@ +// TARGET_BACKEND: JVM_IR +// WITH_RUNTIME + +// MODULE: maven +// FILE: MavenProject.kt + +interface MavenProject + +// MODULE: lib(maven) +// FILE: lib.kt + +abstract class AbstractMavenImportHandler { + abstract fun getOptions(enabledCompilerPlugins: List, compilerPluginOptions: List): List? + + protected open fun getOptions( + mavenProject: MavenProject, + enabledCompilerPlugins: List, + compilerPluginOptions: List + ): List? = getOptions(enabledCompilerPlugins, compilerPluginOptions) +} + +// MODULE: main(lib) +// FILE: sam.kt + +class SamWithReceiverMavenProjectImportHandler : AbstractMavenImportHandler() { + override fun getOptions(enabledCompilerPlugins: List, compilerPluginOptions: List): List? { + return null + } +} + +// FILE: main.kt + +fun box(): String { + val result = SamWithReceiverMavenProjectImportHandler() + return result.getOptions(emptyList(), emptyList())?.get(0) ?: "OK" +} 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 d9759abce7d..a11c9f8ca38 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 @@ -15662,6 +15662,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fir/noSymbolForIntRangeIterator.kt"); } + @Test + @TestMetadata("SamWithReceiverMavenProjectImportHandler.kt") + public void testSamWithReceiverMavenProjectImportHandler() throws Exception { + runTest("compiler/testData/codegen/box/fir/SamWithReceiverMavenProjectImportHandler.kt"); + } + @Test @TestMetadata("SuspendExtension.kt") public void testSuspendExtension() throws Exception {