Skip to content

Fix duplicated jvm signature #868

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Sep 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ fun <T> 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 {
Expand Down
47 changes: 47 additions & 0 deletions plugins/kotlin-dataframe/testData/box/duplicatedSignature1.kt
Original file line number Diff line number Diff line change
@@ -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"
}
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Loading