diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt index 87256939bbb..eb0330898bc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToBlockBodyIntention.kt @@ -52,16 +52,25 @@ class ConvertToBlockBodyIntention : SelfTargetingIntention true + is KtIfExpression -> (then?.whenAsResult() ?: false) || (`else`?.whenAsResult() ?: false) + is KtBlockExpression -> statements.lastOrNull()?.whenAsResult() ?: false + else -> false + } + fun convert(declaration: KtDeclarationWithBody): KtDeclarationWithBody { val body = declaration.bodyExpression!! + fun generateBody(returnsValue: Boolean): KtExpression { val bodyType = body.analyze().getType(body) + val unitWhenAsResult = (bodyType == null || KotlinBuiltIns.isUnit(bodyType)) && body.whenAsResult() val needReturn = returnsValue && (bodyType == null || (!KotlinBuiltIns.isUnit(bodyType) && !KotlinBuiltIns.isNothing(bodyType))) val factory = KtPsiFactory(declaration) - val statement = if (needReturn) factory.createExpressionByPattern("return $0", body) else body + val statement = if (needReturn || unitWhenAsResult) factory.createExpressionByPattern("return $0", body) else body return factory.createSingleStatementBlock(statement) } diff --git a/idea/testData/intentions/convertToBlockBody/ifWhenUnit.kt b/idea/testData/intentions/convertToBlockBody/ifWhenUnit.kt new file mode 100644 index 00000000000..5c2c74da3a5 --- /dev/null +++ b/idea/testData/intentions/convertToBlockBody/ifWhenUnit.kt @@ -0,0 +1,12 @@ +enum class AccessMode { READ, WRITE, EXECUTE } + +fun foo() {} + +fun whenExpr(access: AccessMode, arg: Boolean) = if (arg) {} else { + foo() + when (access) { + AccessMode.READ -> {} + AccessMode.WRITE -> {} + AccessMode.EXECUTE -> {} + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertToBlockBody/ifWhenUnit.kt.after b/idea/testData/intentions/convertToBlockBody/ifWhenUnit.kt.after new file mode 100644 index 00000000000..a9b82469bc2 --- /dev/null +++ b/idea/testData/intentions/convertToBlockBody/ifWhenUnit.kt.after @@ -0,0 +1,14 @@ +enum class AccessMode { READ, WRITE, EXECUTE } + +fun foo() {} + +fun whenExpr(access: AccessMode, arg: Boolean) { + return if (arg) {} else { + foo() + when (access) { + AccessMode.READ -> {} + AccessMode.WRITE -> {} + AccessMode.EXECUTE -> {} + } + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertToBlockBody/whenUnit.kt b/idea/testData/intentions/convertToBlockBody/whenUnit.kt new file mode 100644 index 00000000000..bc5488f7518 --- /dev/null +++ b/idea/testData/intentions/convertToBlockBody/whenUnit.kt @@ -0,0 +1,7 @@ +enum class AccessMode { READ, WRITE, EXECUTE } + +fun whenExpr(access: AccessMode) = when (access) { + AccessMode.READ -> {} + AccessMode.WRITE -> {} + AccessMode.EXECUTE -> {} +} \ No newline at end of file diff --git a/idea/testData/intentions/convertToBlockBody/whenUnit.kt.after b/idea/testData/intentions/convertToBlockBody/whenUnit.kt.after new file mode 100644 index 00000000000..ab0a4694c10 --- /dev/null +++ b/idea/testData/intentions/convertToBlockBody/whenUnit.kt.after @@ -0,0 +1,9 @@ +enum class AccessMode { READ, WRITE, EXECUTE } + +fun whenExpr(access: AccessMode) { + return when (access) { + AccessMode.READ -> {} + AccessMode.WRITE -> {} + AccessMode.EXECUTE -> {} + } +} \ 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 fd38496e029..9df162d79f4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4225,6 +4225,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("ifWhenUnit.kt") + public void testIfWhenUnit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToBlockBody/ifWhenUnit.kt"); + doTest(fileName); + } + @TestMetadata("implicitlyNonUnitFun.kt") public void testImplicitlyNonUnitFun() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToBlockBody/implicitlyNonUnitFun.kt"); @@ -4284,6 +4290,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToBlockBody/valueIsAnonymousObject4.kt"); doTest(fileName); } + + @TestMetadata("whenUnit.kt") + public void testWhenUnit() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToBlockBody/whenUnit.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/intentions/convertToConcatenatedString")