diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/codeTransformations/branchedTransformations/WhenUtils.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/codeTransformations/branchedTransformations/WhenUtils.java index cc79bb83b4a..53bea0419bc 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/codeTransformations/branchedTransformations/WhenUtils.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/codeTransformations/branchedTransformations/WhenUtils.java @@ -28,9 +28,14 @@ public class WhenUtils { if (condition instanceof JetBinaryExpression) { JetBinaryExpression binaryExpression = (JetBinaryExpression) condition; + JetExpression lhs = binaryExpression.getLeft(); + IElementType op = binaryExpression.getOperationToken(); - if (op == JetTokens.EQEQ || op == JetTokens.IN_KEYWORD || op == JetTokens.NOT_IN) { - return ((JetBinaryExpression) condition).getLeft(); + if (op == JetTokens.IN_KEYWORD || op == JetTokens.NOT_IN) { + return lhs; + } + if (op == JetTokens.EQEQ) { + return lhs instanceof JetSimpleNameExpression ? lhs : binaryExpression.getRight(); } } @@ -144,6 +149,7 @@ public class WhenUtils { else if (conditionExpression instanceof JetBinaryExpression) { JetBinaryExpression binaryExpression = (JetBinaryExpression) conditionExpression; + JetExpression lhs = binaryExpression.getLeft(); JetExpression rhs = binaryExpression.getRight(); IElementType op = binaryExpression.getOperationToken(); @@ -154,7 +160,11 @@ public class WhenUtils { builder.range(rhs, true); } else if (op == JetTokens.EQEQ) { - builder.condition(rhs); + if (JetPsiMatcher.checkElementMatch(subject, lhs)) { + builder.condition(rhs); + } else { + builder.condition(lhs); + } } else assert false : TRANSFORM_WITHOUT_CHECK; } diff --git a/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithMultipleConditionTypes.kt b/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithMultipleConditionTypes.kt index 6babe750cc6..82d48bf0783 100644 --- a/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithMultipleConditionTypes.kt +++ b/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithMultipleConditionTypes.kt @@ -5,6 +5,7 @@ fun test(n: Int): String { n in 10..100 -> "average" n in 100..1000 -> "big" n == 1000000 -> "million" + 2000000 == n -> "two millions" n !in -100..-10 -> "good" n is Int -> "unknown" else -> "unknown" diff --git a/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithMultipleConditionTypes.kt.after b/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithMultipleConditionTypes.kt.after index ea4d863fb5d..234c61995c4 100644 --- a/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithMultipleConditionTypes.kt.after +++ b/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithMultipleConditionTypes.kt.after @@ -5,6 +5,7 @@ fun test(n: Int): String { in 10..100 -> "average" in 100..1000 -> "big" 1000000 -> "million" + 2000000 -> "two millions" !in -100..-10 -> "good" is Int -> "unknown" else -> "unknown" diff --git a/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithSwappedEqualityTests.kt b/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithSwappedEqualityTests.kt new file mode 100644 index 00000000000..74a2f6a0f6e --- /dev/null +++ b/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithSwappedEqualityTests.kt @@ -0,0 +1,8 @@ +fun test(n: Int): String { + return when { + n == 0 -> "zero" + 1 == n -> "one" + n == 2 -> "two" + else -> "unknown" + } +} \ No newline at end of file diff --git a/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithSwappedEqualityTests.kt.after b/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithSwappedEqualityTests.kt.after new file mode 100644 index 00000000000..dba5a8e64d6 --- /dev/null +++ b/idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithSwappedEqualityTests.kt.after @@ -0,0 +1,8 @@ +fun test(n: Int): String { + return when (n) { + 0 -> "zero" + 1 -> "one" + 2 -> "two" + else -> "unknown" + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/codeTransformations/CodeTransformationsTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/codeTransformations/CodeTransformationsTestGenerated.java index e13ed3d5a4c..458a15e5641 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/codeTransformations/CodeTransformationsTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/codeTransformations/CodeTransformationsTestGenerated.java @@ -585,6 +585,11 @@ public class CodeTransformationsTestGenerated extends AbstractCodeTransformation doTestIntroduceWhenSubject("idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithSubject.kt"); } + @TestMetadata("whenWithSwappedEqualityTests.kt") + public void testWhenWithSwappedEqualityTests() throws Exception { + doTestIntroduceWhenSubject("idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithSwappedEqualityTests.kt"); + } + @TestMetadata("whenWithUnmatchedCandidateSubjects.kt") public void testWhenWithUnmatchedCandidateSubjects() throws Exception { doTestIntroduceWhenSubject("idea/testData/codeInsight/codeTransformations/branched/when/introduceSubject/whenWithUnmatchedCandidateSubjects.kt");