diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/extensions/IrBodyFiller.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/extensions/IrBodyFiller.kt index a20e5ff71b..66ff2c9a57 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/extensions/IrBodyFiller.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/extensions/IrBodyFiller.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlinx.dataframe.plugin.extensions -import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import org.jetbrains.kotlin.backend.common.FileLoweringPass @@ -18,8 +17,10 @@ import org.jetbrains.kotlin.ir.backend.js.utils.valueArguments import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin +import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment +import org.jetbrains.kotlin.ir.declarations.IrPackageFragment import org.jetbrains.kotlin.ir.declarations.IrProperty import org.jetbrains.kotlin.ir.declarations.copyAttributes import org.jetbrains.kotlin.ir.declarations.createBlockBody @@ -175,8 +176,9 @@ private class DataFrameFileLowering(val context: IrPluginContext) : FileLowering val constructors = context.referenceConstructors(ClassId(FqName("kotlin.jvm"), Name.identifier("JvmName"))) val jvmName = constructors.single { it.owner.valueParameters.size == 1 } - val markerName = ((getter.extensionReceiverParameter!!.type as IrSimpleType).arguments.single() as IrSimpleType).classFqName?.shortName()!! - val jvmNameArg = "${markerName.identifier}_${declaration.name.identifier}" + val marker = + ((getter.extensionReceiverParameter!!.type as IrSimpleType).arguments.single() as IrSimpleType).classOrFail.owner + val jvmNameArg = "${marker.nestedName()}_${declaration.name.identifier}" getter.annotations = listOf( IrConstructorCallImpl(-1, -1, jvmName.owner.returnType, jvmName, 0, 0, 1) .also { @@ -218,6 +220,21 @@ private class DataFrameFileLowering(val context: IrPluginContext) : FileLowering return declaration } + private fun IrDeclarationWithName.nestedName() = buildString { computeNestedName(this@nestedName, this) } + + private fun computeNestedName(declaration: IrDeclarationWithName, result: StringBuilder): Boolean { + when (val parent = declaration.parent) { + is IrClass -> { + if (!computeNestedName(parent, result)) return false + } + is IrPackageFragment -> {} + else -> return false + } + if (result.isNotEmpty()) result.append('_') + result.append(declaration.name.asString()) + return true + } + @OptIn(UnsafeDuringIrConstructionAPI::class) override fun visitErrorCallExpression(expression: IrErrorCallExpression): IrExpression { val origin = (expression.type.classifierOrNull?.owner as? IrClass)?.origin ?: return expression diff --git a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/interpret.kt b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/interpret.kt index 71ab5c561a..1dfa551416 100644 --- a/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/interpret.kt +++ b/plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/interpret.kt @@ -148,7 +148,7 @@ fun KotlinTypeFacade.interpret( val interpreter = expression.loadInterpreter() if (interpreter == null) { // if the plugin already transformed call, its original form is the last expression of .let { } - val argument = expression.arguments[0] + val argument = expression.arguments.getOrNull(0) val last = (argument as? FirAnonymousFunctionExpression)?.anonymousFunction?.body?.statements?.lastOrNull() val call = (last as? FirReturnExpression)?.result as? FirFunctionCall call?.loadInterpreter()?.let { diff --git a/plugins/kotlin-dataframe/testData/box/duplicatedSignature1.kt b/plugins/kotlin-dataframe/testData/box/duplicatedSignature1.kt new file mode 100644 index 0000000000..e540580374 --- /dev/null +++ b/plugins/kotlin-dataframe/testData/box/duplicatedSignature1.kt @@ -0,0 +1,47 @@ +package dataframe + +import org.jetbrains.kotlinx.dataframe.* +import org.jetbrains.kotlinx.dataframe.columns.* +import org.jetbrains.kotlinx.dataframe.annotations.* +import org.jetbrains.kotlinx.dataframe.api.* +import org.jetbrains.kotlinx.dataframe.io.* + +@DataSchema +data class MyRecordModifiedStep2( + val group: Group, + val str: kotlin.String +) { + @DataSchema + data class Group( + val a: kotlin.String, + val length: kotlin.Int + ) +} + +@DataSchema +data class MyRecordModified( + val group: Group +) { + @DataSchema + data class Group( + val a: kotlin.String, + val length: kotlin.Int + ) +} + +@DataSchema +data class Group1( + val a: kotlin.String, +) + +@DataSchema +data class Group2( + val a: kotlin.String, +) + +fun box(): String { + val df = dataFrameOf(MyRecordModified(MyRecordModified.Group("a", 123))) + // need to trigger JVM classloading so duplicated signature error can appear + df.group.a + return "OK" +} diff --git a/plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java b/plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java index f28e3348b8..ffcdd2a659 100644 --- a/plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java +++ b/plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java @@ -124,6 +124,12 @@ public void testDuplicatedSignature() { runTest("testData/box/duplicatedSignature.kt"); } + @Test + @TestMetadata("duplicatedSignature1.kt") + public void testDuplicatedSignature1() { + runTest("testData/box/duplicatedSignature1.kt"); + } + @Test @TestMetadata("explode.kt") public void testExplode() {