From 8b135c12e7465fe7316fc885020bb14dfec91a37 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 13 Sep 2017 09:55:39 +0300 Subject: [PATCH] Delete useless assert() after simplify comparison #KT-14695 Fixed --- .../SimplifyBooleanWithConstantsIntention.kt | 15 ++++++++++++++- .../idea/quickfix/SimplifyComparisonFix.kt | 11 +++++++---- .../simplifyBooleanWithConstants/assert.kt | 5 +++++ .../assert.kt.after | 4 ++++ .../simplifyComparison/withAssertion.kt | 6 ++++++ .../simplifyComparison/withAssertion.kt.after | 5 +++++ .../simplifyComparison/withAssertion2.kt | 6 ++++++ .../simplifyComparison/withAssertion2.kt.after | 5 +++++ .../simplifyComparison/withAssertion3.kt | 6 ++++++ .../simplifyComparison/withAssertion3.kt.after | 6 ++++++ .../intentions/IntentionTestGenerated.java | 6 ++++++ .../idea/quickfix/QuickFixTestGenerated.java | 18 ++++++++++++++++++ 12 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/assert.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/assert.kt.after create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion.kt create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion.kt.after create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion2.kt create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion2.kt.after create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion3.kt create mode 100644 idea/testData/quickfix/simplifyComparison/withAssertion3.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt index d6094aff21f..27c020d4cc2 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/SimplifyBooleanWithConstantsIntention.kt @@ -24,10 +24,13 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.copied import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection +import org.jetbrains.kotlin.idea.intentions.loopToCallChain.isTrueConstant import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.resolve.CompileTimeConstantUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getType +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.types.isFlexible class SimplifyBooleanWithConstantsInspection : IntentionBasedInspection(SimplifyBooleanWithConstantsIntention::class) @@ -58,7 +61,17 @@ class SimplifyBooleanWithConstantsIntention : SelfTargetingOffsetIndependentInte override fun applyTo(element: KtBinaryExpression, editor: Editor?) { val topBinary = PsiTreeUtil.getTopmostParentOfType(element, KtBinaryExpression::class.java) ?: element val simplified = toSimplifiedExpression(topBinary) - topBinary.replace(KtPsiUtil.safeDeparenthesize(simplified, true)) + val result = topBinary.replaced(KtPsiUtil.safeDeparenthesize(simplified, true)) + removeRedundantAssertion(result) + } + + internal fun removeRedundantAssertion(expression: KtExpression) { + val callExpression = expression.getNonStrictParentOfType() ?: return + val fqName = callExpression.getCallableDescriptor()?.fqNameOrNull() + val valueArguments = callExpression.valueArguments + val isRedundant = fqName?.asString() == "kotlin.assert" && + valueArguments.singleOrNull()?.getArgumentExpression().isTrueConstant() + if (isRedundant) callExpression.delete() } private fun toSimplifiedExpression(expression: KtExpression): KtExpression { diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt index 84de5c4e90c..48d715e5b19 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SimplifyComparisonFix.kt @@ -21,6 +21,7 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters2 +import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.intentions.SimplifyBooleanWithConstantsIntention import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtExpression @@ -35,15 +36,17 @@ class SimplifyComparisonFix(element: KtExpression, val value: Boolean) : KotlinQ override fun invoke(project: Project, editor: Editor?, file: KtFile) { val element = element ?: return - val parent = element.parent val replacement = KtPsiFactory(element).createExpression("$value") - element.replace(replacement) + val result = element.replaced(replacement) - val booleanExpression = parent.getNonStrictParentOfType() ?: return + val booleanExpression = result.getNonStrictParentOfType() val simplifyIntention = SimplifyBooleanWithConstantsIntention() - if (simplifyIntention.isApplicableTo(booleanExpression)) { + if (booleanExpression != null && simplifyIntention.isApplicableTo(booleanExpression)) { simplifyIntention.applyTo(booleanExpression, editor) } + else { + simplifyIntention.removeRedundantAssertion(result) + } } companion object : KotlinSingleIntentionActionFactory() { diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt b/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt new file mode 100644 index 00000000000..6d484a39085 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME + +fun foo() { + assert(true || false) +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt.after new file mode 100644 index 00000000000..f6a597af433 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/assert.kt.after @@ -0,0 +1,4 @@ +// WITH_RUNTIME + +fun foo() { +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion.kt b/idea/testData/quickfix/simplifyComparison/withAssertion.kt new file mode 100644 index 00000000000..6ec41956ba2 --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion.kt @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" + assert(s != null) +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion.kt.after b/idea/testData/quickfix/simplifyComparison/withAssertion.kt.after new file mode 100644 index 00000000000..0e80094993f --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion.kt.after @@ -0,0 +1,5 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion2.kt b/idea/testData/quickfix/simplifyComparison/withAssertion2.kt new file mode 100644 index 00000000000..223bba2b635 --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion2.kt @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" + assert(s != null && true) +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion2.kt.after b/idea/testData/quickfix/simplifyComparison/withAssertion2.kt.after new file mode 100644 index 00000000000..0e80094993f --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion2.kt.after @@ -0,0 +1,5 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion3.kt b/idea/testData/quickfix/simplifyComparison/withAssertion3.kt new file mode 100644 index 00000000000..ac670bad4ab --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion3.kt @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" + assert(s != null && false) +} \ No newline at end of file diff --git a/idea/testData/quickfix/simplifyComparison/withAssertion3.kt.after b/idea/testData/quickfix/simplifyComparison/withAssertion3.kt.after new file mode 100644 index 00000000000..56a488d9a11 --- /dev/null +++ b/idea/testData/quickfix/simplifyComparison/withAssertion3.kt.after @@ -0,0 +1,6 @@ +// "Simplify comparison" "true" +// WITH_RUNTIME +fun test() { + val s = "" + assert(false) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 904ea194c6a..f004cf2f427 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -14681,6 +14681,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/simplifyBooleanWithConstants"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("assert.kt") + public void testAssert() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/simplifyBooleanWithConstants/assert.kt"); + doTest(fileName); + } + @TestMetadata("deeplyParenthesized.kt") public void testDeeplyParenthesized() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/simplifyBooleanWithConstants/deeplyParenthesized.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 2af928600ae..af726b8a80b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -9529,6 +9529,24 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/somethingAndNotNull.kt"); doTest(fileName); } + + @TestMetadata("withAssertion.kt") + public void testWithAssertion() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/withAssertion.kt"); + doTest(fileName); + } + + @TestMetadata("withAssertion2.kt") + public void testWithAssertion2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/withAssertion2.kt"); + doTest(fileName); + } + + @TestMetadata("withAssertion3.kt") + public void testWithAssertion3() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/simplifyComparison/withAssertion3.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/quickfix/specifyOverrideExplicitly")