diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt index 1a923afbefcc..10c262e90d29 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt @@ -114,8 +114,7 @@ class WrapWithSafeLetCallFix( else -> return null } - if (!isNullabilityMismatch(expected = expectedType, actual = actualType)) return null - + if (element.isNull() || !isNullabilityMismatch(expected = expectedType, actual = actualType)) return null return WrapWithSafeLetCallFix(call.getLastParentOfTypeInRow() ?: call, element) } } diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java index bde510fdd090..e6d2121a43b9 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiFileTestGenerated.java @@ -2293,6 +2293,11 @@ public abstract class QuickFixMultiFileTestGenerated extends AbstractQuickFixMul runTest("testData/quickfix/wrapWithSafeLetCall/javaNullabilityMismatchArgument2.test"); } + @TestMetadata("javaNullabilityMismatchDoNotWrapNull.test") + public void testJavaNullabilityMismatchDoNotWrapNull() throws Exception { + runTest("testData/quickfix/wrapWithSafeLetCall/javaNullabilityMismatchDoNotWrapNull.test"); + } + @TestMetadata("javaReceiverNullabilityInvoke.test") public void testJavaReceiverNullabilityInvoke() throws Exception { runTest("testData/quickfix/wrapWithSafeLetCall/javaReceiverNullabilityInvoke.test"); diff --git a/plugins/kotlin/idea/tests/testData/quickfix/wrapWithSafeLetCall/javaNullabilityMismatchDoNotWrapNull.test b/plugins/kotlin/idea/tests/testData/quickfix/wrapWithSafeLetCall/javaNullabilityMismatchDoNotWrapNull.test new file mode 100644 index 000000000000..adf51f69fb2d --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/wrapWithSafeLetCall/javaNullabilityMismatchDoNotWrapNull.test @@ -0,0 +1,51 @@ +// FILE: test.before.kt +// "Wrap with '?.let { ... }' call" "false" +// ACTION: Add 'toString()' call +// ACTION: Add names in comment to call arguments +// ACTION: Convert to run +// ACTION: Convert to with +// ACTION: Do not show hints for current method +package p; + +fun test(x: Foo) { + x.foo(null); +} + +// FILE: org/jspecify/nullness/NullMarked.java +package org.jspecify.nullness; + +import static java.lang.annotation.ElementType.MODULE; +import static java.lang.annotation.ElementType.PACKAGE; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Target({TYPE, PACKAGE, MODULE}) +@Retention(RUNTIME) +public @interface NullMarked {} + +// FILE: org/jspecify/nullness/Nullable.java +package org.jspecify.nullness; + +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +@Target(TYPE_USE) +@Retention(RUNTIME) +public @interface Nullable {} + +// FILE: p/Foo.java +package p; + +import org.jspecify.nullness.NullMarked; + +@NullMarked +public class Foo { + public void foo(String arg) {} +}