From ff76ba52d800e1ab3141430ac498f1d47f6f2779 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Wed, 9 Oct 2019 12:51:48 +0900 Subject: [PATCH] Inline Function: fix false positive with inner function with 'return' #KT-34190 Fixed --- .../kotlin/idea/refactoring/inline/inlineUtils.kt | 3 +++ .../inline/function/returnAtEnd/InnerFunction.kt | 11 +++++++++++ .../function/returnAtEnd/InnerFunction.kt.after | 7 +++++++ .../inline/function/returnAtEnd/InnerFunction2.kt | 9 +++++++++ .../function/returnAtEnd/InnerFunction2.kt.after | 5 +++++ .../idea/refactoring/inline/InlineTestGenerated.java | 10 ++++++++++ 6 files changed, 45 insertions(+) create mode 100644 idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction.kt create mode 100644 idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction.kt.after create mode 100644 idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction2.kt create mode 100644 idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction2.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/inlineUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/inlineUtils.kt index 452bfbf0dc3..4b281d86c42 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/inlineUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/inline/inlineUtils.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils @@ -134,6 +135,8 @@ internal fun buildCodeToInline( val statements = bodyCopy.statements val returnStatements = bodyCopy.collectDescendantsOfType { + val function = it.getStrictParentOfType() + if (function != null && function != declaration) return@collectDescendantsOfType false it.getLabelName().let { it == null || it == declaration.name } } diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction.kt b/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction.kt new file mode 100644 index 00000000000..11ce0ef4686 --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction.kt @@ -0,0 +1,11 @@ +fun foo() { + object { + fun bar(): String { + return "" + } + } +} + +fun main() { + foo() +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction.kt.after b/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction.kt.after new file mode 100644 index 00000000000..228e061f617 --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction.kt.after @@ -0,0 +1,7 @@ +fun main() { + object { + fun bar(): String { + return "" + } + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction2.kt b/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction2.kt new file mode 100644 index 00000000000..505c0ae8dba --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction2.kt @@ -0,0 +1,9 @@ +fun foo() { + fun bar(): String { + return "" + } +} + +fun main() { + foo() +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction2.kt.after b/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction2.kt.after new file mode 100644 index 00000000000..ca58b320f1b --- /dev/null +++ b/idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction2.kt.after @@ -0,0 +1,5 @@ +fun main() { + fun bar(): String { + return "" + } +} \ 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 dc3cdbab607..deb2566318b 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java @@ -383,6 +383,16 @@ public class InlineTestGenerated extends AbstractInlineTest { runTest("idea/testData/refactoring/inline/function/returnAtEnd/DefaultParameter.kt"); } + @TestMetadata("InnerFunction.kt") + public void testInnerFunction() throws Exception { + runTest("idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction.kt"); + } + + @TestMetadata("InnerFunction2.kt") + public void testInnerFunction2() throws Exception { + runTest("idea/testData/refactoring/inline/function/returnAtEnd/InnerFunction2.kt"); + } + @TestMetadata("MultipleStatements.kt") public void testMultipleStatements() throws Exception { runTest("idea/testData/refactoring/inline/function/returnAtEnd/MultipleStatements.kt");