Add intention to remove suspend from parameter on suspend inline function

This commit is contained in:
Ilmir Usmanov
2018-02-01 17:48:31 +03:00
parent 6854135077
commit 7224b99928
8 changed files with 57 additions and 6 deletions
@@ -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)
}
}
}
}
}
+3
View File
@@ -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) {}
+3
View File
@@ -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)