diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddIsToWhenConditionFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddIsToWhenConditionFix.kt new file mode 100644 index 00000000000..76596fd4dee --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddIsToWhenConditionFix.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.quickfix + +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.core.replaced +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.KtWhenConditionWithExpression +import org.jetbrains.kotlin.psi.psiUtil.endOffset + +class AddIsToWhenConditionFix( + expression: KtWhenConditionWithExpression, + private val referenceText: String +) : KotlinQuickFixAction(expression) { + + override fun getText(): String = "Add 'is' before '$referenceText'" + + override fun getFamilyName(): String = text + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val expression = element ?: return + val replaced = expression.replaced(KtPsiFactory(expression).createWhenCondition("is ${expression.text}")) + editor?.caretModel?.moveToOffset(replaced.endOffset) + } + + companion object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction? { + val element = diagnostic.psiElement.parent as? KtWhenConditionWithExpression ?: return null + return AddIsToWhenConditionFix(element, element.text) + } + } + +} \ 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 0d1a145b3b3..c220043886a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -559,5 +559,7 @@ class QuickFixRegistrar : QuickFixContributor { TYPE_VARIANCE_CONFLICT.registerFactory(RemoveTypeVarianceFix) CONST_VAL_NOT_TOP_LEVEL_OR_OBJECT.registerFactory(MoveMemberToCompanionObjectIntention) + + NO_COMPANION_OBJECT.registerFactory(AddIsToWhenConditionFix) } } diff --git a/idea/testData/quickfix/addIsToWhenCondition/class.kt b/idea/testData/quickfix/addIsToWhenCondition/class.kt new file mode 100644 index 00000000000..ff6c719475b --- /dev/null +++ b/idea/testData/quickfix/addIsToWhenCondition/class.kt @@ -0,0 +1,9 @@ +// "Add 'is' before 'Foo'" "true" + +class Foo + +fun test(a: Any) { + when (a) { + Foo -> {} + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/addIsToWhenCondition/class.kt.after b/idea/testData/quickfix/addIsToWhenCondition/class.kt.after new file mode 100644 index 00000000000..b4d68bfa877 --- /dev/null +++ b/idea/testData/quickfix/addIsToWhenCondition/class.kt.after @@ -0,0 +1,9 @@ +// "Add 'is' before 'Foo'" "true" + +class Foo + +fun test(a: Any) { + when (a) { + is Foo -> {} + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index bdd0ed1b393..51e0c7a3916 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -151,6 +151,19 @@ public class QuickFixMultiFileTestGenerated extends AbstractQuickFixMultiFileTes } } + @TestMetadata("idea/testData/quickfix/addIsToWhenCondition") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class AddIsToWhenCondition extends AbstractQuickFixMultiFileTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTestWithExtraFile, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInAddIsToWhenCondition() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/addIsToWhenCondition"), Pattern.compile("^(\\w+)\\.((before\\.Main\\.\\w+)|(test))$"), TargetBackend.ANY, true); + } + } + @TestMetadata("idea/testData/quickfix/addJvmDefault") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index fab58bffd92..0be212a7f2e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -686,6 +686,24 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/addIsToWhenCondition") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class AddIsToWhenCondition extends AbstractQuickFixTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, TargetBackend.ANY, testDataFilePath); + } + + public void testAllFilesPresentInAddIsToWhenCondition() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/addIsToWhenCondition"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("class.kt") + public void testClass() throws Exception { + runTest("idea/testData/quickfix/addIsToWhenCondition/class.kt"); + } + } + @TestMetadata("idea/testData/quickfix/addJvmDefault") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)