Handle unsafe implicit invoke on array access expression (#1151)

This commit is contained in:
nd
2017-07-07 16:29:11 +02:00
committed by Dmitry Jemerov
parent 8cc9195fae
commit fae8efdc7f
4 changed files with 20 additions and 1 deletions
@@ -21,6 +21,7 @@ import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.diagnostics.Diagnostic 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.caches.resolve.analyze
import org.jetbrains.kotlin.idea.intentions.OperatorToFunctionIntention import org.jetbrains.kotlin.idea.intentions.OperatorToFunctionIntention
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
@@ -92,7 +93,7 @@ class ReplaceInfixOrOperatorCallFix(
companion object : KotlinSingleIntentionActionFactory() { companion object : KotlinSingleIntentionActionFactory() {
override fun createAction(diagnostic: Diagnostic): IntentionAction? { override fun createAction(diagnostic: Diagnostic): IntentionAction? {
val expression = diagnostic.psiElement 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 if (expression.arrayExpression == null) return null
return ReplaceInfixOrOperatorCallFix(expression, expression.shouldHaveNotNullType()) return ReplaceInfixOrOperatorCallFix(expression, expression.shouldHaveNotNullType())
} }
@@ -0,0 +1,6 @@
// "Replace with safe (?.) call" "true"
// WITH_RUNTIME
val functions: Map<String, () -> Any> = TODO()
fun run(name: String) = functions[name]<caret>()
@@ -0,0 +1,6 @@
// "Replace with safe (?.) call" "true"
// WITH_RUNTIME
val functions: Map<String, () -> Any> = TODO()
fun run(name: String) = functions[name]?.invoke()
@@ -8837,6 +8837,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest(fileName); 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") @TestMetadata("let.kt")
public void testLet() throws Exception { public void testLet() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/replaceWithSafeCall/let.kt"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/replaceWithSafeCall/let.kt");