[JS IR] Avoid name clashes for @JsQualifier-annotated declarations

#KT-42039 Fixed
This commit is contained in:
Sergej Jaskiewicz
2021-09-03 17:00:10 +03:00
committed by TeamCityServer
parent 681ff2dcec
commit 2f07589b42
6 changed files with 42 additions and 9 deletions
@@ -6,13 +6,8 @@
package org.jetbrains.kotlin.ir.backend.js.utils
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
import org.jetbrains.kotlin.ir.util.isPropertyAccessor
import org.jetbrains.kotlin.ir.util.isPropertyField
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.utils.addIfNotNull
@@ -76,14 +71,14 @@ class StableNamesCollector : IrElementVisitorVoid {
val importedFromModuleOnly = declaration.isImportedFromModuleOnly()
val jsName = declaration.getJsName()
val jsQualifier = declaration.getJsQualifier()
val jsQualifier = declaration.fileOrNull?.getJsQualifier()
return when {
importedFromModuleOnly ->
null
jsQualifier != null ->
jsQualifier.split('1')[0]
jsQualifier.substringBefore('.')
jsName != null ->
jsName
@@ -6061,6 +6061,11 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test {
runTest("js/js.translator/testData/box/nameClashes/jsNameAndPrivate.kt");
}
@TestMetadata("jsQualifier.kt")
public void testJsQualifier() throws Exception {
runTest("js/js.translator/testData/box/nameClashes/jsQualifier.kt");
}
@TestMetadata("localFunctionInLambda.kt")
public void testLocalFunctionInLambda() throws Exception {
runTest("js/js.translator/testData/box/nameClashes/localFunctionInLambda.kt");
@@ -6061,6 +6061,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
runTest("js/js.translator/testData/box/nameClashes/jsNameAndPrivate.kt");
}
@TestMetadata("jsQualifier.kt")
public void testJsQualifier() throws Exception {
runTest("js/js.translator/testData/box/nameClashes/jsQualifier.kt");
}
@TestMetadata("localFunctionInLambda.kt")
public void testLocalFunctionInLambda() throws Exception {
runTest("js/js.translator/testData/box/nameClashes/localFunctionInLambda.kt");
@@ -6071,6 +6071,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
runTest("js/js.translator/testData/box/nameClashes/jsNameAndPrivate.kt");
}
@TestMetadata("jsQualifier.kt")
public void testJsQualifier() throws Exception {
runTest("js/js.translator/testData/box/nameClashes/jsQualifier.kt");
}
@TestMetadata("localFunctionInLambda.kt")
public void testLocalFunctionInLambda() throws Exception {
runTest("js/js.translator/testData/box/nameClashes/localFunctionInLambda.kt");
@@ -0,0 +1,7 @@
var chopchop = {
foo: {
ok: function () {
return 'OK';
},
}
};
@@ -0,0 +1,16 @@
// MODULE: lib
// FILE: lib.kt
@file:JsQualifier("chopchop.foo")
external fun ok(): String
// MODULE: lib2
// FILE: lib2.kt
@JsExport
fun chopchop() {}
// MODULE: main(lib, lib2)
// FILE: main.kt
fun box() = ok()