Add intention to remove suspend from parameter on suspend inline function
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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<KtModifierListOwner>? {
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
// "Add 'crossinline' to parameter 'x'" "true"
|
||||
|
||||
inline fun foo(<caret>x: suspend () -> Unit) {}
|
||||
@@ -0,0 +1,3 @@
|
||||
// "Add 'crossinline' to parameter 'x'" "true"
|
||||
|
||||
inline fun foo(crossinline x: suspend () -> Unit) {}
|
||||
@@ -0,0 +1,3 @@
|
||||
// "Remove 'suspend' modifier" "true"
|
||||
|
||||
suspend inline fun foo(c: <caret>suspend () -> Unit) {}
|
||||
@@ -0,0 +1,3 @@
|
||||
// "Remove 'suspend' modifier" "true"
|
||||
|
||||
suspend inline fun foo(c: () -> Unit) {}
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user