From fae8efdc7fb5f210aea7c9c35510de3d12f2fdb9 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) --- .../kotlin/idea/quickfix/ReplaceInfixOrOperatorCallFix.kt | 3 ++- .../testData/quickfix/replaceWithSafeCall/invokeOperator.kt | 6 ++++++ .../quickfix/replaceWithSafeCall/invokeOperator.kt.after | 6 ++++++ .../kotlin/idea/quickfix/QuickFixTestGenerated.java | 6 ++++++ 4 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 idea/testData/quickfix/replaceWithSafeCall/invokeOperator.kt create mode 100644 idea/testData/quickfix/replaceWithSafeCall/invokeOperator.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceInfixOrOperatorCallFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceInfixOrOperatorCallFix.kt index e3287f62f12..4e5ebc35cb4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ReplaceInfixOrOperatorCallFix.kt +++ b/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/idea/testData/quickfix/replaceWithSafeCall/invokeOperator.kt b/idea/testData/quickfix/replaceWithSafeCall/invokeOperator.kt new file mode 100644 index 00000000000..619b9d95a60 --- /dev/null +++ b/idea/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/idea/testData/quickfix/replaceWithSafeCall/invokeOperator.kt.after b/idea/testData/quickfix/replaceWithSafeCall/invokeOperator.kt.after new file mode 100644 index 00000000000..1dca1c89038 --- /dev/null +++ b/idea/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 diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 04acfc59723..ab80c017d65 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/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");