From ef4ef8c9306df5e8464538e9a6398a4da1cef095 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Wed, 24 Nov 2021 18:35:59 +0300 Subject: [PATCH] [JS IR] switch to the IC Ir2Js and fix tests --- .../js/export/ExportModelToJsStatements.kt | 2 +- .../transformers/irToJs/JsNameLinkingNamer.kt | 25 +++++++++++++------ .../irToJs/resolveTemporaryNames.kt | 15 ----------- .../kotlin/js/test/ir/AbstractJsIrTest.kt | 2 +- .../classLikeMemberClassMangling.kt | 11 +++++--- .../box/jsName/jsNamePropertyAccessors.kt | 1 - .../selectiveExport/selectiveExport.d.ts | 8 +++--- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/export/ExportModelToJsStatements.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/export/ExportModelToJsStatements.kt index 8102d85f6e3..04cd437fc0b 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/export/ExportModelToJsStatements.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/export/ExportModelToJsStatements.kt @@ -101,7 +101,7 @@ class ExportModelToJsStatements( val newNameSpace = if (namespace != null) jsElementAccess(declaration.name, namespace) else - JsNameRef(Namer.PROTOTYPE_NAME, declaration.name) + JsNameRef(Namer.PROTOTYPE_NAME, namer.getNameForClass(declaration.ir).makeRef()) val name = namer.getNameForStaticDeclaration(declaration.ir) val klassExport = if (esModules) { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt index 9b98b26a1bd..9a980fb4cd2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsNameLinkingNamer.kt @@ -33,7 +33,7 @@ class JsNameLinkingNamer(private val context: JsIrBackendContext) : IrNamerBase( val jsModule: String? = declaration.getJsModule() val maybeParentFile: IrFile? = declaration.parent as? IrFile val fileJsModule: String? = maybeParentFile?.getJsModule() - val jsQualifier: String? = maybeParentFile?.getJsQualifier() + val jsQualifier: List? = maybeParentFile?.getJsQualifier()?.split('.')?.map { JsName(it, false) } when { jsModule != null -> { @@ -44,19 +44,22 @@ class JsNameLinkingNamer(private val context: JsIrBackendContext) : IrNamerBase( fileJsModule != null -> { if (declaration !in nameMap) { - val moduleName = JsName("\$module\$$jsModule", true) + val moduleName = JsName(sanitizeName("\$module\$$fileJsModule"), true) importedModules += JsImportedModule(fileJsModule, moduleName, null) val qualifiedReference = - if (jsQualifier == null) moduleName.makeRef() else JsNameRef(jsQualifier, moduleName.makeRef()) - imports[declaration] = JsNameRef(declaration.getJsNameOrKotlinName().identifier, qualifiedReference) + if (jsQualifier == null) moduleName.makeRef() else (listOf(moduleName) + jsQualifier).makeRef() + imports[declaration] = jsElementAccess(declaration.getJsNameOrKotlinName().identifier, qualifiedReference) return declaration.getName() } } else -> { - var name = declaration.getJsNameOrKotlinName().identifier - if (jsQualifier != null) - name = "$jsQualifier.$name" + val name = declaration.getJsNameOrKotlinName().identifier + + if (jsQualifier != null) { + imports[declaration] = jsElementAccess(name, jsQualifier.makeRef()) + return declaration.getName() + } return name.toJsName(temporary = false) } @@ -117,4 +120,12 @@ private fun IrField.safeName(): String { return sanitizeName(name.asString()).let { if (it.lastOrNull()!!.isDigit()) it + "_" else it // Avoid name clashes } +} + +private fun List.makeRef(): JsNameRef { + var result = this[0].makeRef() + for (i in 1 until this.size) { + result = JsNameRef(this[i], result) + } + return result } \ No newline at end of file diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/resolveTemporaryNames.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/resolveTemporaryNames.kt index 9cac3c9e9ac..10610b3ea2e 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/resolveTemporaryNames.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/resolveTemporaryNames.kt @@ -8,21 +8,6 @@ package org.jetbrains.kotlin.ir.backend.js.transformers.irToJs import org.jetbrains.kotlin.js.backend.ast.* fun JsNode.resolveTemporaryNames() { - object : JsVisitorWithContextImpl() { - override fun endVisit(x: JsNameRef, ctx: JsContext) { - x.name?.ident?.let { - if (it.contains('.')) { - val parts = it.split('.').map { JsName(it, false) } - var result = JsNameRef(parts[0]) - for (i in 1 until parts.size) { - result = JsNameRef(parts[i], result) - } - ctx.replaceMe(result) - } - } - } - }.accept(this) - val renamings = resolveNames() accept(object : RecursiveJsVisitor() { override fun visitElement(node: JsNode) { diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrTest.kt index 6eb3315c118..8dd9e920fab 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/AbstractJsIrTest.kt @@ -57,7 +57,7 @@ abstract class AbstractJsIrTest( if (getBoolean("kotlin.js.ir.klibMainModule")) +JsEnvironmentConfigurationDirectives.KLIB_MAIN_MODULE if (getBoolean("kotlin.js.ir.perModule")) +JsEnvironmentConfigurationDirectives.PER_MODULE if (getBoolean("kotlin.js.ir.dce", true)) +JsEnvironmentConfigurationDirectives.RUN_IR_DCE - if (getBoolean("kotlin.js.ir.newIr2Js", false)) +JsEnvironmentConfigurationDirectives.RUN_NEW_IR_2_JS + if (getBoolean("kotlin.js.ir.newIr2Js", true)) +JsEnvironmentConfigurationDirectives.RUN_NEW_IR_2_JS -JsEnvironmentConfigurationDirectives.GENERATE_NODE_JS_RUNNER } diff --git a/js/js.translator/testData/box/escapedIdentifiers/classLikeMemberClassMangling.kt b/js/js.translator/testData/box/escapedIdentifiers/classLikeMemberClassMangling.kt index 7a5211b1826..0a1f14baca2 100644 --- a/js/js.translator/testData/box/escapedIdentifiers/classLikeMemberClassMangling.kt +++ b/js/js.translator/testData/box/escapedIdentifiers/classLikeMemberClassMangling.kt @@ -16,8 +16,13 @@ fun box(): String { // DCE preventing val b = B() - assertEquals("function", js("typeof A['\$invalid inner']")) - assertEquals(js("undefined"), js("B['\$invalid inner']")) + val aCtor = A::class.js.asDynamic() + val bCtor = B::class.js.asDynamic() + + assertEquals("function", typeOf(aCtor["\$invalid inner"])) + assertEquals(js("undefined"), bCtor["\$invalid inner"]) return "OK" -} \ No newline at end of file +} + +private fun typeOf(t: Any): String = js("typeof t") \ No newline at end of file diff --git a/js/js.translator/testData/box/jsName/jsNamePropertyAccessors.kt b/js/js.translator/testData/box/jsName/jsNamePropertyAccessors.kt index c7c100eb248..9d88c81778d 100644 --- a/js/js.translator/testData/box/jsName/jsNamePropertyAccessors.kt +++ b/js/js.translator/testData/box/jsName/jsNamePropertyAccessors.kt @@ -1,5 +1,4 @@ // EXPECTED_REACHABLE_NODES: 1285 -// IGNORE_BACKEND: JS_IR // IGNORE_BACKEND: JS_IR_ES6 package foo diff --git a/js/js.translator/testData/typescript-export/selectiveExport/selectiveExport.d.ts b/js/js.translator/testData/typescript-export/selectiveExport/selectiveExport.d.ts index b9aa7a96863..6e754caae0f 100644 --- a/js/js.translator/testData/typescript-export/selectiveExport/selectiveExport.d.ts +++ b/js/js.translator/testData/typescript-export/selectiveExport/selectiveExport.d.ts @@ -6,10 +6,6 @@ declare namespace JS_TESTS { interface ExportedInternalInterface { } } - namespace foo { - interface FileLevelExportedExternalInterface { - } - } namespace foo { const exportedVal: number; function exportedFun(): number; @@ -18,6 +14,10 @@ declare namespace JS_TESTS { get value(): number; } } + namespace foo { + interface FileLevelExportedExternalInterface { + } + } namespace foo { const fileLevelExportedVal: number; function fileLevelExportedFun(): number;