diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt index 96074c0b36e..0f4e05c3adc 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt @@ -21,12 +21,14 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.caches.resolve.analyze 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.createSmartPointer import org.jetbrains.kotlin.psi.psiUtil.getLastParentOfTypeInRow import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.types.typeUtil.isNullabilityMismatch class WrapWithSafeLetCallFix( @@ -57,6 +59,12 @@ class WrapWithSafeLetCallFix( object UnsafeFactory : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { val element = diagnostic.psiElement + + if (element is KtNameReferenceExpression) { + val resolvedCall = element.getResolvedCall(element.analyze()) + if (resolvedCall?.call?.callType != Call.CallType.INVOKE) return null + } + val expression = element.getParentOfType(true) ?: return null val parent = element.parent diff --git a/idea/testData/quickfix/replaceWithSafeCall/noReplaceWithSafeCallForImplicitReceiver.kt b/idea/testData/quickfix/replaceWithSafeCall/noReplaceWithSafeCallForImplicitReceiver.kt index 5b19167dc1e..2d3ad536303 100644 --- a/idea/testData/quickfix/replaceWithSafeCall/noReplaceWithSafeCallForImplicitReceiver.kt +++ b/idea/testData/quickfix/replaceWithSafeCall/noReplaceWithSafeCallForImplicitReceiver.kt @@ -2,7 +2,6 @@ // ACTION: Add non-null asserted (!!) call // ACTION: Convert to expression body // ACTION: Replace with safe (this?.) call -// ACTION: Wrap with '?.let { ... }' call // ERROR: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type A? class A { diff --git a/idea/testData/quickfix/wrapWithSafeLetCall/extensionMethod.kt b/idea/testData/quickfix/wrapWithSafeLetCall/extensionMethod.kt new file mode 100644 index 00000000000..e0151183d70 --- /dev/null +++ b/idea/testData/quickfix/wrapWithSafeLetCall/extensionMethod.kt @@ -0,0 +1,10 @@ +// "Wrap with '?.let { ... }' call" "false" +// WITH_RUNTIME +// ACTION: Add non-null asserted (!!) call +// ACTION: Introduce local variable +// ACTION: Replace with safe (this?.) call +// ERROR: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? + +fun String?.foo() { + toLowerCase() +} \ 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 2df5381d861..f5a65b0be3c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -11243,6 +11243,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("extensionMethod.kt") + public void testExtensionMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/extensionMethod.kt"); + doTest(fileName); + } + @TestMetadata("insideLet.kt") public void testInsideLet() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/insideLet.kt");