diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInliner/ReplacementPerformer.kt b/idea/src/org/jetbrains/kotlin/idea/codeInliner/ReplacementPerformer.kt index 35a710017b5..d208d449ec5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInliner/ReplacementPerformer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInliner/ReplacementPerformer.kt @@ -182,8 +182,12 @@ internal class ExpressionReplacementPerformer( } } - //TODO - throw UnsupportedOperationException() + val runExpression = psiFactory.createExpressionByPattern("run { $0 }", elementToBeReplaced) as KtCallExpression + val runAfterReplacement = elementToBeReplaced.replaced(runExpression) + val block = runAfterReplacement.lambdaArguments[0].getLambdaExpression().bodyExpression!! + elementToBeReplaced = block.statements.single() + return elementToBeReplaced + } private fun KtExpression.replaceWithBlock(): KtExpression { diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/ClassDelegate.kt b/idea/testData/refactoring/inline/function/returnAtEnd/ClassDelegate.kt new file mode 100644 index 00000000000..b7ea9e4ebfe --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/ClassDelegate.kt @@ -0,0 +1,6 @@ +interface DelegateFace +fun compoundDelegate(): DelegateFace { + val result = object : DelegateFace {} + return result +} +class DelegatingB : DelegateFace by compoundDelegate() \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/ClassDelegate.kt.after b/idea/testData/refactoring/inline/function/returnAtEnd/ClassDelegate.kt.after new file mode 100644 index 00000000000..04cc4f5c68e --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/ClassDelegate.kt.after @@ -0,0 +1,5 @@ +interface DelegateFace +class DelegatingB : DelegateFace by run { + val result = object : DelegateFace {} + result +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/DefaultParameter.kt b/idea/testData/refactoring/inline/function/returnAtEnd/DefaultParameter.kt new file mode 100644 index 00000000000..7937dc53795 --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/DefaultParameter.kt @@ -0,0 +1,8 @@ +fun provideSimple() = listOf("statement 0") +fun provideComplex(): MutableList { + val result = mutableListOf("statement 1") + result.add("statement 2") + return result +} +fun callInDefault(simple: List = provideSimple(), complex: List = provideComplex()) { +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/DefaultParameter.kt.after b/idea/testData/refactoring/inline/function/returnAtEnd/DefaultParameter.kt.after new file mode 100644 index 00000000000..096a8a85e59 --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/DefaultParameter.kt.after @@ -0,0 +1,7 @@ +fun provideSimple() = listOf("statement 0") +fun callInDefault(simple: List = provideSimple(), complex: List = run { + val result = mutableListOf("statement 1") + result.add("statement 2") + result +}) { +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/OnLocalMemberLevel.kt b/idea/testData/refactoring/inline/function/returnAtEnd/OnLocalMemberLevel.kt new file mode 100644 index 00000000000..799a99e0f21 --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/OnLocalMemberLevel.kt @@ -0,0 +1,10 @@ +fun compound(): String { + val s = "Hello" + return s +} + +fun outer() { + class Container { + val v = compound() + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/OnLocalMemberLevel.kt.after b/idea/testData/refactoring/inline/function/returnAtEnd/OnLocalMemberLevel.kt.after new file mode 100644 index 00000000000..4214aa0a8ea --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/OnLocalMemberLevel.kt.after @@ -0,0 +1,7 @@ +fun outer() { + val s = "Hello" + + class Container { + val v = s + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/OnMemberLevel.kt b/idea/testData/refactoring/inline/function/returnAtEnd/OnMemberLevel.kt new file mode 100644 index 00000000000..ca25aed61b9 --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/OnMemberLevel.kt @@ -0,0 +1,8 @@ +fun compound(): String { + val s = "Hello" + return s +} + +class Container { + val v = compound() +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/OnMemberLevel.kt.after b/idea/testData/refactoring/inline/function/returnAtEnd/OnMemberLevel.kt.after new file mode 100644 index 00000000000..397413fd5c2 --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/OnMemberLevel.kt.after @@ -0,0 +1,6 @@ +class Container { + val v = run { + val s = "Hello" + s + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/OnTopLevel.kt b/idea/testData/refactoring/inline/function/returnAtEnd/OnTopLevel.kt new file mode 100644 index 00000000000..a67472f12bc --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/OnTopLevel.kt @@ -0,0 +1,6 @@ +fun compound(): String { + val s = "Hello" + return s +} + +val v = compound() \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/OnTopLevel.kt.after b/idea/testData/refactoring/inline/function/returnAtEnd/OnTopLevel.kt.after new file mode 100644 index 00000000000..a310a94f14c --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/OnTopLevel.kt.after @@ -0,0 +1,4 @@ +val v = run { + val s = "Hello" + s +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java index c4d366afe43..7b97dec6411 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java @@ -388,18 +388,48 @@ public class InlineTestGenerated extends AbstractInlineTest { doTest(fileName); } + @TestMetadata("ClassDelegate.kt") + public void testClassDelegate() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/returnAtEnd/ClassDelegate.kt"); + doTest(fileName); + } + @TestMetadata("ConvertToBlockBody.kt") public void testConvertToBlockBody() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/returnAtEnd/ConvertToBlockBody.kt"); doTest(fileName); } + @TestMetadata("DefaultParameter.kt") + public void testDefaultParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/returnAtEnd/DefaultParameter.kt"); + doTest(fileName); + } + @TestMetadata("MultipleStatements.kt") public void testMultipleStatements() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/returnAtEnd/MultipleStatements.kt"); doTest(fileName); } + @TestMetadata("OnLocalMemberLevel.kt") + public void testOnLocalMemberLevel() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/returnAtEnd/OnLocalMemberLevel.kt"); + doTest(fileName); + } + + @TestMetadata("OnMemberLevel.kt") + public void testOnMemberLevel() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/returnAtEnd/OnMemberLevel.kt"); + doTest(fileName); + } + + @TestMetadata("OnTopLevel.kt") + public void testOnTopLevel() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/returnAtEnd/OnTopLevel.kt"); + doTest(fileName); + } + @TestMetadata("PrivateMember.kt") public void testPrivateMember() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/returnAtEnd/PrivateMember.kt");