FIR IDE: Enable ReplaceInfixOrOperatorCallFix for
UNSAFE_IMPLICIT_INVOKE_CALL.
This commit is contained in:
committed by
teamcityserver
parent
6de1000818
commit
ef923d4cfe
@@ -111,6 +111,7 @@ class MainKtQuickFixRegistrar : KtQuickFixRegistrar() {
|
|||||||
registerApplicator(ReplaceCallFixFactories.unsafeCallFactory)
|
registerApplicator(ReplaceCallFixFactories.unsafeCallFactory)
|
||||||
registerApplicator(ReplaceCallFixFactories.unsafeInfixCallFactory)
|
registerApplicator(ReplaceCallFixFactories.unsafeInfixCallFactory)
|
||||||
registerApplicator(ReplaceCallFixFactories.unsafeOperatorCallFactory)
|
registerApplicator(ReplaceCallFixFactories.unsafeOperatorCallFactory)
|
||||||
|
registerApplicator(ReplaceCallFixFactories.unsafeImplicitInvokeCallFactory)
|
||||||
registerApplicator(AddExclExclCallFixFactories.unsafeCallFactory)
|
registerApplicator(AddExclExclCallFixFactories.unsafeCallFactory)
|
||||||
registerApplicator(AddExclExclCallFixFactories.unsafeInfixCallFactory)
|
registerApplicator(AddExclExclCallFixFactories.unsafeInfixCallFactory)
|
||||||
registerApplicator(AddExclExclCallFixFactories.unsafeOperatorCallFactory)
|
registerApplicator(AddExclExclCallFixFactories.unsafeOperatorCallFactory)
|
||||||
|
|||||||
@@ -66,6 +66,26 @@ object ReplaceCallFixFactories {
|
|||||||
listOf(ReplaceInfixOrOperatorCallFix(target, shouldHaveNotNullType(target), diagnostic.operator))
|
listOf(ReplaceInfixOrOperatorCallFix(target, shouldHaveNotNullType(target), diagnostic.operator))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val unsafeImplicitInvokeCallFactory =
|
||||||
|
diagnosticFixFactory<KtFirDiagnostic.UnsafeImplicitInvokeCall> { diagnostic ->
|
||||||
|
val target = diagnostic.psi as? KtNameReferenceExpression ?: return@diagnosticFixFactory emptyList()
|
||||||
|
|
||||||
|
val callExpression = target.parent as? KtCallExpression ?: return@diagnosticFixFactory emptyList()
|
||||||
|
val qualifiedExpression = callExpression.parent as? KtQualifiedExpression
|
||||||
|
if (qualifiedExpression == null) {
|
||||||
|
// TODO: This matches FE 1.0 behavior (see ReplaceInfixOrOperatorCallFixFactory.kt) but we should be able to do the fix
|
||||||
|
// when the call is a qualified expression. We just need to make sure to pass any extension receiver as an argument, e.g.:
|
||||||
|
//
|
||||||
|
// fun test(exec: (String.() -> Unit)?) = "".exec() // Can be fixed to exec?.invoke("")
|
||||||
|
//
|
||||||
|
// This should be differentiated from this case without an extension receiver:
|
||||||
|
//
|
||||||
|
// class A(val exec: (() -> Unit)?)
|
||||||
|
// fun test(a: A) = a.exec() // Can be fixed to a.exec?.invoke()
|
||||||
|
listOf(ReplaceInfixOrOperatorCallFix(callExpression, shouldHaveNotNullType(callExpression)))
|
||||||
|
} else emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
private fun KtAnalysisSession.shouldHaveNotNullType(expression: KtExpression): Boolean {
|
private fun KtAnalysisSession.shouldHaveNotNullType(expression: KtExpression): Boolean {
|
||||||
// This function is used to determine if we may need to add an elvis operator after the safe call. For example, to replace
|
// This function is used to determine if we may need to add an elvis operator after the safe call. For example, to replace
|
||||||
// `s.length` in `val x: Int = s.length` with a safe call, it should be replaced with `s.length ?: <caret>`.
|
// `s.length` in `val x: Int = s.length` with a safe call, it should be replaced with `s.length ?: <caret>`.
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
// "Replace with safe (?.) call" "true"
|
||||||
|
|
||||||
|
fun foo(exec: (() -> Unit)?) = exec?.invoke() ?: <caret>
|
||||||
@@ -1,5 +1,3 @@
|
|||||||
// "Replace with safe (?.) call" "true"
|
// "Replace with safe (?.) call" "true"
|
||||||
|
|
||||||
fun foo(exec: (() -> Unit)?) = exec<caret>()
|
fun foo(exec: (() -> Unit)?) = exec<caret>()
|
||||||
|
|
||||||
/* IGNORE_FIR */
|
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
// "Replace with safe (?.) call" "true"
|
// "Replace with safe (?.) call" "true"
|
||||||
|
|
||||||
fun foo(exec: (() -> Unit)?) = exec?.invoke()
|
fun foo(exec: (() -> Unit)?) = exec?.invoke()
|
||||||
|
|
||||||
/* IGNORE_FIR */
|
|
||||||
|
|||||||
@@ -6,5 +6,3 @@ fun bar() {
|
|||||||
var i: Int = 1
|
var i: Int = 1
|
||||||
i = fff<caret>()
|
i = fff<caret>()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IGNORE_FIR */
|
|
||||||
|
|||||||
-2
@@ -6,5 +6,3 @@ fun bar() {
|
|||||||
var i: Int = 1
|
var i: Int = 1
|
||||||
i = fff?.invoke() ?: <caret>
|
i = fff?.invoke() ?: <caret>
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IGNORE_FIR */
|
|
||||||
|
|||||||
@@ -7,5 +7,3 @@ fun bar() {
|
|||||||
val fff: (() -> Unit)? = ::foo
|
val fff: (() -> Unit)? = ::foo
|
||||||
<caret>fff()
|
<caret>fff()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IGNORE_FIR */
|
|
||||||
|
|||||||
@@ -7,5 +7,3 @@ fun bar() {
|
|||||||
val fff: (() -> Unit)? = ::foo
|
val fff: (() -> Unit)? = ::foo
|
||||||
fff?.invoke()
|
fff?.invoke()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IGNORE_FIR */
|
|
||||||
|
|||||||
Reference in New Issue
Block a user