From 815a367978eff939e69d8e58cc60b8f061f1a6e7 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 13 Apr 2017 18:45:49 +0300 Subject: [PATCH] ReplacementPerformer: always copy statement to insert #KT-17273 Fixed --- .../idea/codeInliner/ReplacementPerformer.kt | 3 +-- .../inline/function/expressionBody/ManyParams.kt | 12 ++++++++++++ .../function/expressionBody/ManyParams.kt.after | 14 ++++++++++++++ .../refactoring/inline/InlineTestGenerated.java | 6 ++++++ 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 idea/testData/refactoring/inline/function/expressionBody/ManyParams.kt create mode 100644 idea/testData/refactoring/inline/function/expressionBody/ManyParams.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInliner/ReplacementPerformer.kt b/idea/src/org/jetbrains/kotlin/idea/codeInliner/ReplacementPerformer.kt index f471269fe12..f5ba69cd4e4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInliner/ReplacementPerformer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInliner/ReplacementPerformer.kt @@ -69,8 +69,7 @@ internal class ExpressionReplacementPerformer( override fun doIt(postProcessing: (PsiChildRange) -> PsiChildRange): KtExpression? { val insertedStatements = ArrayList() for (statement in codeToInline.statementsBefore) { - // copy the statement if it can get invalidated by findOrCreateBlockToInsertStatement() - val statementToUse = if (statement.isPhysical) statement.copy() else statement + val statementToUse = statement.copy() val anchor = findOrCreateBlockToInsertStatement() val block = anchor.parent as KtBlockExpression diff --git a/idea/testData/refactoring/inline/function/expressionBody/ManyParams.kt b/idea/testData/refactoring/inline/function/expressionBody/ManyParams.kt new file mode 100644 index 00000000000..91754ec9256 --- /dev/null +++ b/idea/testData/refactoring/inline/function/expressionBody/ManyParams.kt @@ -0,0 +1,12 @@ +fun sideEffect() { + println("qq") +} + +fun effect(): String { + sideEffect() + return "effect" +} + +fun manyParams(p1: String, p2: String, p3: String) = println(p1) + +fun callManySimple() = manyParams(effect(), effect(), effect()) \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/expressionBody/ManyParams.kt.after b/idea/testData/refactoring/inline/function/expressionBody/ManyParams.kt.after new file mode 100644 index 00000000000..5f0e5e11866 --- /dev/null +++ b/idea/testData/refactoring/inline/function/expressionBody/ManyParams.kt.after @@ -0,0 +1,14 @@ +fun sideEffect() { + println("qq") +} + +fun effect(): String { + sideEffect() + return "effect" +} + +fun callManySimple() { + effect() + effect() + println(effect()) +} \ 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 3fa28b8e36d..583bc92db2c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java @@ -190,6 +190,12 @@ public class InlineTestGenerated extends AbstractInlineTest { doTest(fileName); } + @TestMetadata("ManyParams.kt") + public void testManyParams() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/expressionBody/ManyParams.kt"); + doTest(fileName); + } + @TestMetadata("MultipleInComposition.kt") public void testMultipleInComposition() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/expressionBody/MultipleInComposition.kt");