Elvis -> if intention: don't introduce new variable when RHS type is Nothing

This commit is contained in:
Toshiaki Kameyama
2020-09-29 09:30:20 +09:00
committed by Dmitry Gridin
parent f9f8fd055b
commit 752f6d8f72
4 changed files with 24 additions and 3 deletions
@@ -19,8 +19,10 @@ import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.calls.callUtil.getType
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.types.TypeUtils
import org.jetbrains.kotlin.types.typeUtil.isNothing
class ElvisToIfThenIntention : SelfTargetingRangeIntention<KtBinaryExpression>(
KtBinaryExpression::class.java,
@@ -71,9 +73,12 @@ class ElvisToIfThenIntention : SelfTargetingRangeIntention<KtBinaryExpression>(
if (leftSafeCastReceiver == null) {
val property = (KtPsiUtil.safeDeparenthesize(element).parent as? KtProperty)
val propertyName = property?.name
if ((right is KtReturnExpression || right is KtBreakExpression || right is KtContinueExpression || right is KtThrowExpression)
&& propertyName != null
) {
val rightIsReturnOrJumps = right is KtReturnExpression
|| right is KtBreakExpression
|| right is KtContinueExpression
|| right is KtThrowExpression
|| right.getType(context)?.isNothing() == true
if (rightIsReturnOrJumps && propertyName != null) {
val parent = property.parent
val factory = KtPsiFactory(element)
factory.createExpressionByPattern("if ($0 == null) $1", propertyName, right)
@@ -0,0 +1,5 @@
// WITH_RUNTIME
fun foo(list: List<String>): String {
val first = list.firstOrNull() ?:<caret> error("empty")
return "First length: ${first.length}"
}
@@ -0,0 +1,6 @@
// WITH_RUNTIME
fun foo(list: List<String>): String {
val first = list.firstOrNull()
if (first == null) error("empty")
return "First length: ${first.length}"
}
@@ -2279,6 +2279,11 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
runTest("idea/testData/intentions/branched/elvisToIfThen/assignmentAndContinue.kt");
}
@TestMetadata("assignmentAndError.kt")
public void testAssignmentAndError() throws Exception {
runTest("idea/testData/intentions/branched/elvisToIfThen/assignmentAndError.kt");
}
@TestMetadata("assignmentAndReturn.kt")
public void testAssignmentAndReturn() throws Exception {
runTest("idea/testData/intentions/branched/elvisToIfThen/assignmentAndReturn.kt");