From 59009430e5212cc7a8bcc18b1ddc2b6e1a810c73 Mon Sep 17 00:00:00 2001 From: Anton Bannykh Date: Thu, 1 Nov 2018 20:23:45 +0300 Subject: [PATCH] JS: report inline suspend functions to IC * Also inline suspend lambda'a * Also use correct JsName's in exported suspend inline fun's * Also use less unused imports --- ...rementalJsCompilerRunnerTestGenerated.java | 5 +++++ ...ementalJvmCompilerRunnerTestGenerated.java | 5 +++++ .../stateMachine/numberOfSuspentions.kt | 1 - .../build/IncrementalJpsTestGenerated.java | 5 +++++ .../inlineSuspendFunctionChanged/build.log | 22 +++++++++++++++++++ .../inlineSuspendFunctionChanged/dummy.kt | 5 +++++ .../inlineSuspendFunctionChanged/inline.kt | 6 +++++ .../inline.kt.new | 6 +++++ .../inlineSuspendFunctionChanged/useInline.kt | 5 +++++ .../js/coroutine/CoroutineTransformer.kt | 3 +++ .../util/rewriters/NameReplacingVisitor.kt | 11 ++++++++++ .../callTranslator/CallTranslator.kt | 3 --- .../declaration/AbstractDeclarationVisitor.kt | 12 ++++++---- 13 files changed, 81 insertions(+), 8 deletions(-) create mode 100644 jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/build.log create mode 100644 jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/dummy.kt create mode 100644 jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/inline.kt create mode 100644 jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/inline.kt.new create mode 100644 jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/useInline.kt diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java index d341fcebaba..1efc79eb1b6 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJsCompilerRunnerTestGenerated.java @@ -291,6 +291,11 @@ public class IncrementalJsCompilerRunnerTestGenerated extends AbstractIncrementa runTest("jps-plugin/testData/incremental/pureKotlin/inlinePropertyOnTopLevel/"); } + @TestMetadata("inlineSuspendFunctionChanged") + public void testInlineSuspendFunctionChanged() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/"); + } + @TestMetadata("inlineTwoFunctionsOneChanged") public void testInlineTwoFunctionsOneChanged() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/inlineTwoFunctionsOneChanged/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java index 143aae7ad6f..51ca64537ff 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunnerTestGenerated.java @@ -291,6 +291,11 @@ public class IncrementalJvmCompilerRunnerTestGenerated extends AbstractIncrement runTest("jps-plugin/testData/incremental/pureKotlin/inlinePropertyOnTopLevel/"); } + @TestMetadata("inlineSuspendFunctionChanged") + public void testInlineSuspendFunctionChanged() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/"); + } + @TestMetadata("inlineTwoFunctionsOneChanged") public void testInlineTwoFunctionsOneChanged() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/inlineTwoFunctionsOneChanged/"); diff --git a/compiler/testData/codegen/boxInline/suspend/stateMachine/numberOfSuspentions.kt b/compiler/testData/codegen/boxInline/suspend/stateMachine/numberOfSuspentions.kt index 5ca95f43294..d29634a6593 100644 --- a/compiler/testData/codegen/boxInline/suspend/stateMachine/numberOfSuspentions.kt +++ b/compiler/testData/codegen/boxInline/suspend/stateMachine/numberOfSuspentions.kt @@ -4,7 +4,6 @@ // WITH_RUNTIME // WITH_COROUTINES // NO_CHECK_LAMBDA_INLINING -// IGNORE_BACKEND: JS suspend inline fun crossinlineMe(crossinline c: suspend () -> Unit) { val l: suspend () -> Unit = { c() } diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java index 3c17d3546d7..47155dc92c3 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java @@ -870,6 +870,11 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest { runTest("jps-plugin/testData/incremental/pureKotlin/inlinePropertyOnTopLevel/"); } + @TestMetadata("inlineSuspendFunctionChanged") + public void testInlineSuspendFunctionChanged() throws Exception { + runTest("jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/"); + } + @TestMetadata("inlineTwoFunctionsOneChanged") public void testInlineTwoFunctionsOneChanged() throws Exception { runTest("jps-plugin/testData/incremental/pureKotlin/inlineTwoFunctionsOneChanged/"); diff --git a/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/build.log b/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/build.log new file mode 100644 index 00000000000..cbce054c33e --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/build.log @@ -0,0 +1,22 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/inline/InlineKt.class +End of files +Compiling files: + src/inline.kt +End of files +Marked as dirty by Kotlin: + src/useInline.kt +Exit code: ADDITIONAL_PASS_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/inline/UseInlineKt.class +End of files +Compiling files: + src/useInline.kt +End of files +Exit code: OK +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/dummy.kt b/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/dummy.kt new file mode 100644 index 00000000000..e3a7cc6b3fc --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/dummy.kt @@ -0,0 +1,5 @@ +package inline + +fun dontUseF() { + println("Don't use f") +} diff --git a/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/inline.kt b/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/inline.kt new file mode 100644 index 00000000000..68613324f2d --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/inline.kt @@ -0,0 +1,6 @@ +package inline + +inline suspend fun f(body: () -> Unit) { + println("i'm inline suspend function") + body() +} diff --git a/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/inline.kt.new b/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/inline.kt.new new file mode 100644 index 00000000000..0858af3d7cf --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/inline.kt.new @@ -0,0 +1,6 @@ +package inline + +inline suspend fun f(body: () -> Unit) { + body() + println("i'm inline suspend function") +} diff --git a/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/useInline.kt b/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/useInline.kt new file mode 100644 index 00000000000..370f5a8a595 --- /dev/null +++ b/jps-plugin/testData/incremental/pureKotlin/inlineSuspendFunctionChanged/useInline.kt @@ -0,0 +1,5 @@ +package inline + +suspend fun useF() { + f { println("useF") } +} diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineTransformer.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineTransformer.kt index 3087ee17d14..443b66aaf8a 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineTransformer.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/coroutine/CoroutineTransformer.kt @@ -47,12 +47,14 @@ class CoroutineTransformer : JsVisitorWithContextImpl() { if (function?.coroutineMetadata != null) { val name = ((lhs as? JsNameRef)?.name ?: function.name)?.ident additionalStatementsByNode[x] = CoroutineFunctionTransformer(function, name).transform() + function.coroutineMetadata = null return false } } else if (expression is JsFunction) { if (expression.coroutineMetadata != null) { additionalStatementsByNode[x] = CoroutineFunctionTransformer(expression, expression.name?.ident).transform() + expression.coroutineMetadata = null return false } } @@ -74,6 +76,7 @@ class CoroutineTransformer : JsVisitorWithContextImpl() { if (function?.coroutineMetadata != null) { val name = x.name.ident additionalStatementsByNode[x] = CoroutineFunctionTransformer(function, name).transform() + function.coroutineMetadata = null return false } } diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/NameReplacingVisitor.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/NameReplacingVisitor.kt index 1cee5ab5ada..24faaf7b5ad 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/NameReplacingVisitor.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/util/rewriters/NameReplacingVisitor.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.js.inline.util.rewriters import org.jetbrains.kotlin.js.backend.ast.* +import org.jetbrains.kotlin.js.backend.ast.metadata.coroutineMetadata class NameReplacingVisitor(private val replaceMap: Map) : JsVisitorWithContextImpl() { @@ -43,6 +44,16 @@ class NameReplacingVisitor(private val replaceMap: Map) : override fun endVisit(x: JsParameter, ctx: JsContext<*>) = applyToNamedNode(x) + override fun visit(x: JsFunction, ctx: JsContext<*>): Boolean { + x.coroutineMetadata?.let { coroutineMetadata -> + x.coroutineMetadata = coroutineMetadata.copy( + baseClassRef = accept(coroutineMetadata.baseClassRef.deepCopy()), + suspendObjectRef = accept(coroutineMetadata.suspendObjectRef.deepCopy()) + ) + } + return super.visit(x, ctx) + } + private fun applyToNamedNode(x: HasName) { while (true) { val replacement = replaceMap[x.name] diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallTranslator.kt index 18e0d2e74b5..899ab1b2584 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/callTranslator/CallTranslator.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.js.translate.callTranslator import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.isFunctionTypeOrSubtype -import org.jetbrains.kotlin.builtins.isSuspendFunctionType import org.jetbrains.kotlin.builtins.isSuspendFunctionTypeOrSubtype import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor @@ -32,8 +31,6 @@ import org.jetbrains.kotlin.js.translate.reference.CallExpressionTranslator import org.jetbrains.kotlin.js.translate.utils.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.Call.CallType -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtWhenConditionInRange import org.jetbrains.kotlin.resolve.calls.callResolverUtil.isInvokeCallOnVariable import org.jetbrains.kotlin.resolve.calls.callUtil.isSafeCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt index 8a329e96cc4..711186529d8 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/AbstractDeclarationVisitor.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.js.backend.ast.JsName import org.jetbrains.kotlin.js.backend.ast.metadata.coroutineMetadata import org.jetbrains.kotlin.js.backend.ast.metadata.isInlineableCoroutineBody import org.jetbrains.kotlin.js.descriptorUtils.shouldBeExported +import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.expression.InlineMetadata import org.jetbrains.kotlin.js.translate.expression.translateAndAliasParameters @@ -100,17 +101,20 @@ abstract class AbstractDeclarationVisitor : TranslatorVisitor() { else { null } - addFunction(descriptor, functionAndContext?.first, expression) if (descriptor.isSuspend && descriptor.isInline && descriptor.shouldBeExported(context.config) && functionAndContext != null) { + val exportFunction = functionAndContext.first as JsFunction + exportFunction.fillCoroutineMetadata(context, descriptor, exportFunction.coroutineMetadata!!.hasController) + addFunction(descriptor, exportFunction, expression) + val innerContext = functionAndContext.second val inlineFunction = functionAndContext.first.deepCopy() as JsFunction inlineFunction.name = null inlineFunction.coroutineMetadata = null inlineFunction.isInlineableCoroutineBody = true - val metadata = InlineMetadata.compose(inlineFunction, descriptor, innerContext) - val functionWithMetadata = metadata.functionWithMetadata(context, descriptor.source.getPsi()) - context.addDeclarationStatement(functionWithMetadata.makeStmt()) + context.addDeclarationStatement(innerContext.wrapWithInlineMetadata(context, inlineFunction, descriptor).makeStmt()) + } else { + addFunction(descriptor, functionAndContext?.first, expression) } }