"Cascade if" inspection: do not suggest for one-line if

This commit is contained in:
Mikhail Glukhikh
2017-07-06 14:49:54 +03:00
parent 0fe9030eba
commit 0c41ceea9d
4 changed files with 15 additions and 7 deletions
@@ -21,6 +21,7 @@ import com.intellij.codeInspection.LocalInspectionToolSession
import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.ProblemsHolder
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.IfToWhenIntention
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isOneLiner
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isIfBranch
import org.jetbrains.kotlin.idea.intentions.branches
import org.jetbrains.kotlin.lexer.KtTokens
@@ -36,6 +37,8 @@ class CascadeIfInspection : AbstractKotlinInspection() {
val branches = expression.branches
if (branches.size <= 2) return
if (expression.isOneLiner()) return
if (branches.any {
it == null ||
it.lastBlockStatementOrThis() is KtIfExpression
@@ -22,7 +22,6 @@ import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.codeInspection.ProblemHighlightType.GENERIC_ERROR_OR_WARNING
import com.intellij.codeInspection.ProblemHighlightType.INFORMATION
import com.intellij.codeInspection.ProblemsHolder
import com.intellij.openapi.fileEditor.FileDocumentManager
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
@@ -30,6 +29,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.core.canOmitDeclaredType
import org.jetbrains.kotlin.idea.core.replaced
import org.jetbrains.kotlin.idea.core.setType
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isOneLiner
import org.jetbrains.kotlin.idea.intentions.hasResultingIfWithoutElse
import org.jetbrains.kotlin.idea.intentions.resultingWhens
import org.jetbrains.kotlin.idea.util.CommentSaver
@@ -86,12 +86,6 @@ class UseExpressionBodyInspection(private val convertEmptyToUnit: Boolean) : Abs
}
}
private fun KtExpression.isOneLiner(): Boolean {
val file = containingFile?.virtualFile ?: return false
val document = FileDocumentManager.getInstance().getDocument(file) ?: return false
return document.getLineNumber(textRange.startOffset) == document.getLineNumber(textRange.endOffset)
}
private fun KtDeclarationWithBody.findValueStatement(): KtExpression? {
val body = blockExpression() ?: return null
return body.findValueStatement()
+5
View File
@@ -0,0 +1,5 @@
// PROBLEM: none
fun foo(a: Boolean, b: Boolean): Int {
return <caret>if (a) 42 else if (b) 13 else 0
}
@@ -101,6 +101,12 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
doTest(fileName);
}
@TestMetadata("oneLiner.kt")
public void testOneLiner() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/cascadeIf/oneLiner.kt");
doTest(fileName);
}
@TestMetadata("shortIf.kt")
public void testShortIf() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/cascadeIf/shortIf.kt");