From 1b631da3a0739fdc2c2713e2983bc481891cb72a Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Tue, 28 Dec 2021 13:44:05 +0300 Subject: [PATCH] [JS IC] fix cross-module nested class references and interface inheritance ^ KT-50528 fixed --- .../kotlin/ir/backend/js/compilerWithIC.kt | 2 +- .../irToJs/IrModuleToJsTransformerTmp.kt | 8 ++++-- .../transformers/irToJs/JsClassGenerator.kt | 2 +- .../kotlin/js/test/BoxJsTestGenerated.java | 12 +++++++++ .../js/test/ir/IrBoxJsTestGenerated.java | 12 +++++++++ .../interfaceInheritanceCrossModule.kt | 27 +++++++++++++++++++ .../incremental/nestedClassesInDependency.kt | 15 +++++++++++ 7 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 js/js.translator/testData/box/incremental/interfaceInheritanceCrossModule.kt create mode 100644 js/js.translator/testData/box/incremental/nestedClassesInDependency.kt diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compilerWithIC.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compilerWithIC.kt index 9a91ec158b2..c3a2968f415 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compilerWithIC.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compilerWithIC.kt @@ -99,7 +99,7 @@ fun compileWithIC( module.files.filter { it.fileEntry.name in dirties } } ?: module.files - val ast = transformer.generateBinaryAst(dirtyFiles) + val ast = transformer.generateBinaryAst(dirtyFiles, allModules) ast.entries.forEach { (path, bytes) -> cacheConsumer.commitBinaryAst(path, bytes) } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformerTmp.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformerTmp.kt index 1bff8b0175a..1756a7e2a0d 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformerTmp.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/IrModuleToJsTransformerTmp.kt @@ -104,14 +104,18 @@ class IrModuleToJsTransformerTmp( return CompilerResult(result, dts) } - fun generateBinaryAst(files: Iterable): Map { + fun generateBinaryAst(files: Iterable, allModules: Iterable): Map { val exportModelGenerator = ExportModelGenerator(backendContext, generateNamespacesForPackages = true) val exportData = files.associate { file -> file to exportModelGenerator.generateExportWithExternals(file) } - files.forEach { StaticMembersLowering(backendContext).lower(it) } + allModules.forEach { + it.files.forEach { + StaticMembersLowering(backendContext).lower(it) + } + } val serializer = JsIrAstSerializer() diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt index e14788747f4..e9e9baeb833 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt @@ -301,7 +301,7 @@ class JsClassGenerator(private val irClass: IrClass, val context: JsGenerationCo ?.let { val implClassDeclaration = it.parent as IrClass - if (implClassDeclaration.shouldCopyFrom() && it.body != null) { + if (implClassDeclaration.shouldCopyFrom()) { val reference = context.getNameForStaticDeclaration(it).makeRef() classModel.postDeclarationBlock.statements += jsAssignment(memberRef, reference).makeStmt() if (isFakeOverride) { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java index f972544fcc4..ce6d51c3fb7 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java @@ -4210,6 +4210,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/incremental/inlineSuspendFun.kt"); } + @Test + @TestMetadata("interfaceInheritanceCrossModule.kt") + public void testInterfaceInheritanceCrossModule() throws Exception { + runTest("js/js.translator/testData/box/incremental/interfaceInheritanceCrossModule.kt"); + } + @Test @TestMetadata("jsModule.kt") public void testJsModule() throws Exception { @@ -4228,6 +4234,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/incremental/multipleReimport.kt"); } + @Test + @TestMetadata("nestedClassesInDependency.kt") + public void testNestedClassesInDependency() throws Exception { + runTest("js/js.translator/testData/box/incremental/nestedClassesInDependency.kt"); + } + @Test @TestMetadata("packagesWithSameName.kt") public void testPackagesWithSameName() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java index 4c689bbfc4c..01efaa5e10d 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java @@ -4582,6 +4582,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/incremental/inlineSuspendFun.kt"); } + @Test + @TestMetadata("interfaceInheritanceCrossModule.kt") + public void testInterfaceInheritanceCrossModule() throws Exception { + runTest("js/js.translator/testData/box/incremental/interfaceInheritanceCrossModule.kt"); + } + @Test @TestMetadata("jsModule.kt") public void testJsModule() throws Exception { @@ -4600,6 +4606,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/incremental/multipleReimport.kt"); } + @Test + @TestMetadata("nestedClassesInDependency.kt") + public void testNestedClassesInDependency() throws Exception { + runTest("js/js.translator/testData/box/incremental/nestedClassesInDependency.kt"); + } + @Test @TestMetadata("packagesWithSameName.kt") public void testPackagesWithSameName() throws Exception { diff --git a/js/js.translator/testData/box/incremental/interfaceInheritanceCrossModule.kt b/js/js.translator/testData/box/incremental/interfaceInheritanceCrossModule.kt new file mode 100644 index 00000000000..a012996fe83 --- /dev/null +++ b/js/js.translator/testData/box/incremental/interfaceInheritanceCrossModule.kt @@ -0,0 +1,27 @@ +// NO_COMMON_FILES +// MODULE: lib +// FILE: lib.kt + +package lib + +interface A { + fun foo() = 23 +} + +// MODULE: main(lib) +// FILE: main.kt +// RECOMPILE + +package main + +import lib.A + +class B : A { + fun bar() = foo() + 1 +} + +fun box(): String { + val result = B().bar() + if (result != 24) return "fail: $result" + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/box/incremental/nestedClassesInDependency.kt b/js/js.translator/testData/box/incremental/nestedClassesInDependency.kt new file mode 100644 index 00000000000..278ac67b728 --- /dev/null +++ b/js/js.translator/testData/box/incremental/nestedClassesInDependency.kt @@ -0,0 +1,15 @@ +// NO_COMMON_FILES +// MODULE: lib +// FILE: lib.kt + +class A { + class B(val msg: String) + + fun foo(b: B) = b.msg +} + +// MODULE: main(lib) +// FILE: main.kt +// RECOMPILE + +fun box() = A().foo(A.B("OK")) \ No newline at end of file