From 0ea1784d333766cef5e7dc22f65b2ec599ee25fb Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 1 Jun 2018 21:12:48 +0300 Subject: [PATCH] Introduce Parameter: Add suspend to lambdas with nested suspend-calls #KT-24712 Fixed --- .../introduceParameter/KotlinIntroduceParameterDialog.kt | 4 ++++ .../refactoring/introduceLambdaParameter/suspendCalls.kt | 6 ++++++ .../introduceLambdaParameter/suspendCalls.kt.after | 6 ++++++ .../idea/refactoring/introduce/ExtractionTestGenerated.java | 5 +++++ 4 files changed, 21 insertions(+) create mode 100644 idea/testData/refactoring/introduceLambdaParameter/suspendCalls.kt create mode 100644 idea/testData/refactoring/introduceLambdaParameter/suspendCalls.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterDialog.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterDialog.kt index fef8073e2fa..ef857c10bbc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterDialog.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterDialog.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.idea.refactoring.isMultiLine import org.jetbrains.kotlin.idea.refactoring.runRefactoringWithPostprocessing import org.jetbrains.kotlin.idea.refactoring.validateElement import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.quoteIfNeeded import org.jetbrains.kotlin.types.KotlinType @@ -285,6 +286,9 @@ class KotlinIntroduceParameterDialog private constructor( val returnType = function.typeReference?.text ?: "Unit" chosenType = (receiverType?.let { "$it." } ?: "") + "($parameterTypes) -> $returnType" + if (KtTokens.SUSPEND_KEYWORD in newDescriptor.modifiers) { + chosenType = "${KtTokens.SUSPEND_KEYWORD} $chosenType" + } newArgumentValue = createLambdaForArgument(function) newReplacer = { } diff --git a/idea/testData/refactoring/introduceLambdaParameter/suspendCalls.kt b/idea/testData/refactoring/introduceLambdaParameter/suspendCalls.kt new file mode 100644 index 00000000000..601ba0cc5a4 --- /dev/null +++ b/idea/testData/refactoring/introduceLambdaParameter/suspendCalls.kt @@ -0,0 +1,6 @@ +// WITH_DEFAULT_VALUE: false +suspend fun foo(n: Int) = n + +suspend fun test() { + val m = foo(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceLambdaParameter/suspendCalls.kt.after b/idea/testData/refactoring/introduceLambdaParameter/suspendCalls.kt.after new file mode 100644 index 00000000000..b8150794587 --- /dev/null +++ b/idea/testData/refactoring/introduceLambdaParameter/suspendCalls.kt.after @@ -0,0 +1,6 @@ +// WITH_DEFAULT_VALUE: false +suspend fun foo(n: Int) = n + +suspend fun test(i: suspend () -> Int) { + val m = i() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java index 806b09867d8..c551da6f301 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -3557,6 +3557,11 @@ public class ExtractionTestGenerated extends AbstractExtractionTest { runTest("idea/testData/refactoring/introduceLambdaParameter/lambdaParamWithDefaultValue.kt"); } + @TestMetadata("suspendCalls.kt") + public void testSuspendCalls() throws Exception { + runTest("idea/testData/refactoring/introduceLambdaParameter/suspendCalls.kt"); + } + @TestMetadata("idea/testData/refactoring/introduceLambdaParameter/multiline") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)