From c3443543957411169150cf71d139ed7ab45ee958 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Thu, 17 May 2018 17:51:42 +0300 Subject: [PATCH] Add quick-fix for 'is' absence in when #KT-18810 Fixed --- .../idea/quickfix/AddIsToWhenConditionFix.kt | 39 +++++++++++++++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 + .../quickfix/addIsToWhenCondition/class.kt | 9 +++++ .../addIsToWhenCondition/class.kt.after | 9 +++++ .../QuickFixMultiFileTestGenerated.java | 13 +++++++ .../idea/quickfix/QuickFixTestGenerated.java | 18 +++++++++ 6 files changed, 90 insertions(+) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/AddIsToWhenConditionFix.kt create mode 100644 idea/testData/quickfix/addIsToWhenCondition/class.kt create mode 100644 idea/testData/quickfix/addIsToWhenCondition/class.kt.after 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)