From c695da1bed93cca6258f1066da2646a20831ba8f Mon Sep 17 00:00:00 2001 From: Artem Kobzar Date: Thu, 13 Apr 2023 08:53:57 +0000 Subject: [PATCH] [K/JS] Allow declare inline functions inside external declarations with a million suppresses ^KT-48154 Fixed --- .../common/lower/inline/FunctionInlining.kt | 3 ++- .../kotlin/ir/backend/js/JsLoweringPhases.kt | 6 +++-- .../kotlin/js/test/BoxJsTestGenerated.java | 6 +++++ .../js/test/fir/FirJsBoxTestGenerated.java | 6 +++++ .../js/test/ir/IrBoxJsES6TestGenerated.java | 6 +++++ .../js/test/ir/IrBoxJsTestGenerated.java | 6 +++++ .../box/inline/externalInlineWithSuppress.kt | 26 +++++++++++++++++++ 7 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 js/js.translator/testData/box/inline/externalInlineWithSuppress.kt diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt index a8c3ba183c0..2cb32b4f3c1 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt @@ -90,6 +90,7 @@ class FunctionInlining( private val inlinePureArguments: Boolean = true, private val regenerateInlinedAnonymousObjects: Boolean = false, private val inlineArgumentsWithTheirOriginalTypeAndOffset: Boolean = false, + private val allowExternalInlining: Boolean = false ) : IrElementTransformerVoidWithContext(), BodyLoweringPass { private var containerScope: ScopeWithIr? = null @@ -153,7 +154,7 @@ class FunctionInlining( return this } - private val IrFunction.needsInlining get() = this.isInline && !this.isExternal + private val IrFunction.needsInlining get() = this.isInline && (allowExternalInlining || !this.isExternal) private inner class Inliner( val callSite: IrFunctionAccessExpression, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt index 8c3c53fd84a..84ecf0f5ea0 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsLoweringPhases.kt @@ -20,7 +20,9 @@ import org.jetbrains.kotlin.ir.backend.js.codegen.JsGenerationGranularity import org.jetbrains.kotlin.ir.backend.js.lower.* import org.jetbrains.kotlin.ir.backend.js.lower.calls.CallsLowering import org.jetbrains.kotlin.ir.backend.js.lower.cleanup.CleanupLowering -import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.* +import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.AddContinuationToFunctionCallsLowering +import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.JsSuspendArityStoreLowering +import org.jetbrains.kotlin.ir.backend.js.lower.coroutines.JsSuspendFunctionsLowering import org.jetbrains.kotlin.ir.backend.js.lower.inline.* import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrModuleFragment @@ -278,7 +280,7 @@ private val saveInlineFunctionsBeforeInlining = makeDeclarationTransformerPhase( ) private val functionInliningPhase = makeBodyLoweringPhase( - { FunctionInlining(it, JsInlineFunctionResolver(it), it.innerClassesSupport) }, + { FunctionInlining(it, JsInlineFunctionResolver(it), it.innerClassesSupport, allowExternalInlining = true) }, name = "FunctionInliningPhase", description = "Perform function inlining", prerequisite = setOf(saveInlineFunctionsBeforeInlining) 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 ed626ea849b..d9afd7a1c6a 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 @@ -4756,6 +4756,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/inline/extensionWithManyArguments.kt"); } + @Test + @TestMetadata("externalInlineWithSuppress.kt") + public void testExternalInlineWithSuppress() throws Exception { + runTest("js/js.translator/testData/box/inline/externalInlineWithSuppress.kt"); + } + @Test @TestMetadata("fakeOverrideInlining.kt") public void testFakeOverrideInlining() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java index 518278f4192..a61953489a2 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsBoxTestGenerated.java @@ -5372,6 +5372,12 @@ public class FirJsBoxTestGenerated extends AbstractFirJsBoxTest { runTest("js/js.translator/testData/box/inline/extensionWithManyArguments.kt"); } + @Test + @TestMetadata("externalInlineWithSuppress.kt") + public void testExternalInlineWithSuppress() throws Exception { + runTest("js/js.translator/testData/box/inline/externalInlineWithSuppress.kt"); + } + @Test @TestMetadata("fakeOverrideInlining.kt") public void testFakeOverrideInlining() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java index a1f3897b596..ab69e93c6c0 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsES6TestGenerated.java @@ -5478,6 +5478,12 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test { runTest("js/js.translator/testData/box/inline/extensionWithManyArguments.kt"); } + @Test + @TestMetadata("externalInlineWithSuppress.kt") + public void testExternalInlineWithSuppress() throws Exception { + runTest("js/js.translator/testData/box/inline/externalInlineWithSuppress.kt"); + } + @Test @TestMetadata("fakeOverrideInlining.kt") public void testFakeOverrideInlining() 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 1b7a1f445e8..4754d85ffd4 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 @@ -5372,6 +5372,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/inline/extensionWithManyArguments.kt"); } + @Test + @TestMetadata("externalInlineWithSuppress.kt") + public void testExternalInlineWithSuppress() throws Exception { + runTest("js/js.translator/testData/box/inline/externalInlineWithSuppress.kt"); + } + @Test @TestMetadata("fakeOverrideInlining.kt") public void testFakeOverrideInlining() throws Exception { diff --git a/js/js.translator/testData/box/inline/externalInlineWithSuppress.kt b/js/js.translator/testData/box/inline/externalInlineWithSuppress.kt new file mode 100644 index 00000000000..feccc7fd0a5 --- /dev/null +++ b/js/js.translator/testData/box/inline/externalInlineWithSuppress.kt @@ -0,0 +1,26 @@ +// EXPECTED_REACHABLE_NODES: 1284 +// IGNORE_BACKEND: JS +// FILE: main.kt +@file:Suppress( + "NESTED_CLASS_IN_EXTERNAL_INTERFACE", + "WRONG_BODY_OF_EXTERNAL_DECLARATION", + "INLINE_EXTERNAL_DECLARATION", + "NON_ABSTRACT_MEMBER_OF_EXTERNAL_INTERFACE", + "DECLARATION_CANT_BE_INLINED", +) +package foo + + +@JsName("null") +external interface Foo { + companion object { + inline fun test(): String = "OK" + } +} + +fun box(): String { + return Foo.test() +} + +// FILE: lib.js +function Foo() {} \ No newline at end of file