From 214e1d301549086b2ea2a225f4d8669dd593f166 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 15 Mar 2016 18:19:44 +0300 Subject: [PATCH] Simplify comparison fix introduced #KT-10509 Fixed --- .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 2 + .../idea/quickfix/SimplifyComparisonFix.kt | 56 +++++++++++++++++++ .../quickfix/simplifyComparison/doubleNull.kt | 11 ++++ .../simplifyComparison/doubleNull.kt.after | 11 ++++ .../quickfix/simplifyComparison/notNull.kt | 6 ++ .../simplifyComparison/notNull.kt.after | 6 ++ .../simplifyComparison/nullOrNotNull.kt | 6 ++ .../simplifyComparison/nullOrNotNull.kt.after | 6 ++ .../simplifyComparison/somethingAndNotNull.kt | 6 ++ .../somethingAndNotNull.kt.after | 6 ++ .../idea/quickfix/QuickFixTestGenerated.java | 33 +++++++++++ 11 files changed, 149 insertions(+) create mode 100644 idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt create mode 100644 idea/testData/quickfix/simplifyComparison/doubleNull.kt create mode 100644 idea/testData/quickfix/simplifyComparison/doubleNull.kt.after create mode 100644 idea/testData/quickfix/simplifyComparison/notNull.kt create mode 100644 idea/testData/quickfix/simplifyComparison/notNull.kt.after create mode 100644 idea/testData/quickfix/simplifyComparison/nullOrNotNull.kt create mode 100644 idea/testData/quickfix/simplifyComparison/nullOrNotNull.kt.after create mode 100644 idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt create mode 100644 idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index ea899b7b560..7880b0a86c4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -179,6 +179,8 @@ class QuickFixRegistrar : QuickFixContributor { UNUSED_VARIABLE.registerFactory(RemovePsiElementSimpleFix.RemoveVariableFactory) + SENSELESS_COMPARISON.registerFactory(SimplifyComparisonFix) + UNNECESSARY_SAFE_CALL.registerFactory(ReplaceWithDotCallFix) UNSAFE_CALL.registerFactory(ReplaceWithSafeCallFix) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt new file mode 100644 index 00000000000..7c816405efc --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt @@ -0,0 +1,56 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.quickfix + +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters2 +import org.jetbrains.kotlin.idea.intentions.SimplifyBooleanWithConstantsIntention +import org.jetbrains.kotlin.psi.KtBinaryExpression +import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType + +class SimplifyComparisonFix(element: KtExpression, val value: Boolean) : KotlinQuickFixAction(element) { + override fun getFamilyName() = "Simplify $element to '$value'" + + override fun getText() = "Simplify comparison" + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val parent = element.parent + val replacement = KtPsiFactory(element).createExpression("$value") + element.replace(replacement) + + val booleanExpression = parent.getNonStrictParentOfType() ?: return + val simplifyIntention = SimplifyBooleanWithConstantsIntention() + if (simplifyIntention.isApplicableTo(booleanExpression)) { + simplifyIntention.applyTo(booleanExpression, editor) + } + } + + companion object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val expression = diagnostic.psiElement as? KtExpression ?: return null + val value = (diagnostic as? DiagnosticWithParameters2<*, *, *>)?.b as? Boolean ?: return null + return SimplifyComparisonFix(expression, value) + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/doubleNull.kt b/idea/testData/quickfix/simplifyComparison/doubleNull.kt new file mode 100644 index 00000000000..c511864d2b5 --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/doubleNull.kt @@ -0,0 +1,11 @@ +// "Simplify comparison" "true" +fun foo(x: String?) { + if (x == null) { + + } + else { + if (x == null) { + + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/doubleNull.kt.after b/idea/testData/quickfix/simplifyComparison/doubleNull.kt.after new file mode 100644 index 00000000000..e1ae66f7635 --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/doubleNull.kt.after @@ -0,0 +1,11 @@ +// "Simplify comparison" "true" +fun foo(x: String?) { + if (x == null) { + + } + else { + if (false) { + + } + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/notNull.kt b/idea/testData/quickfix/simplifyComparison/notNull.kt new file mode 100644 index 00000000000..7450d66f657 --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/notNull.kt @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +fun foo(x: Int) { + if (x != null) { + + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/notNull.kt.after b/idea/testData/quickfix/simplifyComparison/notNull.kt.after new file mode 100644 index 00000000000..42766ba832b --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/notNull.kt.after @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +fun foo(x: Int) { + if (true) { + + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/nullOrNotNull.kt b/idea/testData/quickfix/simplifyComparison/nullOrNotNull.kt new file mode 100644 index 00000000000..16192d798de --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/nullOrNotNull.kt @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +fun foo(x: Int) { + if (x != null || x == null) { + + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/nullOrNotNull.kt.after b/idea/testData/quickfix/simplifyComparison/nullOrNotNull.kt.after new file mode 100644 index 00000000000..42766ba832b --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/nullOrNotNull.kt.after @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +fun foo(x: Int) { + if (true) { + + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt b/idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt new file mode 100644 index 00000000000..a0517b90e9f --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +fun foo(x: Int, arg: Boolean) { + if (arg && x != null) { + + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt.after b/idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt.after new file mode 100644 index 00000000000..a4a89723ae5 --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt.after @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +fun foo(x: Int, arg: Boolean) { + if (arg) { + + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 1ec6dccbaa1..4b0dee8f0b4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -6194,6 +6194,39 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/simplifyComparison") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class SimplifyComparison extends AbstractQuickFixTest { + public void testAllFilesPresentInSimplifyComparison() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/simplifyComparison"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); + } + + @TestMetadata("doubleNull.kt") + public void testDoubleNull() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/doubleNull.kt"); + doTest(fileName); + } + + @TestMetadata("notNull.kt") + public void testNotNull() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/notNull.kt"); + doTest(fileName); + } + + @TestMetadata("nullOrNotNull.kt") + public void testNullOrNotNull() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/nullOrNotNull.kt"); + doTest(fileName); + } + + @TestMetadata("somethingAndNotNull.kt") + public void testSomethingAndNotNull() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/supercalls") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)