diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt index 989c18a9a5c..c6c405612f0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt @@ -162,12 +162,18 @@ object BranchedFoldingUtils { fun foldToAssignment(expression: KtExpression) { var lhs: KtExpression? = null var op: String? = null + val psiFactory = KtPsiFactory(expression) fun KtBinaryExpression.replaceWithRHS() { if (lhs == null || op == null) { lhs = left!!.copy() as KtExpression op = operationReference.text } - replace(right!!) + val rhs = right!! + if (rhs is KtLambdaExpression && this.parent !is KtBlockExpression) { + replace(psiFactory.createExpressionByPattern("{ $0 }", rhs)) + } else { + replace(rhs) + } } fun lift(e: KtExpression?) { when (e) { @@ -183,7 +189,7 @@ object BranchedFoldingUtils { } } lift(expression) - expression.replace(KtPsiFactory(expression).createExpressionByPattern("$0 $1 $2", lhs!!, op!!, expression)) + expression.replace(psiFactory.createExpressionByPattern("$0 $1 $2", lhs!!, op!!, expression)) } fun foldToReturn(expression: KtExpression) { diff --git a/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda.kt b/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda.kt new file mode 100644 index 00000000000..cfb03b2ee15 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda.kt @@ -0,0 +1,11 @@ +fun test(i: Int) { + var fn: () -> String + + if (i == 1) { + fn = { "foo" } + } else if (i == 2) { + fn = { "bar" } + } else { + fn = { "baz" } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda.kt.after b/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda.kt.after new file mode 100644 index 00000000000..d4782a4da56 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda.kt.after @@ -0,0 +1,11 @@ +fun test(i: Int) { + var fn: () -> String + + fn = if (i == 1) { + { "foo" } + } else if (i == 2) { + { "bar" } + } else { + { "baz" } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda2.kt b/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda2.kt new file mode 100644 index 00000000000..2c8851d9ce5 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda2.kt @@ -0,0 +1,10 @@ +fun test(i: Int) { + var fn: () -> String + + if (i == 1) + fn = { "foo" } + else if (i == 2) + fn = { "bar" } + else + fn = { "baz" } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda2.kt.after b/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda2.kt.after new file mode 100644 index 00000000000..d4782a4da56 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda2.kt.after @@ -0,0 +1,11 @@ +fun test(i: Int) { + var fn: () -> String + + fn = if (i == 1) { + { "foo" } + } else if (i == 2) { + { "bar" } + } else { + { "baz" } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/liftOut/tryToAssignment/lambda.kt b/idea/testData/inspectionsLocal/liftOut/tryToAssignment/lambda.kt new file mode 100644 index 00000000000..2c72b9c7ae6 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/tryToAssignment/lambda.kt @@ -0,0 +1,9 @@ +fun test(b: Boolean) { + var fn: () -> String + + try { + fn = { "foo" } + } catch (e: Exception) { + fn = { "bar" } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/liftOut/tryToAssignment/lambda.kt.after b/idea/testData/inspectionsLocal/liftOut/tryToAssignment/lambda.kt.after new file mode 100644 index 00000000000..3f791a35f63 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/tryToAssignment/lambda.kt.after @@ -0,0 +1,9 @@ +fun test(b: Boolean) { + var fn: () -> String + + fn = try { + { "foo" } + } catch (e: Exception) { + { "bar" } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda.kt b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda.kt new file mode 100644 index 00000000000..fec7a392fef --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda.kt @@ -0,0 +1,12 @@ +fun test(b: Boolean) { + var fn: () -> String + + when (b) { + true -> { + fn = { "foo" } + } + else -> { + fn = { "bar" } + } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda.kt.after b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda.kt.after new file mode 100644 index 00000000000..7e1773d8a61 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda.kt.after @@ -0,0 +1,12 @@ +fun test(b: Boolean) { + var fn: () -> String + + fn = when (b) { + true -> { + { "foo" } + } + else -> { + { "bar" } + } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda2.kt b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda2.kt new file mode 100644 index 00000000000..033a01054e4 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda2.kt @@ -0,0 +1,8 @@ +fun test(b: Boolean) { + var fn: () -> String + + when (b) { + true -> fn = { "foo" } + else -> fn = { "bar" } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda2.kt.after b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda2.kt.after new file mode 100644 index 00000000000..7e1773d8a61 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda2.kt.after @@ -0,0 +1,12 @@ +fun test(b: Boolean) { + var fn: () -> String + + fn = when (b) { + true -> { + { "foo" } + } + else -> { + { "bar" } + } + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 4a0d8399936..1a531bfccdd 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -1795,6 +1795,16 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/liftOut/ifToAssignment/innerIfTransformed.kt"); } + @TestMetadata("lambda.kt") + public void testLambda() throws Exception { + runTest("idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda.kt"); + } + + @TestMetadata("lambda2.kt") + public void testLambda2() throws Exception { + runTest("idea/testData/inspectionsLocal/liftOut/ifToAssignment/lambda2.kt"); + } + @TestMetadata("multipleAssignments.kt") public void testMultipleAssignments() throws Exception { runTest("idea/testData/inspectionsLocal/liftOut/ifToAssignment/multipleAssignments.kt"); @@ -1951,6 +1961,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/liftOut/tryToAssignment/inner.kt"); } + @TestMetadata("lambda.kt") + public void testLambda() throws Exception { + runTest("idea/testData/inspectionsLocal/liftOut/tryToAssignment/lambda.kt"); + } + @TestMetadata("withUnmatchedAssignments.kt") public void testWithUnmatchedAssignments() throws Exception { runTest("idea/testData/inspectionsLocal/liftOut/tryToAssignment/withUnmatchedAssignments.kt"); @@ -2042,6 +2057,16 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { runTest("idea/testData/inspectionsLocal/liftOut/whenToAssignment/insideLoop.kt"); } + @TestMetadata("lambda.kt") + public void testLambda() throws Exception { + runTest("idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda.kt"); + } + + @TestMetadata("lambda2.kt") + public void testLambda2() throws Exception { + runTest("idea/testData/inspectionsLocal/liftOut/whenToAssignment/lambda2.kt"); + } + @TestMetadata("simpleWhen.kt") public void testSimpleWhen() throws Exception { runTest("idea/testData/inspectionsLocal/liftOut/whenToAssignment/simpleWhen.kt");