Skip to content

Commit 1846bb6

Browse files
JSMonkSpace Team
authored andcommitted
[K/JS, K/Wasm] Allow annotating declarations with @JsQualifier
^KT-79928 Fixed
1 parent 8f98190 commit 1846bb6

32 files changed

+796
-7
lines changed

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ class JsNameLinkingNamer(
4343
val jsModule: String? = declaration.getJsModule()
4444
val maybeParentFile: IrFile? = declaration.parent as? IrFile
4545
val fileJsModule: String? = maybeParentFile?.getJsModule()
46-
val jsQualifier: List<JsName>? = maybeParentFile?.getJsQualifier()?.split('.')?.map { JsName(it, false) }
46+
val jsQualifier: List<JsName>? = (declaration.getJsQualifier() ?: maybeParentFile?.getJsQualifier())
47+
?.split('.')?.map { JsName(it, false) }
4748

4849
return when {
4950
jsModule != null -> declaration.generateImportForDeclarationWithJsModule(jsModule)

compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrJsUtils.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ fun IrConstructor.hasStrictSignature(context: JsIrBackendContext): Boolean {
7171
}
7272
}
7373

74-
private fun getKotlinOrJsQualifier(parent: IrPackageFragment, shouldIncludePackage: Boolean): FqName? {
75-
return (parent as? IrFile)?.getJsQualifier()?.let { FqName(it) } ?: parent.packageFqName.takeIf { shouldIncludePackage }
74+
private fun IrDeclaration.getKotlinOrJsQualifier(parent: IrPackageFragment, shouldIncludePackage: Boolean): FqName? {
75+
return (getJsQualifier() ?: (parent as? IrFile)?.getJsQualifier())
76+
?.let { FqName(it) } ?: parent.packageFqName.takeIf { shouldIncludePackage }
7677
}
7778

7879
val IrClass.isInstantiableEnum: Boolean

compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/ComplexExternalDeclarationsToTopLevelFunctionsLowering.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ class ComplexExternalDeclarationsToTopLevelFunctionsLowering(val context: WasmBa
440440
private fun referenceTopLevelExternalDeclaration(declaration: IrDeclarationWithName): String {
441441
var name: String? = declaration.getJsNameOrKotlinName().identifier
442442

443-
val qualifier = currentFile.getJsQualifier()
443+
val qualifier = declaration.getJsQualifier() ?: currentFile.getJsQualifier()
444444

445445
val module = currentFile.getJsModule()
446446
?: declaration.getJsModule()?.also {
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// ES_MODULES
2+
// FILE: jsModuleWithQualifier.mjs
3+
let a = {
4+
b: {
5+
c: {
6+
d: {
7+
x: 10,
8+
f() { return 10; },
9+
C: class C {
10+
constructor(x) {
11+
this.x = x;
12+
}
13+
}
14+
}
15+
}
16+
}
17+
};
18+
19+
export { a };
20+
21+
// FILE: lib1.kt
22+
@file:JsModule("./jsModuleWithQualifier.mjs")
23+
24+
package abcd
25+
26+
@JsQualifier("a.b.c.d")
27+
external var x: Int
28+
29+
@JsQualifier("a.b.c.d")
30+
external fun f(): Int
31+
32+
@JsQualifier("a.b.c.d")
33+
external class C {
34+
constructor(x: String)
35+
val x: String
36+
}
37+
38+
@JsName("x")
39+
@JsQualifier("a.b.c.d")
40+
external var x2: Int
41+
42+
@JsName("f")
43+
@JsQualifier("a.b.c.d")
44+
external fun f2(): Int
45+
46+
@JsName("C")
47+
@JsQualifier("a.b.c.d")
48+
external class C2 {
49+
constructor(x: String)
50+
@JsName("x")
51+
val x2: String
52+
}
53+
54+
// FILE: lib2.kt
55+
@file:JsModule("./jsModuleWithQualifier.mjs")
56+
package a
57+
58+
@JsQualifier("a")
59+
external object b {
60+
class c {
61+
companion object {
62+
@JsName("d")
63+
object d2 {
64+
var x: Int
65+
fun f(): Int
66+
class C {
67+
constructor(x: String)
68+
val x: String
69+
}
70+
71+
@JsName("x")
72+
var x2: Int
73+
74+
@JsName("f")
75+
fun f2(): Int
76+
77+
@JsName("C")
78+
class C2 {
79+
constructor(x: String)
80+
@JsName("x")
81+
val x2: String
82+
}
83+
}
84+
}
85+
}
86+
}
87+
88+
89+
90+
// FILE: main.kt
91+
fun box(): String {
92+
if (abcd.x != 10) return "Fail1"
93+
if (abcd.f() != 10) return "Fail2"
94+
if (abcd.C("10").x != "10") return "Fail3"
95+
96+
if (abcd.x2 != 10) return "Fail4"
97+
if (abcd.f2() != 10) return "Fail5"
98+
if (abcd.C2("10").x2 != "10") return "Fail6"
99+
100+
if (a.b.c.Companion.d2.x != 10) return "Fail7"
101+
if (a.b.c.Companion.d2.f() != 10) return "Fail8"
102+
if (a.b.c.Companion.d2.C("10").x != "10") return "Fail9"
103+
104+
if (a.b.c.Companion.d2.x2 != 10) return "Fail10"
105+
if (a.b.c.Companion.d2.f2() != 10) return "Fail11"
106+
if (a.b.c.Companion.d2.C2("10").x2 != "10") return "Fail12"
107+
108+
return "OK"
109+
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// FILE: jsQualifier.js
2+
let a = {
3+
b: {
4+
c: {
5+
d: {
6+
x: 10,
7+
f() { return 10; },
8+
C: class C {
9+
constructor(x) {
10+
this.x = x;
11+
}
12+
}
13+
}
14+
}
15+
}
16+
};
17+
18+
// FILE: lib1.kt
19+
package abcd
20+
21+
@JsQualifier("a.b.c.d")
22+
external var x: Int
23+
24+
@JsQualifier("a.b.c.d")
25+
external fun f(): Int
26+
27+
@JsQualifier("a.b.c.d")
28+
external class C {
29+
constructor(x: String)
30+
val x: String
31+
}
32+
33+
@JsName("x")
34+
@JsQualifier("a.b.c.d")
35+
external var x2: Int
36+
37+
@JsName("f")
38+
@JsQualifier("a.b.c.d")
39+
external fun f2(): Int
40+
41+
@JsName("C")
42+
@JsQualifier("a.b.c.d")
43+
external class C2 {
44+
constructor(x: String)
45+
@JsName("x")
46+
val x2: String
47+
}
48+
49+
// FILE: lib2.kt
50+
package a
51+
52+
@JsQualifier("a")
53+
external object b {
54+
class c {
55+
companion object {
56+
@JsName("d")
57+
object d2 {
58+
var x: Int
59+
fun f(): Int
60+
class C {
61+
constructor(x: String)
62+
val x: String
63+
}
64+
65+
@JsName("x")
66+
var x2: Int
67+
68+
@JsName("f")
69+
fun f2(): Int
70+
71+
@JsName("C")
72+
class C2 {
73+
constructor(x: String)
74+
@JsName("x")
75+
val x2: String
76+
}
77+
}
78+
}
79+
}
80+
}
81+
82+
83+
// FILE: main.kt
84+
fun box(): String {
85+
if (abcd.x != 10) return "Fail1"
86+
if (abcd.f() != 10) return "Fail2"
87+
if (abcd.C("10").x != "10") return "Fail3"
88+
89+
if (abcd.x2 != 10) return "Fail4"
90+
if (abcd.f2() != 10) return "Fail5"
91+
if (abcd.C2("10").x2 != "10") return "Fail6"
92+
93+
if (a.b.c.Companion.d2.x != 10) return "Fail7"
94+
if (a.b.c.Companion.d2.f() != 10) return "Fail8"
95+
if (a.b.c.Companion.d2.C("10").x != "10") return "Fail9"
96+
97+
if (a.b.c.Companion.d2.x2 != 10) return "Fail10"
98+
if (a.b.c.Companion.d2.f2() != 10) return "Fail11"
99+
if (a.b.c.Companion.d2.C2("10").x2 != "10") return "Fail12"
100+
101+
return "OK"
102+
}

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenWasmJsInteropTestGenerated.java

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenWasmJsInteropWithInlinedFunInKlibTestGenerated.java

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6BoxTestGenerated.java

Lines changed: 59 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsES6CodegenWasmJsInteropTestGenerated.java

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)