diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/psiUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/psiUtils.kt index 281b9149f0b..81f613fe297 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/psiUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/psiUtils.kt @@ -365,5 +365,5 @@ fun E.createSmartPointer(): SmartPsiElementPointer = fun PsiElement.before(element: PsiElement) = textRange.endOffset <= element.textRange.startOffset -inline fun PsiElement.getLastParentOfTypeInRow() = parents.takeWhile { it is T }.lastOrNull() +inline fun PsiElement.getLastParentOfTypeInRow() = parents.takeWhile { it is T }.lastOrNull() as? T diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt index 6f1b6ff4cb5..97750809bf1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt @@ -24,10 +24,9 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.getLastParentOfTypeInRow import org.jetbrains.kotlin.psi.psiUtil.getParentOfType -import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.typeUtil.isNullabilityMismatch -import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf class WrapWithSafeLetCallFix( expression: KtExpression, @@ -71,7 +70,7 @@ class WrapWithSafeLetCallFix( if (!isNullabilityMismatch(expected = typeMismatch.a, actual = typeMismatch.b)) return null - return WrapWithSafeLetCallFix(call, typeMismatch.psiElement) + return WrapWithSafeLetCallFix(call.getLastParentOfTypeInRow() ?: call, typeMismatch.psiElement) } } } \ No newline at end of file diff --git a/idea/testData/quickfix/wrapWithSafeLetCall/chainedCallTypeMismatch.kt b/idea/testData/quickfix/wrapWithSafeLetCall/chainedCallTypeMismatch.kt new file mode 100644 index 00000000000..c1717e3684a --- /dev/null +++ b/idea/testData/quickfix/wrapWithSafeLetCall/chainedCallTypeMismatch.kt @@ -0,0 +1,8 @@ +// "Wrap with '?.let { ... }' call" "true" +// WITH_RUNTIME + +fun Int.foo(x: Int) = this + x + +val arg: Int? = 42 + +val res = 24.hashCode().foo(arg) diff --git a/idea/testData/quickfix/wrapWithSafeLetCall/chainedCallTypeMismatch.kt.after b/idea/testData/quickfix/wrapWithSafeLetCall/chainedCallTypeMismatch.kt.after new file mode 100644 index 00000000000..0c32237543f --- /dev/null +++ b/idea/testData/quickfix/wrapWithSafeLetCall/chainedCallTypeMismatch.kt.after @@ -0,0 +1,8 @@ +// "Wrap with '?.let { ... }' call" "true" +// WITH_RUNTIME + +fun Int.foo(x: Int) = this + x + +val arg: Int? = 42 + +val res = arg?.let { 24.hashCode().foo(it) } diff --git a/idea/testData/quickfix/wrapWithSafeLetCall/objectQualifier.kt b/idea/testData/quickfix/wrapWithSafeLetCall/objectQualifier.kt new file mode 100644 index 00000000000..aa99e254793 --- /dev/null +++ b/idea/testData/quickfix/wrapWithSafeLetCall/objectQualifier.kt @@ -0,0 +1,8 @@ +// "Wrap with '?.let { ... }' call" "true" +// WITH_RUNTIME + +object Obj { + fun foo(x: Int) = x +} +val arg: Int? = null +val argFoo = Obj.foo(arg) \ No newline at end of file diff --git a/idea/testData/quickfix/wrapWithSafeLetCall/objectQualifier.kt.after b/idea/testData/quickfix/wrapWithSafeLetCall/objectQualifier.kt.after new file mode 100644 index 00000000000..2ea84281365 --- /dev/null +++ b/idea/testData/quickfix/wrapWithSafeLetCall/objectQualifier.kt.after @@ -0,0 +1,8 @@ +// "Wrap with '?.let { ... }' call" "true" +// WITH_RUNTIME + +object Obj { + fun foo(x: Int) = x +} +val arg: Int? = null +val argFoo = arg?.let { Obj.foo(it) } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 9c0a49993a8..82afa6e2898 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -9151,6 +9151,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("chainedCallTypeMismatch.kt") + public void testChainedCallTypeMismatch() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/chainedCallTypeMismatch.kt"); + doTest(fileName); + } + @TestMetadata("chainedUnsafeCall.kt") public void testChainedUnsafeCall() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/chainedUnsafeCall.kt"); @@ -9181,6 +9187,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("objectQualifier.kt") + public void testObjectQualifier() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/objectQualifier.kt"); + doTest(fileName); + } + @TestMetadata("unstableValue.kt") public void testUnstableValue() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/unstableValue.kt");