From 7224b999280de80b6cd75e4bae721b7dfb00ba43 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Thu, 1 Feb 2018 17:48:31 +0300 Subject: [PATCH] Add intention to remove suspend from parameter on suspend inline function --- .../idea/quickfix/AddInlineModifierFix.kt | 9 +++++++- .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 4 +++- .../kotlin/idea/quickfix/RemoveModifierFix.kt | 17 +++++++++++---- .../quickfix/addCrossinline/suspend.kt | 3 +++ .../quickfix/addCrossinline/suspend.kt.after | 3 +++ .../quickfix/redundantSuspend/inline.kt | 3 +++ .../quickfix/redundantSuspend/inline.kt.after | 3 +++ .../idea/quickfix/QuickFixTestGenerated.java | 21 +++++++++++++++++++ 8 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 idea/testData/quickfix/addCrossinline/suspend.kt create mode 100644 idea/testData/quickfix/addCrossinline/suspend.kt.after create mode 100644 idea/testData/quickfix/redundantSuspend/inline.kt create mode 100644 idea/testData/quickfix/redundantSuspend/inline.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddInlineModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddInlineModifierFix.kt index 9aea161151f..538b3a73ae4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddInlineModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddInlineModifierFix.kt @@ -57,11 +57,18 @@ class AddInlineModifierFix( } } - object SuspendFactory : KotlinSingleIntentionActionFactory() { + object NoInlineSuspendFactory : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { val parameter = diagnostic.psiElement as? KtParameter ?: return null return AddInlineModifierFix(parameter, KtTokens.NOINLINE_KEYWORD) } } + object CrossInlineSuspendFactory : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val parameter = diagnostic.psiElement as? KtParameter ?: return null + return AddInlineModifierFix(parameter, KtTokens.CROSSINLINE_KEYWORD) + } + } + } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 05d0fdd76d4..a21c6710c34 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -112,6 +112,7 @@ class QuickFixRegistrar : QuickFixContributor { val removeRedundantModifierFactory = RemoveModifierFix.createRemoveModifierFactory(true) REDUNDANT_MODIFIER.registerFactory(removeRedundantModifierFactory) REDUNDANT_OPEN_IN_INTERFACE.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerFactory(OPEN_KEYWORD, true)) + REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE.registerFactory(RemoveModifierFix.createRemoveSuspendFactory()) UNNECESSARY_LATEINIT.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerFactory(LATEINIT_KEYWORD)) REDUNDANT_PROJECTION.registerFactory(RemoveModifierFix.createRemoveProjectionFactory(true)) @@ -487,7 +488,8 @@ class QuickFixRegistrar : QuickFixContributor { ErrorsJs.WRONG_EXTERNAL_DECLARATION.registerFactory(MigrateExternalExtensionFix) ILLEGAL_SUSPEND_FUNCTION_CALL.registerFactory(AddSuspendModifierFix) - INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED.registerFactory(AddInlineModifierFix.SuspendFactory) + INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED.registerFactory(AddInlineModifierFix.NoInlineSuspendFactory) + INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED.registerFactory(AddInlineModifierFix.CrossInlineSuspendFactory) UNRESOLVED_REFERENCE.registerFactory(AddSuspendModifierFix.UnresolvedReferenceFactory) UNRESOLVED_REFERENCE_WRONG_RECEIVER.registerFactory(AddSuspendModifierFix.UnresolvedReferenceFactory) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt index adbba38f873..5e1f03c17d2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveModifierFix.kt @@ -22,10 +22,7 @@ import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.idea.core.quickfix.QuickFixUtil import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtModifierListOwner -import org.jetbrains.kotlin.psi.KtTypeParameter -import org.jetbrains.kotlin.psi.KtTypeProjection +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.types.Variance @@ -110,5 +107,17 @@ class RemoveModifierFix( } } } + + fun createRemoveSuspendFactory(): KotlinSingleIntentionActionFactory { + return object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { + val suspendKeyword = diagnostic.psiElement + val modifierList = suspendKeyword.parent as KtDeclarationModifierList + val type = modifierList.parent as KtTypeReference + if (!type.hasModifier(KtTokens.SUSPEND_KEYWORD)) return null + return RemoveModifierFix(type, KtTokens.SUSPEND_KEYWORD, isRedundant = false) + } + } + } } } diff --git a/idea/testData/quickfix/addCrossinline/suspend.kt b/idea/testData/quickfix/addCrossinline/suspend.kt new file mode 100644 index 00000000000..88175d93c48 --- /dev/null +++ b/idea/testData/quickfix/addCrossinline/suspend.kt @@ -0,0 +1,3 @@ +// "Add 'crossinline' to parameter 'x'" "true" + +inline fun foo(x: suspend () -> Unit) {} \ No newline at end of file diff --git a/idea/testData/quickfix/addCrossinline/suspend.kt.after b/idea/testData/quickfix/addCrossinline/suspend.kt.after new file mode 100644 index 00000000000..6cc9cf74c32 --- /dev/null +++ b/idea/testData/quickfix/addCrossinline/suspend.kt.after @@ -0,0 +1,3 @@ +// "Add 'crossinline' to parameter 'x'" "true" + +inline fun foo(crossinline x: suspend () -> Unit) {} \ No newline at end of file diff --git a/idea/testData/quickfix/redundantSuspend/inline.kt b/idea/testData/quickfix/redundantSuspend/inline.kt new file mode 100644 index 00000000000..5788a075bb7 --- /dev/null +++ b/idea/testData/quickfix/redundantSuspend/inline.kt @@ -0,0 +1,3 @@ +// "Remove 'suspend' modifier" "true" + +suspend inline fun foo(c: suspend () -> Unit) {} \ No newline at end of file diff --git a/idea/testData/quickfix/redundantSuspend/inline.kt.after b/idea/testData/quickfix/redundantSuspend/inline.kt.after new file mode 100644 index 00000000000..4ef5a1e858f --- /dev/null +++ b/idea/testData/quickfix/redundantSuspend/inline.kt.after @@ -0,0 +1,3 @@ +// "Remove 'suspend' modifier" "true" + +suspend inline fun foo(c: () -> Unit) {} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 2f9d476cd2d..58920cf93c6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -368,6 +368,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addCrossinline/basic.kt"); doTest(fileName); } + + @TestMetadata("suspend.kt") + public void testSuspend() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addCrossinline/suspend.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/addDataModifier") @@ -9187,6 +9193,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/redundantSuspend") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class RedundantSuspend extends AbstractQuickFixTest { + public void testAllFilesPresentInRedundantSuspend() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/redundantSuspend"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("inline.kt") + public void testInline() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/redundantSuspend/inline.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/redundantVisibilityModifier") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)