From e01e08402c8dca07f0d9c501110d4a1028762065 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 10 Aug 2016 14:45:43 +0300 Subject: [PATCH] Minor: convert to expression body is forbidden also for nested non-exhaustive whens --- .../jetbrains/kotlin/idea/intentions/Utils.kt | 2 +- .../whenWhenNonExhaustive.kt | 18 ++++++++++++++++++ .../intentions/IntentionTestGenerated.java | 6 ++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 idea/testData/intentions/convertToExpressionBody/whenWhenNonExhaustive.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt index 7c9ac25d722..850eab466c3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/Utils.kt @@ -133,7 +133,7 @@ fun KtExpression.negate(): KtExpression { } fun KtExpression.resultingWhens(): List = when (this) { - is KtWhenExpression -> listOf(this) + is KtWhenExpression -> listOf(this) + entries.map { it.expression?.resultingWhens() ?: listOf() }.flatten() is KtIfExpression -> (then?.resultingWhens() ?: listOf()) + (`else`?.resultingWhens() ?: listOf()) is KtBinaryExpression -> (left?.resultingWhens() ?: listOf()) + (right?.resultingWhens() ?: listOf()) is KtUnaryExpression -> this.baseExpression?.resultingWhens() ?: listOf() diff --git a/idea/testData/intentions/convertToExpressionBody/whenWhenNonExhaustive.kt b/idea/testData/intentions/convertToExpressionBody/whenWhenNonExhaustive.kt new file mode 100644 index 00000000000..4b7257c9300 --- /dev/null +++ b/idea/testData/intentions/convertToExpressionBody/whenWhenNonExhaustive.kt @@ -0,0 +1,18 @@ +// IS_APPLICABLE: false +enum class AccessMode { READ, WRITE, RW } +fun whenExpr(mode: Boolean, access: AccessMode) { + when (access) { + AccessMode.READ -> when (mode) { + true -> println("read") + false -> println("noread") + } + AccessMode.WRITE -> when (mode) { + true -> println("write") + } + AccessMode.RW -> when (mode) { + true -> println("both") + else -> println("no both") + } + } +} +fun println(s: String) {} \ 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 bd3acbec144..fbc0b079e2c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4960,6 +4960,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("whenWhenNonExhaustive.kt") + public void testWhenWhenNonExhaustive() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToExpressionBody/whenWhenNonExhaustive.kt"); + doTest(fileName); + } + @TestMetadata("while.kt") public void testWhile() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToExpressionBody/while.kt");