From d686e5f561d4170084df8f3f0cea83f8c9605522 Mon Sep 17 00:00:00 2001 From: nd Date: Fri, 7 Jul 2017 16:29:11 +0200 Subject: [PATCH] Handle unsafe implicit invoke on array access expression (#1151) GitOrigin-RevId: 14f92821392f127327f9ce3f2e52b92accc1324b --- .../kotlin/idea/quickfix/ReplaceInfixOrOperatorCallFix.kt | 3 ++- .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 6 ++++++ .../testData/quickfix/replaceWithSafeCall/invokeOperator.kt | 6 ++++++ .../quickfix/replaceWithSafeCall/invokeOperator.kt.after | 6 ++++++ 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/replaceWithSafeCall/invokeOperator.kt create mode 100644 plugins/kotlin/idea/tests/testData/quickfix/replaceWithSafeCall/invokeOperator.kt.after diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceInfixOrOperatorCallFix.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceInfixOrOperatorCallFix.kt index e3287f62f12e..4e5ebc35cb4e 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceInfixOrOperatorCallFix.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceInfixOrOperatorCallFix.kt @@ -21,6 +21,7 @@ import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement 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.intentions.OperatorToFunctionIntention import org.jetbrains.kotlin.lexer.KtTokens @@ -92,7 +93,7 @@ class ReplaceInfixOrOperatorCallFix( companion object : KotlinSingleIntentionActionFactory() { override fun createAction(diagnostic: Diagnostic): IntentionAction? { val expression = diagnostic.psiElement - if (expression is KtArrayAccessExpression) { + if (expression is KtArrayAccessExpression && diagnostic.factory != Errors.UNSAFE_IMPLICIT_INVOKE_CALL) { if (expression.arrayExpression == null) return null return ReplaceInfixOrOperatorCallFix(expression, expression.shouldHaveNotNullType()) } diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 04acfc597238..ab80c017d650 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -8837,6 +8837,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("invokeOperator.kt") + public void testInvokeOperator() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/replaceWithSafeCall/invokeOperator.kt"); + doTest(fileName); + } + @TestMetadata("let.kt") public void testLet() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/replaceWithSafeCall/let.kt"); diff --git a/plugins/kotlin/idea/tests/testData/quickfix/replaceWithSafeCall/invokeOperator.kt b/plugins/kotlin/idea/tests/testData/quickfix/replaceWithSafeCall/invokeOperator.kt new file mode 100644 index 000000000000..619b9d95a605 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/replaceWithSafeCall/invokeOperator.kt @@ -0,0 +1,6 @@ +// "Replace with safe (?.) call" "true" +// WITH_RUNTIME + +val functions: Map Any> = TODO() + +fun run(name: String) = functions[name]() \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/quickfix/replaceWithSafeCall/invokeOperator.kt.after b/plugins/kotlin/idea/tests/testData/quickfix/replaceWithSafeCall/invokeOperator.kt.after new file mode 100644 index 000000000000..1dca1c890388 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/quickfix/replaceWithSafeCall/invokeOperator.kt.after @@ -0,0 +1,6 @@ +// "Replace with safe (?.) call" "true" +// WITH_RUNTIME + +val functions: Map Any> = TODO() + +fun run(name: String) = functions[name]?.invoke() \ No newline at end of file