If then to elvis: handle nullability even with implicit receiver

So #KT-22741 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-04-19 10:55:10 +03:00
parent 49165bdbef
commit 8f0c53d0de
3 changed files with 25 additions and 8 deletions
@@ -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
@@ -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");