diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/codeTransformations/branchedTransformations/IfWhenUtils.java b/idea/src/org/jetbrains/jet/plugin/codeInsight/codeTransformations/branchedTransformations/IfWhenUtils.java index 5d7fabec852..92d1562ebe6 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/codeTransformations/branchedTransformations/IfWhenUtils.java +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/codeTransformations/branchedTransformations/IfWhenUtils.java @@ -110,7 +110,12 @@ public class IfWhenUtils { } } while (currIfExpression != null); - ifExpression.replace(builder.toExpression(ifExpression.getProject())); + JetWhenExpression whenExpression = builder.toExpression(ifExpression.getProject()); + if (WhenUtils.checkIntroduceWhenSubject(whenExpression)) { + whenExpression = WhenUtils.introduceWhenSubject(whenExpression); + } + + ifExpression.replace(whenExpression); } private static String combineWhenConditions(JetWhenCondition[] conditions, JetExpression subject) { 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 fbe4d9236f2..5037371dee7 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 @@ -86,7 +86,8 @@ public class WhenUtils { return whenExpression.getSubjectExpression() instanceof JetSimpleNameExpression; } - public static void flattenWhen(@NotNull JetWhenExpression whenExpression) { + @NotNull + public static JetWhenExpression flattenWhen(@NotNull JetWhenExpression whenExpression) { JetExpression subjectExpression = whenExpression.getSubjectExpression(); JetExpression elseBranch = whenExpression.getElseExpression(); @@ -109,10 +110,14 @@ public class WhenUtils { builder.entry(entry); } - whenExpression.replace(builder.toExpression(whenExpression.getProject())); + JetWhenExpression newWhenExpression = builder.toExpression(whenExpression.getProject()); + whenExpression.replace(newWhenExpression); + + return newWhenExpression; } - public static void introduceWhenSubject(@NotNull JetWhenExpression whenExpression) { + @NotNull + public static JetWhenExpression introduceWhenSubject(@NotNull JetWhenExpression whenExpression) { JetExpression subject = getWhenSubjectCandidate(whenExpression); assertNotNull(subject); @@ -158,9 +163,13 @@ public class WhenUtils { builder.branchExpression(branchExpression); } - whenExpression.replace(builder.toExpression(whenExpression.getProject())); + JetWhenExpression newWhenExpression = builder.toExpression(whenExpression.getProject()); + whenExpression.replace(newWhenExpression); + + return newWhenExpression; } + @NotNull static String whenConditionToExpressionText(@NotNull JetWhenCondition condition, JetExpression subject) { if (condition instanceof JetWhenConditionIsPattern) { JetWhenConditionIsPattern patternCondition = (JetWhenConditionIsPattern) condition; @@ -182,7 +191,8 @@ public class WhenUtils { return conditionExpression != null ? conditionExpression.getText() : ""; } - public static void eliminateWhenSubject(@NotNull JetWhenExpression whenExpression) { + @NotNull + public static JetWhenExpression eliminateWhenSubject(@NotNull JetWhenExpression whenExpression) { JetExpression subject = whenExpression.getSubjectExpression(); assertNotNull(subject); @@ -204,6 +214,9 @@ public class WhenUtils { builder.branchExpression(branchExpression); } - whenExpression.replace(builder.toExpression(whenExpression.getProject())); + JetWhenExpression newWhenExpression = builder.toExpression(whenExpression.getProject()); + whenExpression.replace(newWhenExpression); + + return newWhenExpression; } } diff --git a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithEqualityTests.kt.after b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithEqualityTests.kt.after index 37e018ca2c2..dba5a8e64d6 100644 --- a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithEqualityTests.kt.after +++ b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithEqualityTests.kt.after @@ -1,8 +1,8 @@ fun test(n: Int): String { - return when { - n == 0 -> "zero" - n == 1 -> "one" - n == 2 -> "two" + return when (n) { + 0 -> "zero" + 1 -> "one" + 2 -> "two" else -> "unknown" } } \ No newline at end of file diff --git a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithIs.kt.after b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithIs.kt.after index 3fd81cd40a8..e2902c7666b 100644 --- a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithIs.kt.after +++ b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithIs.kt.after @@ -1,8 +1,8 @@ fun test(obj: Any): String { - return when { - obj is String -> "string" - obj is Int -> "int" - obj is Class<*> -> "class" + return when (obj) { + is String -> "string" + is Int -> "int" + is Class<*> -> "class" else -> "unknown" } } \ No newline at end of file diff --git a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithNegativeIs.kt.after b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithNegativeIs.kt.after index 163677dcb22..aed8e7af095 100644 --- a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithNegativeIs.kt.after +++ b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithNegativeIs.kt.after @@ -1,8 +1,8 @@ fun test(obj: Any): String { - return when { - obj !is Iterable<*> -> "not iterable" - obj !is Collection<*> -> "not collection" - obj !is MutableCollection<*> -> "not mutable collection" + return when (obj) { + !is Iterable<*> -> "not iterable" + !is Collection<*> -> "not collection" + !is MutableCollection<*> -> "not mutable collection" else -> "unknown" } } \ No newline at end of file diff --git a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithNegativeRangeTests.kt.after b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithNegativeRangeTests.kt.after index 6216fc2f79e..22365e82db6 100644 --- a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithNegativeRangeTests.kt.after +++ b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithNegativeRangeTests.kt.after @@ -1,8 +1,8 @@ fun test(n: Int): String { - return when { - n !in 0..1000 -> "unknown" - n !in 0..100 -> "big" - n !in 0..10 -> "average" + return when (n) { + !in 0..1000 -> "unknown" + !in 0..100 -> "big" + !in 0..10 -> "average" else -> "small" } } \ No newline at end of file diff --git a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTests.kt.after b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTests.kt.after index f47641c76dc..67f8dd5e022 100644 --- a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTests.kt.after +++ b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTests.kt.after @@ -1,8 +1,8 @@ fun test(n: Int): String { - return when { - n in 0..10 -> "small" - n in 10..100 -> "average" - n in 100..1000 -> "big" + return when (n) { + in 0..10 -> "small" + in 10..100 -> "average" + in 100..1000 -> "big" else -> "unknown" } } \ No newline at end of file diff --git a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTestsAndMultiConditions.kt.after b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTestsAndMultiConditions.kt.after index aa84b8524a0..88b38a37492 100644 --- a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTestsAndMultiConditions.kt.after +++ b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTestsAndMultiConditions.kt.after @@ -1,8 +1,8 @@ fun test(n: Int): String { - return when { - n in 0..5, n in 5..10 -> "small" - n in 10..50, n in 50..100 -> "average" - n in 100..500, n in 500..1000 -> "big" + return when (n) { + in 0..5, in 5..10 -> "small" + in 10..50, in 50..100 -> "average" + in 100..500, in 500..1000 -> "big" else -> "unknown" } } \ No newline at end of file diff --git a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTestsAndUnparenthesizedMultiConditions.kt.after b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTestsAndUnparenthesizedMultiConditions.kt.after index aa84b8524a0..88b38a37492 100644 --- a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTestsAndUnparenthesizedMultiConditions.kt.after +++ b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/ifWithRangeTestsAndUnparenthesizedMultiConditions.kt.after @@ -1,8 +1,8 @@ fun test(n: Int): String { - return when { - n in 0..5, n in 5..10 -> "small" - n in 10..50, n in 50..100 -> "average" - n in 100..500, n in 500..1000 -> "big" + return when (n) { + in 0..5, in 5..10 -> "small" + in 10..50, in 50..100 -> "average" + in 100..500, in 500..1000 -> "big" else -> "unknown" } } \ No newline at end of file diff --git a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/whenWithMultipleConditionTypes.kt.after b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/whenWithMultipleConditionTypes.kt.after index 6babe750cc6..ea4d863fb5d 100644 --- a/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/whenWithMultipleConditionTypes.kt.after +++ b/idea/testData/codeInsight/codeTransformations/branched/ifWhen/ifToWhen/whenWithMultipleConditionTypes.kt.after @@ -1,12 +1,12 @@ fun test(n: Int): String { - return when { - n !is Int -> "???" - n in 0..10 -> "small" - n in 10..100 -> "average" - n in 100..1000 -> "big" - n == 1000000 -> "million" - n !in -100..-10 -> "good" - n is Int -> "unknown" + return when (n) { + !is Int -> "???" + in 0..10 -> "small" + in 10..100 -> "average" + in 100..1000 -> "big" + 1000000 -> "million" + !in -100..-10 -> "good" + is Int -> "unknown" else -> "unknown" } } \ No newline at end of file