diff --git a/idea/src/org/jetbrains/jet/plugin/intentions/SwapBinaryExpression.kt b/idea/src/org/jetbrains/jet/plugin/intentions/SwapBinaryExpression.kt index c927b810a37..30770fa5550 100644 --- a/idea/src/org/jetbrains/jet/plugin/intentions/SwapBinaryExpression.kt +++ b/idea/src/org/jetbrains/jet/plugin/intentions/SwapBinaryExpression.kt @@ -21,6 +21,7 @@ import org.jetbrains.jet.lang.psi.JetBinaryExpression import org.jetbrains.jet.lang.psi.JetPsiFactory import org.jetbrains.jet.lang.psi.JetExpression import org.jetbrains.jet.plugin.intentions.SwapBinaryExpression.Position.* +import org.jetbrains.jet.plugin.util.JetPsiPrecedences public class SwapBinaryExpression : JetSelfTargetingIntention( "swap.binary.expression", javaClass() @@ -35,16 +36,24 @@ public class SwapBinaryExpression : JetSelfTargetingIntention if (left is JetBinaryExpression) getInnermostOperand(left, NEXT_RIGHT) else left as JetExpression - FIRST_RIGHT -> if (right is JetBinaryExpression) getInnermostOperand(right, NEXT_LEFT) else right as JetExpression - NEXT_LEFT -> if (left is JetBinaryExpression) getInnermostOperand(left, NEXT_LEFT) else left as JetExpression - NEXT_RIGHT -> if (right is JetBinaryExpression) getInnermostOperand(right, NEXT_RIGHT) else right as JetExpression + FIRST_LEFT -> if (leftPrecedence < parentPrecedence) left + else if (left is JetBinaryExpression) getInnermostOperand(left, NEXT_RIGHT) + else left as JetExpression + FIRST_RIGHT -> if (rightPrecedence < parentPrecedence) right + else if (right is JetBinaryExpression) getInnermostOperand(right, NEXT_LEFT) + else right as JetExpression + NEXT_LEFT -> if (leftPrecedence < parentPrecedence || left !is JetBinaryExpression) left + else getInnermostOperand(left, NEXT_LEFT) + NEXT_RIGHT -> if (rightPrecedence < parentPrecedence || right !is JetBinaryExpression) right + else getInnermostOperand(right, NEXT_RIGHT) } } diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence.kt b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence.kt new file mode 100644 index 00000000000..e2ab9ea2f5f --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence.kt @@ -0,0 +1,3 @@ +fun main() { + val rabbit = 1 == 2 || 3 == 5 +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence.kt.after b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence.kt.after new file mode 100644 index 00000000000..c3b4bc463c7 --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence.kt.after @@ -0,0 +1,3 @@ +fun main() { + val rabbit = 3 == 5 || 1 == 2 +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence2.kt b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence2.kt new file mode 100644 index 00000000000..d68de92bbb5 --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence2.kt @@ -0,0 +1,3 @@ +fun main() { + val rabbit = 4 + 2 * 5 +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence2.kt.after b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence2.kt.after new file mode 100644 index 00000000000..5834037382e --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence2.kt.after @@ -0,0 +1,3 @@ +fun main() { + val rabbit = 4 + 5 * 2 +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence3.kt b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence3.kt new file mode 100644 index 00000000000..7ca3ef11328 --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence3.kt @@ -0,0 +1,3 @@ +fun main() { + val rabbit = true || false && 1 + 2 == 3 || false +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence3.kt.after b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence3.kt.after new file mode 100644 index 00000000000..a16dc0a1d91 --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence3.kt.after @@ -0,0 +1,3 @@ +fun main() { + val rabbit = true || false && 3 == 1 + 2 || false +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence4.kt b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence4.kt new file mode 100644 index 00000000000..94c3e6dba01 --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence4.kt @@ -0,0 +1,3 @@ +fun main() { + val rabbit = true || false && 3 == 1 + 2 || false +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence4.kt.after b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence4.kt.after new file mode 100644 index 00000000000..9ddacae70fc --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence4.kt.after @@ -0,0 +1,3 @@ +fun main() { + val rabbit = true || false || false && 3 == 1 + 2 +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence5.kt b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence5.kt new file mode 100644 index 00000000000..e2559a6920a --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence5.kt @@ -0,0 +1,3 @@ +fun main() { + val rabbit = 4 + 2 * 5 + 1 +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence5.kt.after b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence5.kt.after new file mode 100644 index 00000000000..d9c2887b873 --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence5.kt.after @@ -0,0 +1,3 @@ +fun main() { + val rabbit = 4 + 1 + 2 * 5 +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence6.kt b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence6.kt new file mode 100644 index 00000000000..95c6175e54d --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence6.kt @@ -0,0 +1,3 @@ +fun main() { + val rabbit = 4 + 2 == 12 || true && 5 + 5 == 10 +} \ No newline at end of file diff --git a/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence6.kt.after b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence6.kt.after new file mode 100644 index 00000000000..ae13b6909a4 --- /dev/null +++ b/idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence6.kt.after @@ -0,0 +1,3 @@ +fun main() { + val rabbit = true && 5 + 5 == 10 || 4 + 2 == 12 +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java index f405ba3294f..822037a79e5 100644 --- a/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/intentions/CodeTransformationTestGenerated.java @@ -3365,6 +3365,36 @@ public class CodeTransformationTestGenerated extends AbstractCodeTransformationT doTestSwapBinaryExpression("idea/testData/intentions/swapBinaryExpression/multipleOperands.kt"); } + @TestMetadata("multipleOperandsWithDifferentPrecedence.kt") + public void testMultipleOperandsWithDifferentPrecedence() throws Exception { + doTestSwapBinaryExpression("idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence.kt"); + } + + @TestMetadata("multipleOperandsWithDifferentPrecedence2.kt") + public void testMultipleOperandsWithDifferentPrecedence2() throws Exception { + doTestSwapBinaryExpression("idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence2.kt"); + } + + @TestMetadata("multipleOperandsWithDifferentPrecedence3.kt") + public void testMultipleOperandsWithDifferentPrecedence3() throws Exception { + doTestSwapBinaryExpression("idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence3.kt"); + } + + @TestMetadata("multipleOperandsWithDifferentPrecedence4.kt") + public void testMultipleOperandsWithDifferentPrecedence4() throws Exception { + doTestSwapBinaryExpression("idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence4.kt"); + } + + @TestMetadata("multipleOperandsWithDifferentPrecedence5.kt") + public void testMultipleOperandsWithDifferentPrecedence5() throws Exception { + doTestSwapBinaryExpression("idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence5.kt"); + } + + @TestMetadata("multipleOperandsWithDifferentPrecedence6.kt") + public void testMultipleOperandsWithDifferentPrecedence6() throws Exception { + doTestSwapBinaryExpression("idea/testData/intentions/swapBinaryExpression/multipleOperandsWithDifferentPrecedence6.kt"); + } + @TestMetadata("multiply.kt") public void testMultiply() throws Exception { doTestSwapBinaryExpression("idea/testData/intentions/swapBinaryExpression/multiply.kt");