If then to elvis: handle nullability even with implicit receiver
So #KT-22741 Fixed
This commit is contained in:
+13
-8
@@ -46,14 +46,19 @@ class IfThenToElvisIntention : SelfTargetingOffsetIndependentIntention<KtIfExpre
|
||||
"Replace 'if' expression with elvis expression"
|
||||
) {
|
||||
|
||||
private fun IfThenToSelectData.clausesReplaceableByElvis(): Boolean {
|
||||
if (baseClause == null || negatedClause == null || negatedClause.isNullOrBlockExpression()) return false
|
||||
if (negatedClause is KtThrowExpression && negatedClause.throwsNullPointerExceptionWithNoArguments()) return false
|
||||
|
||||
return receiverExpression is KtThisExpression && hasImplicitReceiver() ||
|
||||
baseClause.evaluatesTo(receiverExpression) ||
|
||||
baseClause.hasFirstReceiverOf(receiverExpression) && !baseClause.hasNullableType(context)
|
||||
}
|
||||
private fun IfThenToSelectData.clausesReplaceableByElvis(): Boolean =
|
||||
when {
|
||||
baseClause == null || negatedClause == null || negatedClause.isNullOrBlockExpression() ->
|
||||
false
|
||||
negatedClause is KtThrowExpression && negatedClause.throwsNullPointerExceptionWithNoArguments() ->
|
||||
false
|
||||
baseClause.evaluatesTo(receiverExpression) ->
|
||||
true
|
||||
receiverExpression is KtThisExpression && hasImplicitReceiver() || baseClause.hasFirstReceiverOf(receiverExpression) ->
|
||||
!baseClause.hasNullableType(context)
|
||||
else ->
|
||||
false
|
||||
}
|
||||
|
||||
override fun isApplicableTo(element: KtIfExpression): Boolean {
|
||||
val ifThenToSelectData = element.buildSelectTransformationData() ?: return false
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
// IS_APPLICABLE: false
|
||||
|
||||
class Something {
|
||||
fun nullable(): Int? = null
|
||||
}
|
||||
fun Something?.nullable(value: Int): Int? =
|
||||
<caret>if (this == null) value else nullable()
|
||||
@@ -2358,6 +2358,11 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
||||
runTest("idea/testData/intentions/branched/ifThenToElvis/nullCheckWithSelectorCallChain.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("nullableResultWithImplicitReceiver.kt")
|
||||
public void testNullableResultWithImplicitReceiver() throws Exception {
|
||||
runTest("idea/testData/intentions/branched/ifThenToElvis/nullableResultWithImplicitReceiver.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("nullableThen.kt")
|
||||
public void testNullableThen() throws Exception {
|
||||
runTest("idea/testData/intentions/branched/ifThenToElvis/nullableThen.kt");
|
||||
|
||||
Reference in New Issue
Block a user