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" "Replace 'if' expression with elvis expression"
) { ) {
private fun IfThenToSelectData.clausesReplaceableByElvis(): Boolean { private fun IfThenToSelectData.clausesReplaceableByElvis(): Boolean =
if (baseClause == null || negatedClause == null || negatedClause.isNullOrBlockExpression()) return false when {
if (negatedClause is KtThrowExpression && negatedClause.throwsNullPointerExceptionWithNoArguments()) return false baseClause == null || negatedClause == null || negatedClause.isNullOrBlockExpression() ->
false
return receiverExpression is KtThisExpression && hasImplicitReceiver() || negatedClause is KtThrowExpression && negatedClause.throwsNullPointerExceptionWithNoArguments() ->
baseClause.evaluatesTo(receiverExpression) || false
baseClause.hasFirstReceiverOf(receiverExpression) && !baseClause.hasNullableType(context) baseClause.evaluatesTo(receiverExpression) ->
} true
receiverExpression is KtThisExpression && hasImplicitReceiver() || baseClause.hasFirstReceiverOf(receiverExpression) ->
!baseClause.hasNullableType(context)
else ->
false
}
override fun isApplicableTo(element: KtIfExpression): Boolean { override fun isApplicableTo(element: KtIfExpression): Boolean {
val ifThenToSelectData = element.buildSelectTransformationData() ?: return false 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"); 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") @TestMetadata("nullableThen.kt")
public void testNullableThen() throws Exception { public void testNullableThen() throws Exception {
runTest("idea/testData/intentions/branched/ifThenToElvis/nullableThen.kt"); runTest("idea/testData/intentions/branched/ifThenToElvis/nullableThen.kt");