From 0feb0d35e6ee7af269fcc044e41970ad76e63958 Mon Sep 17 00:00:00 2001 From: Tal Man Date: Wed, 9 Apr 2014 14:45:42 -0400 Subject: [PATCH] Intention to simplify boolean expressions that have expressions in them that can be simplified to constants --- .../jet/generators/tests/GenerateTests.kt | 1 + .../after.kt.template | 3 + .../before.kt.template | 3 + .../description.html | 5 + idea/src/META-INF/plugin.xml | 5 + .../jetbrains/jet/plugin/JetBundle.properties | 2 + .../SimplifyBooleanWithConstantsIntention.kt | 137 ++++++++++++++++++ .../inapplicableNoConstants.kt | 4 + .../inapplicableNotBinary.kt | 4 + .../inapplicableUsesVals.kt | 6 + .../inapplicableUsesVals2.kt | 6 + .../inapplicableUsesVals3.kt | 6 + .../reduceableBinary.kt | 3 + .../reduceableBinary.kt.after | 3 + .../reduceableBinary2.kt | 3 + .../reduceableBinary2.kt.after | 3 + .../reduceableBinary3.kt | 3 + .../reduceableBinary3.kt.after | 3 + .../reduceableBinaryWithParenthese.kt | 4 + .../reduceableBinaryWithParenthese.kt.after | 4 + .../simplifyBooleanWithConstants/simple.kt | 3 + .../simple.kt.after | 3 + .../simpleWithMoreBinaries.kt | 3 + .../simpleWithMoreBinaries.kt.after | 3 + .../simpleWithMoreBinaries2.kt | 3 + .../simpleWithMoreBinaries2.kt.after | 3 + .../simpleWithMoreBinaries3.kt | 3 + .../simpleWithMoreBinaries3.kt.after | 3 + .../simpleWithMoreBinariesAndParentheses.kt | 3 + ...pleWithMoreBinariesAndParentheses.kt.after | 3 + .../simpleWithMoreBinariesAndParentheses2.kt | 5 + ...leWithMoreBinariesAndParentheses2.kt.after | 5 + .../simpleWithMoreBinariesAndParentheses3.kt | 3 + ...leWithMoreBinariesAndParentheses3.kt.after | 3 + .../simpleWithNonsensical2.kt | 3 + .../simpleWithNonsensical2.kt.after | 3 + .../simpleWithParentheses.kt | 3 + .../simpleWithParentheses.kt.after | 3 + .../simpleWithParentheses2.kt | 3 + .../simpleWithParentheses2.kt.after | 3 + .../AbstractCodeTransformationTest.java | 4 + .../CodeTransformationTestGenerated.java | 106 +++++++++++++- 42 files changed, 381 insertions(+), 1 deletion(-) create mode 100644 idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/after.kt.template create mode 100644 idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/before.kt.template create mode 100644 idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/description.html create mode 100644 idea/src/org/jetbrains/jet/plugin/intentions/SimplifyBooleanWithConstantsIntention.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/inapplicableNoConstants.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/inapplicableNotBinary.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals2.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals3.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary2.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary2.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary3.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary3.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinaryWithParenthese.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinaryWithParenthese.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simple.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simple.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries2.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries2.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries3.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries3.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses2.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses2.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses3.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses3.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithNonsensical2.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithNonsensical2.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses.kt.after create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses2.kt create mode 100644 idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses2.kt.after diff --git a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt index f94762b0cf7..1f2a3d545aa 100644 --- a/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/jet/generators/tests/GenerateTests.kt @@ -389,6 +389,7 @@ fun main(args: Array) { model("intentions/splitIf", testMethod = "doTestSplitIf") model("intentions/replaceWithOperatorAssign", testMethod = "doTestReplaceWithOperatorAssign") model("intentions/replaceWithTraditionalAssignment", testMethod = "doTestReplaceWithTraditionalAssignment") + model("intentions/simplifyBooleanWithConstants", testMethod = "doTestSimplifyBooleanWithConstants") } testClass(javaClass()) { diff --git a/idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/after.kt.template b/idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/after.kt.template new file mode 100644 index 00000000000..32311bcaef7 --- /dev/null +++ b/idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/after.kt.template @@ -0,0 +1,3 @@ +fun foo() { + val x = y +} \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/before.kt.template b/idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/before.kt.template new file mode 100644 index 00000000000..c83e94d4561 --- /dev/null +++ b/idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/before.kt.template @@ -0,0 +1,3 @@ +fun foo() { + val x = 3 > 2 && y && true +} \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/description.html b/idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/description.html new file mode 100644 index 00000000000..b1a70490a7c --- /dev/null +++ b/idea/resources/intentionDescriptions/SimplifyBooleanWithConstantsIntention/description.html @@ -0,0 +1,5 @@ + + +This intention simplifies a boolean expression that has parts which can be reduced to constants + + \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 3c317df1cba..4bacf5d97d7 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -627,6 +627,11 @@ org.jetbrains.jet.plugin.intentions.ConvertNegatedExpressionWithDemorgansLawIntention Kotlin + + + org.jetbrains.jet.plugin.intentions.SimplifyBooleanWithConstantsIntention + Kotlin + ( + "simplify.boolean.with.constants", javaClass()) { + + private var topParent : JetBinaryExpression? = null + + override fun isApplicableTo(element: JetBinaryExpression): Boolean { + topParent = JetPsiUtil.getTopmostParentOfTypes(element, element.javaClass) as JetBinaryExpression? ?: element + return areThereExpressionsToBeSimplified(topParent) + } + + private fun areThereExpressionsToBeSimplified(element: JetExpression?) : Boolean { + if (element == null) return false + when (element) { + is JetParenthesizedExpression -> return areThereExpressionsToBeSimplified(element.getExpression()) + is JetBinaryExpression -> { + val op = element.getOperationToken() + if ((op == JetTokens.ANDAND || op == JetTokens.OROR) && + (areThereExpressionsToBeSimplified(element.getLeft()) || + areThereExpressionsToBeSimplified(element.getRight()))) return true + } + } + return element.canBeReducedToBooleanConstant(null) + } + + override fun applyTo(element: JetBinaryExpression, editor: Editor) { + // we know from isApplicableTo that topParent is not null + val simplified = simplifyBoolean(topParent!!) + if (simplified is JetParenthesizedExpression) { + val expr = simplified.getExpression() + if (expr != null) { + // this extra check is for the case where there are empty parentheses () + topParent!!.replace(expr) + return + } + } + topParent!!.replace(simplified) + } + + private fun simplifyBoolean(element: JetExpression) : JetExpression { + if (element.canBeReducedToTrue()) + return JetPsiFactory.createExpression(element.getProject(), "true") + if (element.canBeReducedToFalse()) + return JetPsiFactory.createExpression(element.getProject(), "false") + when (element) { + is JetParenthesizedExpression -> { + val expr = element.getExpression() + if (expr == null) return element + val simplified = simplifyBoolean(expr) + if (expr == simplified) return element + if (simplified is JetBinaryExpression) { + val simpText = simplified.getText() + if (simpText == null) return element + // wrap in new parentheses to keep the user's original format + return JetPsiFactory.createExpression(element.getProject(), "($simpText)") + } + // if we now have a simpleName, constant, or parenthesized we don't need parentheses + return simplified + } + is JetBinaryExpression -> { + val left = element.getLeft() + val right = element.getRight() + val op = element.getOperationToken() + if (left == null || right == null || op == null || (op != JetTokens.ANDAND && op != JetTokens.OROR)) + return element + + val simpleLeft = simplifyBoolean(left) + val simpleRight = simplifyBoolean(right) + if (simpleLeft.canBeReducedToTrue() || simpleLeft.canBeReducedToFalse()) + return simplifyBooleanBinaryExpressionWithConstantOperand(simpleLeft, simpleRight, op) + if (simpleRight.canBeReducedToTrue() || simpleRight.canBeReducedToFalse()) + return simplifyBooleanBinaryExpressionWithConstantOperand(simpleRight, simpleLeft, op) + + val opText = element.getOperationReference().getText() + if (opText == null) return element + return JetPsiFactory.createBinaryExpression(element.getProject(), simpleLeft, opText, simpleRight) + } + else -> return element + } + } + + private fun simplifyBooleanBinaryExpressionWithConstantOperand( + booleanConstantOperand: JetExpression, + otherOperand: JetExpression, + operation: IElementType + ): JetExpression { + assert(booleanConstantOperand.canBeReducedToBooleanConstant(null), "should only be called when we know it can be reduced") + if (booleanConstantOperand.canBeReducedToTrue() && operation == JetTokens.OROR) + return JetPsiFactory.createExpression(otherOperand.getProject(), "true") + if (booleanConstantOperand.canBeReducedToFalse() && operation == JetTokens.ANDAND) + return JetPsiFactory.createExpression(otherOperand.getProject(), "false") + return simplifyBoolean(otherOperand) + } + + private fun JetExpression.canBeReducedToBooleanConstant(constant: Boolean?): Boolean { + val bindingContext = AnalyzerFacadeWithCache.getContextForElement(this) + val trace = DelegatingBindingTrace(bindingContext, "trace for constant check") + return CompileTimeConstantUtils.canBeReducedToBooleanConstant(this, trace, constant) + } + + private fun JetExpression.canBeReducedToTrue(): Boolean { + return this.canBeReducedToBooleanConstant(true) + } + + private fun JetExpression.canBeReducedToFalse(): Boolean { + return this.canBeReducedToBooleanConstant(false) + } +} diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableNoConstants.kt b/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableNoConstants.kt new file mode 100644 index 00000000000..20dd8631584 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableNoConstants.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +fun foo(y: Boolean) { + y && y || y +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableNotBinary.kt b/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableNotBinary.kt new file mode 100644 index 00000000000..6aa592b3e72 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableNotBinary.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +fun foo(y: Boolean) { + true +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals.kt b/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals.kt new file mode 100644 index 00000000000..834ca1b45e6 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals.kt @@ -0,0 +1,6 @@ +// IS_APPLICABLE: false +fun foo(y: Boolean) { + val x = 4 + val z = 5 + x < z +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals2.kt b/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals2.kt new file mode 100644 index 00000000000..d70bd6adc27 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals2.kt @@ -0,0 +1,6 @@ +// IS_APPLICABLE: false +fun foo(y: Boolean) { + val x = 4 + val z = 5 + x == z || x != z +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals3.kt b/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals3.kt new file mode 100644 index 00000000000..21f731ec2a5 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals3.kt @@ -0,0 +1,6 @@ +// IS_APPLICABLE: false +fun foo(y: Boolean) { + val x = true + val z = false + x && z +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary.kt b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary.kt new file mode 100644 index 00000000000..7a394a65216 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + 2 > 1 +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary.kt.after new file mode 100644 index 00000000000..c15837d7d4a --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + true +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary2.kt b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary2.kt new file mode 100644 index 00000000000..ae09d0f23f2 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary2.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + 2 > 1 && y || y || (3 + 3 > 10) +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary2.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary2.kt.after new file mode 100644 index 00000000000..501d2965670 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary2.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + y || y +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary3.kt b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary3.kt new file mode 100644 index 00000000000..3830c1f8992 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary3.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + 3 != 3 && 2 > 1 || y +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary3.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary3.kt.after new file mode 100644 index 00000000000..545846c7ac9 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary3.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + y +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinaryWithParenthese.kt b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinaryWithParenthese.kt new file mode 100644 index 00000000000..7c864ca3f24 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinaryWithParenthese.kt @@ -0,0 +1,4 @@ +fun foo(y: Boolean) { + val x = 3 + x != x && (2 > 1 || y) +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinaryWithParenthese.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinaryWithParenthese.kt.after new file mode 100644 index 00000000000..de547d50fbb --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinaryWithParenthese.kt.after @@ -0,0 +1,4 @@ +fun foo(y: Boolean) { + val x = 3 + x != x +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simple.kt b/idea/testData/intentions/simplifyBooleanWithConstants/simple.kt new file mode 100644 index 00000000000..4dd678b46cf --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simple.kt @@ -0,0 +1,3 @@ +fun foo() { + val x = true && false || true +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simple.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/simple.kt.after new file mode 100644 index 00000000000..d0087ee87c7 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simple.kt.after @@ -0,0 +1,3 @@ +fun foo() { + val x = true +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries.kt b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries.kt new file mode 100644 index 00000000000..55948f5e210 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + (y && false) || (y && y && true && (y && true)) && false && true +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries.kt.after new file mode 100644 index 00000000000..68065ba5581 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + false +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries2.kt b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries2.kt new file mode 100644 index 00000000000..543ae6d89f8 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries2.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + false || false || y || y || false || y && y || y +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries2.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries2.kt.after new file mode 100644 index 00000000000..23af54238c6 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries2.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + y || y || y && y || y +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries3.kt b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries3.kt new file mode 100644 index 00000000000..c685f38e176 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries3.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + y || false && true || false || false || false || y && true +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries3.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries3.kt.after new file mode 100644 index 00000000000..501d2965670 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries3.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + y || y +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses.kt b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses.kt new file mode 100644 index 00000000000..42eebf87be1 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + false || false || y || y || false && (y && y || true) +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses.kt.after new file mode 100644 index 00000000000..501d2965670 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + y || y +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses2.kt b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses2.kt new file mode 100644 index 00000000000..ca40f2d7143 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses2.kt @@ -0,0 +1,5 @@ +fun foo(y: Boolean) { + bar() && y || (y && true && bar()) || false +} + +fun bar(): Boolean = false \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses2.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses2.kt.after new file mode 100644 index 00000000000..1baa6dbc722 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses2.kt.after @@ -0,0 +1,5 @@ +fun foo(y: Boolean) { + bar() && y || (y && bar()) +} + +fun bar(): Boolean = false \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses3.kt b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses3.kt new file mode 100644 index 00000000000..b05a98ce855 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses3.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + ((y && true) || false) && (true && (y && (y && (y ||false)))) +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses3.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses3.kt.after new file mode 100644 index 00000000000..5f6fcefd08b --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses3.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + y && (y && (y && y)) +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithNonsensical2.kt b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithNonsensical2.kt new file mode 100644 index 00000000000..d75b39f588c --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithNonsensical2.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + true && () && y +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithNonsensical2.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithNonsensical2.kt.after new file mode 100644 index 00000000000..d34b9a8986e --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithNonsensical2.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + () && y +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses.kt b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses.kt new file mode 100644 index 00000000000..eacee43d5bd --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + (false) && true +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses.kt.after new file mode 100644 index 00000000000..68065ba5581 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + false +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses2.kt b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses2.kt new file mode 100644 index 00000000000..e231d4c7964 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses2.kt @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + y || (y && true) +} \ No newline at end of file diff --git a/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses2.kt.after b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses2.kt.after new file mode 100644 index 00000000000..501d2965670 --- /dev/null +++ b/idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses2.kt.after @@ -0,0 +1,3 @@ +fun foo(y: Boolean) { + y || y +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java b/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java index b6812a17f49..42ad6aae972 100644 --- a/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/intentions/AbstractCodeTransformationTest.java @@ -227,6 +227,10 @@ public abstract class AbstractCodeTransformationTest extends LightCodeInsightTes doTestIntention(path, new ReplaceWithTraditionalAssignmentIntention()); } + public void doTestSimplifyBooleanWithConstants(@NotNull String path) throws Exception { + doTestIntention(path, new SimplifyBooleanWithConstantsIntention()); + } + private void doTestIntention(@NotNull String path, @NotNull IntentionAction intentionAction) throws Exception { configureByFile(path); diff --git a/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java index dbaee1285b4..096584d013d 100644 --- a/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java @@ -30,7 +30,7 @@ import org.jetbrains.jet.plugin.intentions.AbstractCodeTransformationTest; /** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") -@InnerTestClasses({CodeTransformationTestGenerated.ElvisToIfThen.class, CodeTransformationTestGenerated.IfThenToElvis.class, CodeTransformationTestGenerated.SafeAccessToIfThen.class, CodeTransformationTestGenerated.IfThenToSafeAccess.class, CodeTransformationTestGenerated.IfToAssignment.class, CodeTransformationTestGenerated.IfToReturn.class, CodeTransformationTestGenerated.IfToReturnAsymmetrically.class, CodeTransformationTestGenerated.WhenToAssignment.class, CodeTransformationTestGenerated.WhenToReturn.class, CodeTransformationTestGenerated.AssignmentToIf.class, CodeTransformationTestGenerated.AssignmentToWhen.class, CodeTransformationTestGenerated.PropertyToIf.class, CodeTransformationTestGenerated.PropertyToWhen.class, CodeTransformationTestGenerated.ReturnToIf.class, CodeTransformationTestGenerated.ReturnToWhen.class, CodeTransformationTestGenerated.IfToWhen.class, CodeTransformationTestGenerated.WhenToIf.class, CodeTransformationTestGenerated.Flatten.class, CodeTransformationTestGenerated.Merge.class, CodeTransformationTestGenerated.IntroduceSubject.class, CodeTransformationTestGenerated.EliminateSubject.class, CodeTransformationTestGenerated.Split.class, CodeTransformationTestGenerated.Join.class, CodeTransformationTestGenerated.ConvertMemberToExtension.class, CodeTransformationTestGenerated.ReconstructedType.class, CodeTransformationTestGenerated.RemoveUnnecessaryParentheses.class, CodeTransformationTestGenerated.ReplaceWithDotQualifiedMethodCall.class, CodeTransformationTestGenerated.ReplaceWithInfixFunctionCall.class, CodeTransformationTestGenerated.RemoveCurlyBracesFromTemplate.class, CodeTransformationTestGenerated.MoveLambdaInsideParentheses.class, CodeTransformationTestGenerated.MoveLambdaOutsideParentheses.class, CodeTransformationTestGenerated.ReplaceExplicitFunctionLiteralParamWithIt.class, CodeTransformationTestGenerated.ReplaceItWithExplicitFunctionLiteralParam.class, CodeTransformationTestGenerated.RemoveBraces.class, CodeTransformationTestGenerated.AddBraces.class, CodeTransformationTestGenerated.ReplaceGetIntention.class, CodeTransformationTestGenerated.ReplaceContainsIntention.class, CodeTransformationTestGenerated.ReplaceBinaryInfixIntention.class, CodeTransformationTestGenerated.ReplaceUnaryPrefixIntention.class, CodeTransformationTestGenerated.ReplaceInvokeIntention.class, CodeTransformationTestGenerated.SimplifyNegatedBinaryExpressionIntention.class, CodeTransformationTestGenerated.ConvertNegatedBooleanSequence.class, CodeTransformationTestGenerated.ConvertNegatedExpressionWithDemorgansLaw.class, CodeTransformationTestGenerated.SwapBinaryExpression.class, CodeTransformationTestGenerated.SplitIf.class, CodeTransformationTestGenerated.ReplaceWithOperatorAssign.class, CodeTransformationTestGenerated.ReplaceWithTraditionalAssignment.class}) +@InnerTestClasses({CodeTransformationTestGenerated.ElvisToIfThen.class, CodeTransformationTestGenerated.IfThenToElvis.class, CodeTransformationTestGenerated.SafeAccessToIfThen.class, CodeTransformationTestGenerated.IfThenToSafeAccess.class, CodeTransformationTestGenerated.IfToAssignment.class, CodeTransformationTestGenerated.IfToReturn.class, CodeTransformationTestGenerated.IfToReturnAsymmetrically.class, CodeTransformationTestGenerated.WhenToAssignment.class, CodeTransformationTestGenerated.WhenToReturn.class, CodeTransformationTestGenerated.AssignmentToIf.class, CodeTransformationTestGenerated.AssignmentToWhen.class, CodeTransformationTestGenerated.PropertyToIf.class, CodeTransformationTestGenerated.PropertyToWhen.class, CodeTransformationTestGenerated.ReturnToIf.class, CodeTransformationTestGenerated.ReturnToWhen.class, CodeTransformationTestGenerated.IfToWhen.class, CodeTransformationTestGenerated.WhenToIf.class, CodeTransformationTestGenerated.Flatten.class, CodeTransformationTestGenerated.Merge.class, CodeTransformationTestGenerated.IntroduceSubject.class, CodeTransformationTestGenerated.EliminateSubject.class, CodeTransformationTestGenerated.Split.class, CodeTransformationTestGenerated.Join.class, CodeTransformationTestGenerated.ConvertMemberToExtension.class, CodeTransformationTestGenerated.ReconstructedType.class, CodeTransformationTestGenerated.RemoveUnnecessaryParentheses.class, CodeTransformationTestGenerated.ReplaceWithDotQualifiedMethodCall.class, CodeTransformationTestGenerated.ReplaceWithInfixFunctionCall.class, CodeTransformationTestGenerated.RemoveCurlyBracesFromTemplate.class, CodeTransformationTestGenerated.MoveLambdaInsideParentheses.class, CodeTransformationTestGenerated.MoveLambdaOutsideParentheses.class, CodeTransformationTestGenerated.ReplaceExplicitFunctionLiteralParamWithIt.class, CodeTransformationTestGenerated.ReplaceItWithExplicitFunctionLiteralParam.class, CodeTransformationTestGenerated.RemoveBraces.class, CodeTransformationTestGenerated.AddBraces.class, CodeTransformationTestGenerated.ReplaceGetIntention.class, CodeTransformationTestGenerated.ReplaceContainsIntention.class, CodeTransformationTestGenerated.ReplaceBinaryInfixIntention.class, CodeTransformationTestGenerated.ReplaceUnaryPrefixIntention.class, CodeTransformationTestGenerated.ReplaceInvokeIntention.class, CodeTransformationTestGenerated.SimplifyNegatedBinaryExpressionIntention.class, CodeTransformationTestGenerated.ConvertNegatedBooleanSequence.class, CodeTransformationTestGenerated.ConvertNegatedExpressionWithDemorgansLaw.class, CodeTransformationTestGenerated.SwapBinaryExpression.class, CodeTransformationTestGenerated.SplitIf.class, CodeTransformationTestGenerated.ReplaceWithOperatorAssign.class, CodeTransformationTestGenerated.ReplaceWithTraditionalAssignment.class, CodeTransformationTestGenerated.SimplifyBooleanWithConstants.class}) public class CodeTransformationTestGenerated extends AbstractCodeTransformationTest { @TestMetadata("idea/testData/intentions/branched/elvisToIfThen") public static class ElvisToIfThen extends AbstractCodeTransformationTest { @@ -3173,6 +3173,109 @@ public class CodeTransformationTestGenerated extends AbstractCodeTransformationT } + @TestMetadata("idea/testData/intentions/simplifyBooleanWithConstants") + public static class SimplifyBooleanWithConstants extends AbstractCodeTransformationTest { + public void testAllFilesPresentInSimplifyBooleanWithConstants() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/intentions/simplifyBooleanWithConstants"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("inapplicableNoConstants.kt") + public void testInapplicableNoConstants() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/inapplicableNoConstants.kt"); + } + + @TestMetadata("inapplicableNotBinary.kt") + public void testInapplicableNotBinary() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/inapplicableNotBinary.kt"); + } + + @TestMetadata("inapplicableUsesVals.kt") + public void testInapplicableUsesVals() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals.kt"); + } + + @TestMetadata("inapplicableUsesVals2.kt") + public void testInapplicableUsesVals2() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals2.kt"); + } + + @TestMetadata("inapplicableUsesVals3.kt") + public void testInapplicableUsesVals3() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/inapplicableUsesVals3.kt"); + } + + @TestMetadata("reduceableBinary.kt") + public void testReduceableBinary() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary.kt"); + } + + @TestMetadata("reduceableBinary2.kt") + public void testReduceableBinary2() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary2.kt"); + } + + @TestMetadata("reduceableBinary3.kt") + public void testReduceableBinary3() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinary3.kt"); + } + + @TestMetadata("reduceableBinaryWithParenthese.kt") + public void testReduceableBinaryWithParenthese() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/reduceableBinaryWithParenthese.kt"); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/simple.kt"); + } + + @TestMetadata("simpleWithMoreBinaries.kt") + public void testSimpleWithMoreBinaries() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries.kt"); + } + + @TestMetadata("simpleWithMoreBinaries2.kt") + public void testSimpleWithMoreBinaries2() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries2.kt"); + } + + @TestMetadata("simpleWithMoreBinaries3.kt") + public void testSimpleWithMoreBinaries3() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinaries3.kt"); + } + + @TestMetadata("simpleWithMoreBinariesAndParentheses.kt") + public void testSimpleWithMoreBinariesAndParentheses() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses.kt"); + } + + @TestMetadata("simpleWithMoreBinariesAndParentheses2.kt") + public void testSimpleWithMoreBinariesAndParentheses2() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses2.kt"); + } + + @TestMetadata("simpleWithMoreBinariesAndParentheses3.kt") + public void testSimpleWithMoreBinariesAndParentheses3() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/simpleWithMoreBinariesAndParentheses3.kt"); + } + + @TestMetadata("simpleWithNonsensical2.kt") + public void testSimpleWithNonsensical2() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/simpleWithNonsensical2.kt"); + } + + @TestMetadata("simpleWithParentheses.kt") + public void testSimpleWithParentheses() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses.kt"); + } + + @TestMetadata("simpleWithParentheses2.kt") + public void testSimpleWithParentheses2() throws Exception { + doTestSimplifyBooleanWithConstants("idea/testData/intentions/simplifyBooleanWithConstants/simpleWithParentheses2.kt"); + } + + } + public static Test suite() { TestSuite suite = new TestSuite("CodeTransformationTestGenerated"); suite.addTestSuite(ElvisToIfThen.class); @@ -3222,6 +3325,7 @@ public class CodeTransformationTestGenerated extends AbstractCodeTransformationT suite.addTestSuite(SplitIf.class); suite.addTestSuite(ReplaceWithOperatorAssign.class); suite.addTestSuite(ReplaceWithTraditionalAssignment.class); + suite.addTestSuite(SimplifyBooleanWithConstants.class); return suite; } }