Don't suggest "if to ?." without else when used in expression position
This commit is contained in:
+4
-2
@@ -18,13 +18,13 @@ package org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions
|
|||||||
|
|
||||||
import com.intellij.codeInspection.ProblemHighlightType
|
import com.intellij.codeInspection.ProblemHighlightType
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import org.jetbrains.kotlin.idea.core.replaced
|
import org.jetbrains.kotlin.idea.core.replaced
|
||||||
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
|
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
|
||||||
import org.jetbrains.kotlin.idea.intentions.SelfTargetingOffsetIndependentIntention
|
import org.jetbrains.kotlin.idea.intentions.SelfTargetingOffsetIndependentIntention
|
||||||
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
|
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.*
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.isUsedAsExpression
|
||||||
|
|
||||||
class IfThenToSafeAccessInspection : IntentionBasedInspection<KtIfExpression>(IfThenToSafeAccessIntention::class) {
|
class IfThenToSafeAccessInspection : IntentionBasedInspection<KtIfExpression>(IfThenToSafeAccessIntention::class) {
|
||||||
override fun inspectionTarget(element: KtIfExpression) = element.ifKeyword
|
override fun inspectionTarget(element: KtIfExpression) = element.ifKeyword
|
||||||
@@ -70,7 +70,9 @@ class IfThenToSafeAccessIntention : SelfTargetingOffsetIndependentIntention<KtIf
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun IfThenToSelectData.clausesReplaceableBySafeCall(): Boolean {
|
private fun IfThenToSelectData.clausesReplaceableBySafeCall(): Boolean {
|
||||||
if (baseClause == null || negatedClause != null && !negatedClause.isNullExpression()) return false
|
if (baseClause == null) return false
|
||||||
|
if (negatedClause == null && baseClause.isUsedAsExpression(context)) return false
|
||||||
|
if (negatedClause != null && !negatedClause.isNullExpression()) return false
|
||||||
return baseClause.evaluatesTo(receiverExpression) ||
|
return baseClause.evaluatesTo(receiverExpression) ||
|
||||||
baseClause.hasFirstReceiverOf(receiverExpression) && !baseClause.hasNullableType(context)
|
baseClause.hasFirstReceiverOf(receiverExpression) && !baseClause.hasNullableType(context)
|
||||||
}
|
}
|
||||||
|
|||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
// ERROR: 'if' must have both main and 'else' branches if used as an expression
|
||||||
|
// ERROR: Type mismatch: inferred type is Unit but Int was expected
|
||||||
|
|
||||||
|
fun maybeFoo(): String? {
|
||||||
|
return "foo"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun bar(): Int {
|
||||||
|
val foo = maybeFoo()
|
||||||
|
return if (foo != null<caret>) {
|
||||||
|
foo.length
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1838,6 +1838,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("noElseBlockAsExpression.kt")
|
||||||
|
public void testNoElseBlockAsExpression() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifThenToSafeAccess/noElseBlockAsExpression.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noNullInCondition.kt")
|
@TestMetadata("noNullInCondition.kt")
|
||||||
public void testNoNullInCondition() throws Exception {
|
public void testNoNullInCondition() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifThenToSafeAccess/noNullInCondition.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifThenToSafeAccess/noNullInCondition.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user