Inline Function: fix false positive with inner function with 'return'

#KT-34190 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-10-09 12:51:48 +09:00
committed by igoriakovlev
parent 04e8cba857
commit ff76ba52d8
6 changed files with 45 additions and 0 deletions
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.TypeUtils
@@ -134,6 +135,8 @@ internal fun buildCodeToInline(
val statements = bodyCopy.statements val statements = bodyCopy.statements
val returnStatements = bodyCopy.collectDescendantsOfType<KtReturnExpression> { val returnStatements = bodyCopy.collectDescendantsOfType<KtReturnExpression> {
val function = it.getStrictParentOfType<KtFunction>()
if (function != null && function != declaration) return@collectDescendantsOfType false
it.getLabelName().let { it == null || it == declaration.name } it.getLabelName().let { it == null || it == declaration.name }
} }
@@ -0,0 +1,11 @@
fun foo() {
object {
fun bar(): String {
return ""
}
}
}
fun main() {
<caret>foo()
}
@@ -0,0 +1,7 @@
fun main() {
object {
fun bar(): String {
return ""
}
}
}
@@ -0,0 +1,9 @@
fun foo() {
fun bar(): String {
return ""
}
}
fun main() {
<caret>foo()
}
@@ -0,0 +1,5 @@
fun main() {
fun bar(): String {
return ""
}
}
@@ -383,6 +383,16 @@ public class InlineTestGenerated extends AbstractInlineTest {
runTest("idea/testData/refactoring/inline/function/returnAtEnd/DefaultParameter.kt"); 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") @TestMetadata("MultipleStatements.kt")
public void testMultipleStatements() throws Exception { public void testMultipleStatements() throws Exception {
runTest("idea/testData/refactoring/inline/function/returnAtEnd/MultipleStatements.kt"); runTest("idea/testData/refactoring/inline/function/returnAtEnd/MultipleStatements.kt");