"Cascade if" inspection: do not suggest for one-line if
This commit is contained in:
@@ -21,6 +21,7 @@ import com.intellij.codeInspection.LocalInspectionToolSession
|
|||||||
import com.intellij.codeInspection.ProblemHighlightType
|
import com.intellij.codeInspection.ProblemHighlightType
|
||||||
import com.intellij.codeInspection.ProblemsHolder
|
import com.intellij.codeInspection.ProblemsHolder
|
||||||
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.IfToWhenIntention
|
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.branchedTransformations.isIfBranch
|
||||||
import org.jetbrains.kotlin.idea.intentions.branches
|
import org.jetbrains.kotlin.idea.intentions.branches
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
@@ -36,6 +37,8 @@ class CascadeIfInspection : AbstractKotlinInspection() {
|
|||||||
|
|
||||||
val branches = expression.branches
|
val branches = expression.branches
|
||||||
if (branches.size <= 2) return
|
if (branches.size <= 2) return
|
||||||
|
if (expression.isOneLiner()) return
|
||||||
|
|
||||||
if (branches.any {
|
if (branches.any {
|
||||||
it == null ||
|
it == null ||
|
||||||
it.lastBlockStatementOrThis() is KtIfExpression
|
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.GENERIC_ERROR_OR_WARNING
|
||||||
import com.intellij.codeInspection.ProblemHighlightType.INFORMATION
|
import com.intellij.codeInspection.ProblemHighlightType.INFORMATION
|
||||||
import com.intellij.codeInspection.ProblemsHolder
|
import com.intellij.codeInspection.ProblemsHolder
|
||||||
import com.intellij.openapi.fileEditor.FileDocumentManager
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
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.canOmitDeclaredType
|
||||||
import org.jetbrains.kotlin.idea.core.replaced
|
import org.jetbrains.kotlin.idea.core.replaced
|
||||||
import org.jetbrains.kotlin.idea.core.setType
|
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.hasResultingIfWithoutElse
|
||||||
import org.jetbrains.kotlin.idea.intentions.resultingWhens
|
import org.jetbrains.kotlin.idea.intentions.resultingWhens
|
||||||
import org.jetbrains.kotlin.idea.util.CommentSaver
|
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? {
|
private fun KtDeclarationWithBody.findValueStatement(): KtExpression? {
|
||||||
val body = blockExpression() ?: return null
|
val body = blockExpression() ?: return null
|
||||||
return body.findValueStatement()
|
return body.findValueStatement()
|
||||||
|
|||||||
@@ -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);
|
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")
|
@TestMetadata("shortIf.kt")
|
||||||
public void testShortIf() throws Exception {
|
public void testShortIf() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/cascadeIf/shortIf.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/cascadeIf/shortIf.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user