From 39090113e903b1dfd3a3c34653cdfb495c2d7a10 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 28 Jul 2016 12:40:53 +0300 Subject: [PATCH] KT-13262 related: surround with null check is applicable now also for qualified calls with argument type mismatch (cherry picked from commit 8f13c84) --- .../kotlin/idea/quickfix/SurroundWithNullCheckFix.kt | 7 +++++-- .../quickfix/surroundWithNullCheck/objectQualifier.kt | 9 +++++++++ .../surroundWithNullCheck/objectQualifier.kt.after | 11 +++++++++++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 6 ++++++ 4 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 idea/testData/quickfix/surroundWithNullCheck/objectQualifier.kt create mode 100644 idea/testData/quickfix/surroundWithNullCheck/objectQualifier.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithNullCheckFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithNullCheckFix.kt index 293a731d229..7ba3b4259b4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithNullCheckFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/SurroundWithNullCheckFix.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getLastParentOfTypeInRow import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.psi.psiUtil.getParentOfTypesAndPredicate import org.jetbrains.kotlin.resolve.calls.callUtil.getType @@ -93,13 +94,15 @@ class SurroundWithNullCheckFix( val nullableExpression = typeMismatch.psiElement as? KtReferenceExpression ?: return null val argument = nullableExpression.parent as? KtValueArgument ?: return null val call = argument.getParentOfType(true) ?: return null - if (call.parent !is KtBlockExpression) return null + + val rootCall = call.getLastParentOfTypeInRow() ?: call + if (rootCall.parent !is KtBlockExpression) return null if (!isNullabilityMismatch(expected = typeMismatch.a, actual = typeMismatch.b)) return null if (!nullableExpression.isStable()) return null - return SurroundWithNullCheckFix(call, nullableExpression) + return SurroundWithNullCheckFix(rootCall, nullableExpression) } } } diff --git a/idea/testData/quickfix/surroundWithNullCheck/objectQualifier.kt b/idea/testData/quickfix/surroundWithNullCheck/objectQualifier.kt new file mode 100644 index 00000000000..0bc43f62743 --- /dev/null +++ b/idea/testData/quickfix/surroundWithNullCheck/objectQualifier.kt @@ -0,0 +1,9 @@ +// "Surround with null check" "true" + +object Obj { + fun foo(x: Int) = x +} + +fun use(arg: Int?) { + Obj.foo(arg) +} diff --git a/idea/testData/quickfix/surroundWithNullCheck/objectQualifier.kt.after b/idea/testData/quickfix/surroundWithNullCheck/objectQualifier.kt.after new file mode 100644 index 00000000000..fac4793147b --- /dev/null +++ b/idea/testData/quickfix/surroundWithNullCheck/objectQualifier.kt.after @@ -0,0 +1,11 @@ +// "Surround with null check" "true" + +object Obj { + fun foo(x: Int) = x +} + +fun use(arg: Int?) { + if (arg != null) { + Obj.foo(arg) + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 82afa6e2898..fc2fe3af9c6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -7756,6 +7756,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("objectQualifier.kt") + public void testObjectQualifier() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/surroundWithNullCheck/objectQualifier.kt"); + doTest(fileName); + } + @TestMetadata("simpleUnsafeCall.kt") public void testSimpleUnsafeCall() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/surroundWithNullCheck/simpleUnsafeCall.kt");