From e7cef797099ccb9ef0844796ca2497d53665f8f9 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 27 Oct 2016 14:56:08 +0300 Subject: [PATCH] If then to elvis: now not applicable for is with type unrelated to original #KT-14520 Fixed --- .../intentions/IfThenToElvisIntention.kt | 6 +++++- .../ifThenToElvis/isCheckForUnrelatedType.kt | 12 ++++++++++++ .../idea/intentions/IntentionTestGenerated.java | 6 ++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 idea/testData/intentions/branched/ifThenToElvis/isCheckForUnrelatedType.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/IfThenToElvisIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/IfThenToElvisIntention.kt index 877bce6f667..19ec0521e4e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/IfThenToElvisIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/IfThenToElvisIntention.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode.Companion.PARTIAL import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.TypeNullability +import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf import org.jetbrains.kotlin.types.typeUtil.nullability class IfThenToElvisInspection : IntentionBasedInspection(IfThenToElvisIntention::class) @@ -69,7 +70,10 @@ class IfThenToElvisIntention : SelfTargetingOffsetIndependentIntention false } is KtIsExpression -> { - if (!context[BindingContext.TYPE, condition.typeReference].isNotNull()) return false + val targetType = context[BindingContext.TYPE, condition.typeReference] ?: return false + if (!targetType.isNotNull()) return false + val originalType = condition.leftHandSide.getType(context) ?: return false + if (!targetType.isSubtypeOf(originalType)) return false when (condition.isNegated) { true -> checkedExpression.clausesReplaceableByElvis(thenClause, elseClause, context) diff --git a/idea/testData/intentions/branched/ifThenToElvis/isCheckForUnrelatedType.kt b/idea/testData/intentions/branched/ifThenToElvis/isCheckForUnrelatedType.kt new file mode 100644 index 00000000000..d5995260f0a --- /dev/null +++ b/idea/testData/intentions/branched/ifThenToElvis/isCheckForUnrelatedType.kt @@ -0,0 +1,12 @@ +// IS_APPLICABLE: false + +interface A +interface B + +fun prepare(x: A) = x +fun use(x: A) {} + +fun test(x: A) { + val xx = if (x is B) x else prepare(x) + use(xx) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index dbdfcb338f2..3098e46584c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -1308,6 +1308,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("isCheckForUnrelatedType.kt") + public void testIsCheckForUnrelatedType() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifThenToElvis/isCheckForUnrelatedType.kt"); + doTest(fileName); + } + @TestMetadata("isCheckWithSelector.kt") public void testIsCheckWithSelector() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifThenToElvis/isCheckWithSelector.kt");