From 606232a5849914286d91873efe514e909e52947a Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Fri, 28 Aug 2020 02:02:00 +0300 Subject: [PATCH] [JS IR] Don't generate "import" statements for external interfaces #KT-40964 fixed --- .../irToJs/IrModuleToJsTransformer.kt | 12 ++--- .../semantics/IrBoxJsES6TestGenerated.java | 10 ++++ .../ir/semantics/IrBoxJsTestGenerated.java | 10 ++++ .../js/test/semantics/BoxJsTestGenerated.java | 10 ++++ .../testData/box/jsModule/interfaces.kt | 49 +++++++++++++++++++ .../testData/box/jsQualifier/interfaces.kt | 43 ++++++++++++++++ 6 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 js/js.translator/testData/box/jsModule/interfaces.kt create mode 100644 js/js.translator/testData/box/jsQualifier/interfaces.kt diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt index d5db898517a..386ead86929 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformer.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -15,11 +15,10 @@ import org.jetbrains.kotlin.ir.backend.js.export.ExportedModule import org.jetbrains.kotlin.ir.backend.js.export.toTypeScript import org.jetbrains.kotlin.ir.backend.js.lower.StaticMembersLowering import org.jetbrains.kotlin.ir.backend.js.utils.* -import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName -import org.jetbrains.kotlin.ir.declarations.IrModuleFragment -import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction -import org.jetbrains.kotlin.ir.declarations.path +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.symbols.IrClassSymbol +import org.jetbrains.kotlin.ir.util.isEffectivelyExternal +import org.jetbrains.kotlin.ir.util.isInterface import org.jetbrains.kotlin.js.backend.ast.* import org.jetbrains.kotlin.js.config.JSConfigurationKeys import org.jetbrains.kotlin.utils.DFS @@ -358,6 +357,7 @@ class IrModuleToJsTransformer( file.declarations .asSequence() .filterIsInstance() + .filter { !(it is IrClass && it.isInterface && it.isEffectivelyExternal()) } .forEach { declaration -> val declName = getNameForExternalDeclaration(declaration) importStatements.add( @@ -417,4 +417,4 @@ class IrModuleToJsTransformer( this += statements endRegion() } -} \ No newline at end of file +} diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java index 24b5fc84e2a..62ef9dba945 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java @@ -5232,6 +5232,11 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test { runTest("js/js.translator/testData/box/jsModule/importCountUmd.kt"); } + @TestMetadata("interfaces.kt") + public void testInterfaces() throws Exception { + runTest("js/js.translator/testData/box/jsModule/interfaces.kt"); + } + @TestMetadata("topLevelVarargFun.kt") public void testTopLevelVarargFun() throws Exception { runTest("js/js.translator/testData/box/jsModule/topLevelVarargFun.kt"); @@ -5333,6 +5338,11 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test { runTest("js/js.translator/testData/box/jsQualifier/classes.kt"); } + @TestMetadata("interfaces.kt") + public void testInterfaces() throws Exception { + runTest("js/js.translator/testData/box/jsQualifier/interfaces.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("js/js.translator/testData/box/jsQualifier/simple.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java index 4b8fa3addbe..7b72d121ae4 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java @@ -5232,6 +5232,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/jsModule/importCountUmd.kt"); } + @TestMetadata("interfaces.kt") + public void testInterfaces() throws Exception { + runTest("js/js.translator/testData/box/jsModule/interfaces.kt"); + } + @TestMetadata("topLevelVarargFun.kt") public void testTopLevelVarargFun() throws Exception { runTest("js/js.translator/testData/box/jsModule/topLevelVarargFun.kt"); @@ -5333,6 +5338,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/jsQualifier/classes.kt"); } + @TestMetadata("interfaces.kt") + public void testInterfaces() throws Exception { + runTest("js/js.translator/testData/box/jsQualifier/interfaces.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("js/js.translator/testData/box/jsQualifier/simple.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 539c5c72fd0..88db12468f9 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -5247,6 +5247,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/jsModule/importCountUmd.kt"); } + @TestMetadata("interfaces.kt") + public void testInterfaces() throws Exception { + runTest("js/js.translator/testData/box/jsModule/interfaces.kt"); + } + @TestMetadata("topLevelVarargFun.kt") public void testTopLevelVarargFun() throws Exception { runTest("js/js.translator/testData/box/jsModule/topLevelVarargFun.kt"); @@ -5348,6 +5353,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/jsQualifier/classes.kt"); } + @TestMetadata("interfaces.kt") + public void testInterfaces() throws Exception { + runTest("js/js.translator/testData/box/jsQualifier/interfaces.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("js/js.translator/testData/box/jsQualifier/simple.kt"); diff --git a/js/js.translator/testData/box/jsModule/interfaces.kt b/js/js.translator/testData/box/jsModule/interfaces.kt new file mode 100644 index 00000000000..80d65cd7fe6 --- /dev/null +++ b/js/js.translator/testData/box/jsModule/interfaces.kt @@ -0,0 +1,49 @@ +// EXPECTED_REACHABLE_NODES: 1238 +// MODULE_KIND: COMMON_JS +// FILE: bar.kt +@file:JsModule("lib") +@file:JsQualifier("foo") +package foo + +external interface Bar { + fun ping(): String +} + +// FILE: baz.kt +@file:JsModule("lib") +package boo + +external interface Baz { + fun pong(): Int +} + +// FILE: root.kt +@file:JsModule("lib") +import foo.Bar +import boo.Baz + +external val bar: Bar +external val baz: Baz + +// FILE: test.kt +fun box(): String { + if (bar.ping() != "ping" || baz.pong() != 194) return "Fail" + + return "OK" +} + +// FILE: test.js +$kotlin_test_internal$.beginModule(); +module.exports = { + bar : { + ping() { + return "ping" + } + }, + baz : { + pong() { + return 194 + } + } +}; +$kotlin_test_internal$.endModule("lib"); diff --git a/js/js.translator/testData/box/jsQualifier/interfaces.kt b/js/js.translator/testData/box/jsQualifier/interfaces.kt new file mode 100644 index 00000000000..1607ab159cb --- /dev/null +++ b/js/js.translator/testData/box/jsQualifier/interfaces.kt @@ -0,0 +1,43 @@ +// EXPECTED_REACHABLE_NODES: 1238 +// FILE: bar.kt +@file:JsQualifier("foo") +package foo + +external interface Bar { + fun ping(): String +} + +// FILE: baz.kt +package boo + +external interface Baz { + fun pong(): Int +} + +// FILE: root.kt +import foo.Bar +import boo.Baz + +external val bar: Bar +external val baz: Baz + +// FILE: test.kt +fun box(): String { + if (bar.ping() != "ping" || baz.pong() != 194) return "Fail" + + return "OK" +} + +// FILE: test.js + +var bar = { + ping() { + return "ping" + } +}; + +var baz = { + pong() { + return 194 + } +};