From 5bf4540458e5faf77b64a15669f826f915bce0f9 Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Tue, 5 Sep 2017 15:13:50 +0300 Subject: [PATCH] JS: fix inlining of functions derived from other modules See KT-16408 --- .../js/test/semantics/BoxJsTestGenerated.java | 6 ++++++ .../js/translate/context/StaticContext.java | 6 ++---- .../js/translate/utils/JsDescriptorUtils.java | 2 +- .../fakeFunctionInAnotherModule.kt | 15 +++++++++++++++ 4 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 js/js.translator/testData/box/inlineMultiModule/fakeFunctionInAnotherModule.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 7668a307a75..cb942e76a34 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 @@ -4754,6 +4754,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { doTest(fileName); } + @TestMetadata("fakeFunctionInAnotherModule.kt") + public void testFakeFunctionInAnotherModule() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/fakeFunctionInAnotherModule.kt"); + doTest(fileName); + } + @TestMetadata("importObjectInstance.kt") public void testImportObjectInstance() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/inlineMultiModule/importObjectInstance.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index 6d480e0f6c8..a1f7b629ae1 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -40,10 +40,7 @@ import org.jetbrains.kotlin.js.translate.context.generator.Generator; import org.jetbrains.kotlin.js.translate.context.generator.Rule; import org.jetbrains.kotlin.js.translate.declaration.ClassModelGenerator; import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics; -import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils; -import org.jetbrains.kotlin.js.translate.utils.JsAstUtils; -import org.jetbrains.kotlin.js.translate.utils.SignatureUtilsKt; -import org.jetbrains.kotlin.js.translate.utils.TranslationUtils; +import org.jetbrains.kotlin.js.translate.utils.*; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.resolve.BindingContext; @@ -805,6 +802,7 @@ public final class StaticContext { } public void addInlineCall(@NotNull CallableDescriptor descriptor) { + descriptor = (CallableDescriptor) JsDescriptorUtils.findRealInlineDeclaration(descriptor); String tag = Namer.getFunctionTag(descriptor, config); JsExpression moduleExpression = exportModuleForInline(DescriptorUtils.getContainingModule(descriptor)); if (moduleExpression == null) { diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java index ad1e2966050..ea6c1a3d851 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java @@ -169,7 +169,7 @@ public final class JsDescriptorUtils { } @Nullable - private static FunctionDescriptor findRealDeclaration(FunctionDescriptor descriptor) { + private static FunctionDescriptor findRealDeclaration(@NotNull FunctionDescriptor descriptor) { if (descriptor.getModality() == Modality.ABSTRACT) return null; if (descriptor.getKind().isReal()) return descriptor; diff --git a/js/js.translator/testData/box/inlineMultiModule/fakeFunctionInAnotherModule.kt b/js/js.translator/testData/box/inlineMultiModule/fakeFunctionInAnotherModule.kt new file mode 100644 index 00000000000..af90cd22b8c --- /dev/null +++ b/js/js.translator/testData/box/inlineMultiModule/fakeFunctionInAnotherModule.kt @@ -0,0 +1,15 @@ +// EXPECTED_REACHABLE_NODES: 996 +// MODULE: lib +// FILE: lib1.kt +open class Parent { + inline fun b() = c() +} + +// FILE: lib2.kt +fun c() = "OK" + +// MODULE: main(lib) +// FILE: main.kt +class Child : Parent() + +fun box() = Child().b() \ No newline at end of file