Lift assignment out: don't report when expression is used as expression

#KT-36357 Fixed
This commit is contained in:
Toshiaki Kameyama
2020-02-05 17:50:39 +09:00
committed by Mikhail Glukhikh
parent 8baba38099
commit 6c93217539
5 changed files with 42 additions and 0 deletions
@@ -21,12 +21,15 @@ import com.intellij.codeInspection.ProblemHighlightType.GENERIC_ERROR_OR_WARNING
import com.intellij.codeInspection.ProblemHighlightType.INFORMATION
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.BranchedFoldingUtils
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.isElseIf
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.lineCount
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
class LiftReturnOrAssignmentInspection @JvmOverloads constructor(private val skipLongExpressions: Boolean = true) :
AbstractKotlinInspection() {
@@ -35,6 +38,7 @@ class LiftReturnOrAssignmentInspection @JvmOverloads constructor(private val ski
object : KtVisitorVoid() {
override fun visitExpression(expression: KtExpression) {
val states = getState(expression, skipLongExpressions) ?: return
if (expression.isUsedAsExpression(expression.analyze(BodyResolveMode.PARTIAL_WITH_CFA))) return
states.forEach { state ->
registerProblem(
expression,
@@ -0,0 +1,8 @@
// PROBLEM: none
var a = 5
fun foo() = <caret>if (true) {
a = 6
} else {
a = 8
}
@@ -0,0 +1,8 @@
// PROBLEM: none
var a = 5
fun foo() = <caret>try {
a = 6
} catch (e: Exception) {
a = 8
}
@@ -0,0 +1,7 @@
// PROBLEM: none
var a = 5
fun foo() = <caret>when {
true -> a = 6
else -> a = 8
}
@@ -5389,6 +5389,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
public void testTypeMismatchMutableList2_ni() throws Exception {
runTest("idea/testData/inspectionsLocal/liftOut/ifToAssignment/typeMismatchMutableList2_ni.kt");
}
@TestMetadata("usedAsExpression.kt")
public void testUsedAsExpression() throws Exception {
runTest("idea/testData/inspectionsLocal/liftOut/ifToAssignment/usedAsExpression.kt");
}
}
@TestMetadata("idea/testData/inspectionsLocal/liftOut/ifToReturn")
@@ -5516,6 +5521,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
runTest("idea/testData/inspectionsLocal/liftOut/tryToAssignment/lambda.kt");
}
@TestMetadata("usedAsExpression.kt")
public void testUsedAsExpression() throws Exception {
runTest("idea/testData/inspectionsLocal/liftOut/tryToAssignment/usedAsExpression.kt");
}
@TestMetadata("withUnmatchedAssignments.kt")
public void testWithUnmatchedAssignments() throws Exception {
runTest("idea/testData/inspectionsLocal/liftOut/tryToAssignment/withUnmatchedAssignments.kt");
@@ -5647,6 +5657,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
runTest("idea/testData/inspectionsLocal/liftOut/whenToAssignment/simpleWhenWithoutTerminatingAssignment.kt");
}
@TestMetadata("usedAsExpression.kt")
public void testUsedAsExpression() throws Exception {
runTest("idea/testData/inspectionsLocal/liftOut/whenToAssignment/usedAsExpression.kt");
}
@TestMetadata("whenHasMissingCase.kt")
public void testWhenHasMissingCase() throws Exception {
runTest("idea/testData/inspectionsLocal/liftOut/whenToAssignment/whenHasMissingCase.kt");