diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt index 2987bdef166..fdc3913a12d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/IfThenUtils.kt @@ -165,13 +165,20 @@ data class IfThenToSelectData( it.leftHandSide, it.typeReference!!) } + return if (baseClauseEvaluatesToReceiver()) { if (condition is KtIsExpression) newReceiver!! else baseClause } else { when { - condition is KtIsExpression -> (baseClause as KtDotQualifiedExpression).replaceFirstReceiver( - factory, newReceiver!!, safeAccess = true) + condition is KtIsExpression -> { + when { + baseClause is KtDotQualifiedExpression -> baseClause.replaceFirstReceiver( + factory, newReceiver!!, safeAccess = true) + hasImplicitReceiver() -> factory.createExpressionByPattern("$0?.$1", newReceiver!!, baseClause).insertSafeCalls(factory) + else -> error("Illegal state") + } + } hasImplicitReceiver() -> factory.createExpressionByPattern("this?.$0", baseClause).insertSafeCalls(factory) else -> baseClause.insertSafeCalls(factory) } diff --git a/idea/testData/intentions/branched/ifThenToElvis/kt19666.kt b/idea/testData/intentions/branched/ifThenToElvis/kt19666.kt new file mode 100644 index 00000000000..e83c7b548e9 --- /dev/null +++ b/idea/testData/intentions/branched/ifThenToElvis/kt19666.kt @@ -0,0 +1,13 @@ +// WITH_RUNTIME +interface Taggable { + val tag: String +} + +fun Any.log() { + val tag = if (this is Taggable) { + tag + } + else { + this::class.java.simpleName + } +} \ No newline at end of file diff --git a/idea/testData/intentions/branched/ifThenToElvis/kt19666.kt.after b/idea/testData/intentions/branched/ifThenToElvis/kt19666.kt.after new file mode 100644 index 00000000000..b74dc269e52 --- /dev/null +++ b/idea/testData/intentions/branched/ifThenToElvis/kt19666.kt.after @@ -0,0 +1,8 @@ +// WITH_RUNTIME +interface Taggable { + val tag: String +} + +fun Any.log() { + val tag = (this as? Taggable)?.tag ?: this::class.java.simpleName +} \ 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 924d2663e6d..5a74aa93130 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -1423,6 +1423,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("kt19666.kt") + public void testKt19666() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifThenToElvis/kt19666.kt"); + doTest(fileName); + } + @TestMetadata("lhsEqualsNull.kt") public void testLhsEqualsNull() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifThenToElvis/lhsEqualsNull.kt");