Skip to content

Commit feb491b

Browse files
authored
Merge pull request #868 from Kotlin/fix-duplicated-jvm-signature
Fix duplicated jvm signature
2 parents 90220d5 + 8517321 commit feb491b

File tree

4 files changed

+74
-4
lines changed

4 files changed

+74
-4
lines changed

plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/extensions/IrBodyFiller.kt

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
package org.jetbrains.kotlinx.dataframe.plugin.extensions
77

8-
import kotlinx.serialization.decodeFromString
98
import kotlinx.serialization.encodeToString
109
import kotlinx.serialization.json.Json
1110
import org.jetbrains.kotlin.backend.common.FileLoweringPass
@@ -18,8 +17,10 @@ import org.jetbrains.kotlin.ir.backend.js.utils.valueArguments
1817
import org.jetbrains.kotlin.ir.declarations.IrClass
1918
import org.jetbrains.kotlin.ir.declarations.IrConstructor
2019
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
20+
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName
2121
import org.jetbrains.kotlin.ir.declarations.IrFile
2222
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
23+
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
2324
import org.jetbrains.kotlin.ir.declarations.IrProperty
2425
import org.jetbrains.kotlin.ir.declarations.copyAttributes
2526
import org.jetbrains.kotlin.ir.declarations.createBlockBody
@@ -175,8 +176,9 @@ private class DataFrameFileLowering(val context: IrPluginContext) : FileLowering
175176

176177
val constructors = context.referenceConstructors(ClassId(FqName("kotlin.jvm"), Name.identifier("JvmName")))
177178
val jvmName = constructors.single { it.owner.valueParameters.size == 1 }
178-
val markerName = ((getter.extensionReceiverParameter!!.type as IrSimpleType).arguments.single() as IrSimpleType).classFqName?.shortName()!!
179-
val jvmNameArg = "${markerName.identifier}_${declaration.name.identifier}"
179+
val marker =
180+
((getter.extensionReceiverParameter!!.type as IrSimpleType).arguments.single() as IrSimpleType).classOrFail.owner
181+
val jvmNameArg = "${marker.nestedName()}_${declaration.name.identifier}"
180182
getter.annotations = listOf(
181183
IrConstructorCallImpl(-1, -1, jvmName.owner.returnType, jvmName, 0, 0, 1)
182184
.also {
@@ -218,6 +220,21 @@ private class DataFrameFileLowering(val context: IrPluginContext) : FileLowering
218220
return declaration
219221
}
220222

223+
private fun IrDeclarationWithName.nestedName() = buildString { computeNestedName(this@nestedName, this) }
224+
225+
private fun computeNestedName(declaration: IrDeclarationWithName, result: StringBuilder): Boolean {
226+
when (val parent = declaration.parent) {
227+
is IrClass -> {
228+
if (!computeNestedName(parent, result)) return false
229+
}
230+
is IrPackageFragment -> {}
231+
else -> return false
232+
}
233+
if (result.isNotEmpty()) result.append('_')
234+
result.append(declaration.name.asString())
235+
return true
236+
}
237+
221238
@OptIn(UnsafeDuringIrConstructionAPI::class)
222239
override fun visitErrorCallExpression(expression: IrErrorCallExpression): IrExpression {
223240
val origin = (expression.type.classifierOrNull?.owner as? IrClass)?.origin ?: return expression

plugins/kotlin-dataframe/src/org/jetbrains/kotlinx/dataframe/plugin/interpret.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ fun <T> KotlinTypeFacade.interpret(
148148
val interpreter = expression.loadInterpreter()
149149
if (interpreter == null) {
150150
// if the plugin already transformed call, its original form is the last expression of .let { }
151-
val argument = expression.arguments[0]
151+
val argument = expression.arguments.getOrNull(0)
152152
val last = (argument as? FirAnonymousFunctionExpression)?.anonymousFunction?.body?.statements?.lastOrNull()
153153
val call = (last as? FirReturnExpression)?.result as? FirFunctionCall
154154
call?.loadInterpreter()?.let {
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package dataframe
2+
3+
import org.jetbrains.kotlinx.dataframe.*
4+
import org.jetbrains.kotlinx.dataframe.columns.*
5+
import org.jetbrains.kotlinx.dataframe.annotations.*
6+
import org.jetbrains.kotlinx.dataframe.api.*
7+
import org.jetbrains.kotlinx.dataframe.io.*
8+
9+
@DataSchema
10+
data class MyRecordModifiedStep2(
11+
val group: Group,
12+
val str: kotlin.String
13+
) {
14+
@DataSchema
15+
data class Group(
16+
val a: kotlin.String,
17+
val length: kotlin.Int
18+
)
19+
}
20+
21+
@DataSchema
22+
data class MyRecordModified(
23+
val group: Group
24+
) {
25+
@DataSchema
26+
data class Group(
27+
val a: kotlin.String,
28+
val length: kotlin.Int
29+
)
30+
}
31+
32+
@DataSchema
33+
data class Group1(
34+
val a: kotlin.String,
35+
)
36+
37+
@DataSchema
38+
data class Group2(
39+
val a: kotlin.String,
40+
)
41+
42+
fun box(): String {
43+
val df = dataFrameOf(MyRecordModified(MyRecordModified.Group("a", 123)))
44+
// need to trigger JVM classloading so duplicated signature error can appear
45+
df.group.a
46+
return "OK"
47+
}

plugins/kotlin-dataframe/tests-gen/org/jetbrains/kotlin/fir/dataframe/DataFrameBlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ public void testDuplicatedSignature() {
124124
runTest("testData/box/duplicatedSignature.kt");
125125
}
126126

127+
@Test
128+
@TestMetadata("duplicatedSignature1.kt")
129+
public void testDuplicatedSignature1() {
130+
runTest("testData/box/duplicatedSignature1.kt");
131+
}
132+
127133
@Test
128134
@TestMetadata("explode.kt")
129135
public void testExplode() {

0 commit comments

Comments
 (0)