diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt index 141c2b7dae3..0554cb23c11 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/WrapWithSafeLetCallFix.kt @@ -21,6 +21,8 @@ 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.core.KotlinNameSuggester +import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.types.TypeUtils @@ -38,8 +40,13 @@ class WrapWithSafeLetCallFix( override fun invoke(project: Project, editor: Editor?, file: KtFile) { val factory = KtPsiFactory(element) val nullableText = nullableExpression.text - nullableExpression.replace(factory.createExpression("it")) - val wrapped = factory.createExpressionByPattern("$0?.let { $1 }", nullableText, element.text) + val validator = NewDeclarationNameValidator(element, nullableExpression, NewDeclarationNameValidator.Target.VARIABLES) + val name = KotlinNameSuggester.suggestNameByName("it", validator) + nullableExpression.replace(factory.createExpression(name)) + val wrapped = when (name) { + "it" -> factory.createExpressionByPattern("$0?.let { $1 }", nullableText, element) + else -> factory.createExpressionByPattern("$0?.let { $1 -> $2 }", nullableText, name, element) + } element.replace(wrapped) } diff --git a/idea/testData/quickfix/wrapWithSafeLetCall/insideLet.kt b/idea/testData/quickfix/wrapWithSafeLetCall/insideLet.kt new file mode 100644 index 00000000000..3177eb40747 --- /dev/null +++ b/idea/testData/quickfix/wrapWithSafeLetCall/insideLet.kt @@ -0,0 +1,8 @@ +// "Wrap with '?.let { ... }' call" "true" +// WITH_RUNTIME + +fun foo(x: String?, y: String) { + y.let { bar(x, it) } +} + +fun bar(s: String, t: String) = s.hashCode() + t.hashCode() \ No newline at end of file diff --git a/idea/testData/quickfix/wrapWithSafeLetCall/insideLet.kt.after b/idea/testData/quickfix/wrapWithSafeLetCall/insideLet.kt.after new file mode 100644 index 00000000000..fbb2cdfbec7 --- /dev/null +++ b/idea/testData/quickfix/wrapWithSafeLetCall/insideLet.kt.after @@ -0,0 +1,8 @@ +// "Wrap with '?.let { ... }' call" "true" +// WITH_RUNTIME + +fun foo(x: String?, y: String) { + y.let { x?.let { it1 -> bar(it1, it) } } +} + +fun bar(s: String, t: String) = s.hashCode() + t.hashCode() \ 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 9086f64adba..8af10c24ae7 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -8788,6 +8788,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("insideLet.kt") + public void testInsideLet() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/insideLet.kt"); + doTest(fileName); + } + @TestMetadata("invokeFuncUnsafe.kt") public void testInvokeFuncUnsafe() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/wrapWithSafeLetCall/invokeFuncUnsafe.kt");