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? {
|
override fun createAction(diagnostic: Diagnostic): IntentionAction? {
|
||||||
val parameter = diagnostic.psiElement as? KtParameter ?: return null
|
val parameter = diagnostic.psiElement as? KtParameter ?: return null
|
||||||
return AddInlineModifierFix(parameter, KtTokens.NOINLINE_KEYWORD)
|
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)
|
val removeRedundantModifierFactory = RemoveModifierFix.createRemoveModifierFactory(true)
|
||||||
REDUNDANT_MODIFIER.registerFactory(removeRedundantModifierFactory)
|
REDUNDANT_MODIFIER.registerFactory(removeRedundantModifierFactory)
|
||||||
REDUNDANT_OPEN_IN_INTERFACE.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerFactory(OPEN_KEYWORD, true))
|
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))
|
UNNECESSARY_LATEINIT.registerFactory(RemoveModifierFix.createRemoveModifierFromListOwnerFactory(LATEINIT_KEYWORD))
|
||||||
|
|
||||||
REDUNDANT_PROJECTION.registerFactory(RemoveModifierFix.createRemoveProjectionFactory(true))
|
REDUNDANT_PROJECTION.registerFactory(RemoveModifierFix.createRemoveProjectionFactory(true))
|
||||||
@@ -487,7 +488,8 @@ class QuickFixRegistrar : QuickFixContributor {
|
|||||||
ErrorsJs.WRONG_EXTERNAL_DECLARATION.registerFactory(MigrateExternalExtensionFix)
|
ErrorsJs.WRONG_EXTERNAL_DECLARATION.registerFactory(MigrateExternalExtensionFix)
|
||||||
|
|
||||||
ILLEGAL_SUSPEND_FUNCTION_CALL.registerFactory(AddSuspendModifierFix)
|
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.registerFactory(AddSuspendModifierFix.UnresolvedReferenceFactory)
|
||||||
UNRESOLVED_REFERENCE_WRONG_RECEIVER.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.idea.core.quickfix.QuickFixUtil
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.KtModifierListOwner
|
|
||||||
import org.jetbrains.kotlin.psi.KtTypeParameter
|
|
||||||
import org.jetbrains.kotlin.psi.KtTypeProjection
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
import org.jetbrains.kotlin.types.Variance
|
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");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addCrossinline/basic.kt");
|
||||||
doTest(fileName);
|
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")
|
@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")
|
@TestMetadata("idea/testData/quickfix/redundantVisibilityModifier")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user