From b9a220c6242bfe35087387317d1a6fe46dc0b813 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Thu, 9 Apr 2020 09:43:24 +0900 Subject: [PATCH] AddSuspendModifierFix: suggest in inline lambda #KT-38139 Fixed --- .../idea/quickfix/AddSuspendModifierFix.kt | 20 +++++++++++++++++-- .../quickfix/modifiers/suspend/inLambda.kt | 11 ++++++++++ .../modifiers/suspend/inLambda.kt.after | 11 ++++++++++ .../quickfix/modifiers/suspend/inLambda2.kt | 17 ++++++++++++++++ .../quickfix/modifiers/suspend/inLambda3.kt | 16 +++++++++++++++ .../modifiers/suspend/inLambda3.kt.after | 16 +++++++++++++++ .../idea/quickfix/QuickFixTestGenerated.java | 15 ++++++++++++++ 7 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 idea/testData/quickfix/modifiers/suspend/inLambda.kt create mode 100644 idea/testData/quickfix/modifiers/suspend/inLambda.kt.after create mode 100644 idea/testData/quickfix/modifiers/suspend/inLambda2.kt create mode 100644 idea/testData/quickfix/modifiers/suspend/inLambda3.kt create mode 100644 idea/testData/quickfix/modifiers/suspend/inLambda3.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddSuspendModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddSuspendModifierFix.kt index 5f5e12be8cc..25963c792ef 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddSuspendModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddSuspendModifierFix.kt @@ -8,12 +8,14 @@ package org.jetbrains.kotlin.idea.quickfix import com.intellij.codeInsight.intention.IntentionAction import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.cfg.pseudocode.containingDeclarationForPseudocode +import org.jetbrains.kotlin.codegen.inline.isInlineOrInsideInline import org.jetbrains.kotlin.descriptors.ValueDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils class AddSuspendModifierFix( @@ -41,12 +43,26 @@ class AddSuspendModifierFix( companion object : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { - val element = diagnostic.psiElement - val function = (element as? KtElement)?.containingDeclarationForPseudocode as? KtNamedFunction ?: return null + val element = diagnostic.psiElement as? KtElement ?: return null + val function = element.containingFunction() ?: return null val functionName = function.name ?: return null return AddSuspendModifierFix(function, functionName) } + + private fun KtElement.containingFunction(): KtNamedFunction? { + val containingDeclaration = containingDeclarationForPseudocode + return if (containingDeclaration is KtFunctionLiteral) { + val call = containingDeclaration.getStrictParentOfType() + if (call?.resolveToCall()?.resultingDescriptor?.isInlineOrInsideInline() == true) { + containingDeclaration.containingFunction() + } else { + null + } + } else { + containingDeclaration as? KtNamedFunction + } + } } object UnresolvedReferenceFactory : KotlinSingleIntentionActionFactory() { diff --git a/idea/testData/quickfix/modifiers/suspend/inLambda.kt b/idea/testData/quickfix/modifiers/suspend/inLambda.kt new file mode 100644 index 00000000000..e80e4157d54 --- /dev/null +++ b/idea/testData/quickfix/modifiers/suspend/inLambda.kt @@ -0,0 +1,11 @@ +// "Make test suspend" "true" +suspend fun foo() {} + +inline fun bar(f: () -> Unit) { +} + +fun test() { + bar { + foo() + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/suspend/inLambda.kt.after b/idea/testData/quickfix/modifiers/suspend/inLambda.kt.after new file mode 100644 index 00000000000..66fd044d1c2 --- /dev/null +++ b/idea/testData/quickfix/modifiers/suspend/inLambda.kt.after @@ -0,0 +1,11 @@ +// "Make test suspend" "true" +suspend fun foo() {} + +inline fun bar(f: () -> Unit) { +} + +suspend fun test() { + bar { + foo() + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/suspend/inLambda2.kt b/idea/testData/quickfix/modifiers/suspend/inLambda2.kt new file mode 100644 index 00000000000..70a0298418f --- /dev/null +++ b/idea/testData/quickfix/modifiers/suspend/inLambda2.kt @@ -0,0 +1,17 @@ +// "Make test suspend" "false" +// DISABLE-ERRORS +// ACTION: Convert to single-line lambda +// ACTION: Enable a trailing comma by default in the formatter +// ACTION: Introduce import alias +// ACTION: Move lambda argument into parentheses +// ACTION: Specify explicit lambda signature +suspend fun foo() {} + +fun bar(f: () -> Unit) { +} + +fun test() { + bar { + foo() + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/modifiers/suspend/inLambda3.kt b/idea/testData/quickfix/modifiers/suspend/inLambda3.kt new file mode 100644 index 00000000000..1264d08d45c --- /dev/null +++ b/idea/testData/quickfix/modifiers/suspend/inLambda3.kt @@ -0,0 +1,16 @@ +// "Make test suspend" "true" +suspend fun foo() {} + +inline fun bar(f: () -> Unit) { +} + +inline fun baz(f: () -> Unit) { +} + +fun test() { + baz { + bar { + foo() + } + } +} diff --git a/idea/testData/quickfix/modifiers/suspend/inLambda3.kt.after b/idea/testData/quickfix/modifiers/suspend/inLambda3.kt.after new file mode 100644 index 00000000000..1657d0ca9b2 --- /dev/null +++ b/idea/testData/quickfix/modifiers/suspend/inLambda3.kt.after @@ -0,0 +1,16 @@ +// "Make test suspend" "true" +suspend fun foo() {} + +inline fun bar(f: () -> Unit) { +} + +inline fun baz(f: () -> Unit) { +} + +suspend fun test() { + baz { + bar { + foo() + } + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index ca87d2fafd2..64c6286029e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -9533,6 +9533,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/modifiers/suspend/createCoroutine.kt"); } + @TestMetadata("inLambda.kt") + public void testInLambda() throws Exception { + runTest("idea/testData/quickfix/modifiers/suspend/inLambda.kt"); + } + + @TestMetadata("inLambda2.kt") + public void testInLambda2() throws Exception { + runTest("idea/testData/quickfix/modifiers/suspend/inLambda2.kt"); + } + + @TestMetadata("inLambda3.kt") + public void testInLambda3() throws Exception { + runTest("idea/testData/quickfix/modifiers/suspend/inLambda3.kt"); + } + @TestMetadata("init.kt") public void testInit() throws Exception { runTest("idea/testData/quickfix/modifiers/suspend/init.kt");