diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/LiftReturnOrAssignmentInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/LiftReturnOrAssignmentInspection.kt index 323e4bd08a7..08e6f82ca5e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/LiftReturnOrAssignmentInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/LiftReturnOrAssignmentInspection.kt @@ -20,6 +20,7 @@ import com.intellij.codeInspection.* import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedFoldingUtils +import org.jetbrains.kotlin.idea.intentions.branchedTransformations.lineCount import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtIfExpression import org.jetbrains.kotlin.psi.KtVisitorVoid @@ -31,6 +32,7 @@ class LiftReturnOrAssignmentInspection : AbstractKotlinInspection() { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession) = object : KtVisitorVoid() { private fun visitIfOrWhen(expression: KtExpression, keyword: PsiElement) { + if (expression.lineCount() > LINES_LIMIT) return val returnNumber = BranchedFoldingUtils.getFoldableReturnNumber(expression) if (returnNumber > 0) { holder.registerProblem( @@ -84,4 +86,8 @@ class LiftReturnOrAssignmentInspection : AbstractKotlinInspection() { BranchedFoldingUtils.foldToAssignment(descriptor.psiElement.getParentOfType(true)!!) } } + + companion object { + private val LINES_LIMIT = 15 + } } diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt index b3b23758aa5..059b94e2212 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.intentions.branchedTransformations import com.intellij.openapi.editor.Editor +import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.psi.search.LocalSearchScope import com.intellij.psi.search.searches.ReferencesSearch import org.jetbrains.kotlin.KtNodeTypes @@ -254,3 +255,12 @@ private fun KtExpression.insertSafeCalls(factory: KtPsiFactory): KtExpression { replaced.receiverExpression.let { it.replace(it.insertSafeCalls(factory)) } return replaced } + +// Returns -1 if cannot obtain a document +internal fun KtExpression.lineCount(): Int { + val file = containingFile?.virtualFile ?: return -1 + val document = FileDocumentManager.getInstance().getDocument(file) ?: return -1 + return document.getLineNumber(textRange.endOffset) - document.getLineNumber(textRange.startOffset) + 1 +} + +internal fun KtExpression.isOneLiner(): Boolean = lineCount() == 1 diff --git a/idea/testData/inspectionsLocal/liftOut/ifToReturn/ifVeryLong.kt b/idea/testData/inspectionsLocal/liftOut/ifToReturn/ifVeryLong.kt new file mode 100644 index 00000000000..cbfd787f8d5 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/ifToReturn/ifVeryLong.kt @@ -0,0 +1,33 @@ +// PROBLEM: none + +fun println(s: String) {} + +fun test(n: Int): String { + if (n == 1) { + println("123") + println("456") + println("789") + println("123") + println("456") + println("789") + return "one" + } + else if (n == 2) { + println("123") + println("456") + println("789") + println("123") + println("456") + println("789") + return "two" + } + else { + println("123") + println("456") + println("789") + println("123") + println("456") + println("789") + return "three" + } +} \ 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 2761b336c9c..cf74d41981e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -529,6 +529,12 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { doTest(fileName); } + @TestMetadata("ifVeryLong.kt") + public void testIfVeryLong() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/liftOut/ifToReturn/ifVeryLong.kt"); + doTest(fileName); + } + @TestMetadata("innerIfTransformed.kt") public void testInnerIfTransformed() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/liftOut/ifToReturn/innerIfTransformed.kt");