"Replace 'invoke' with direct call" intention: fix false positive when function is not operator

#KT-37977 Fixed
This commit is contained in:
Toshiaki Kameyama
2020-04-03 09:26:41 +09:00
committed by Vladimir Dolzhenko
parent e0da30fb13
commit 2f29b38b19
7 changed files with 37 additions and 1 deletions
@@ -8,12 +8,15 @@ package org.jetbrains.kotlin.idea.intentions.conventionNameCalls
import com.intellij.codeInsight.intention.HighPriorityAction
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.intentions.SelfTargetingRangeIntention
import org.jetbrains.kotlin.idea.intentions.callExpression
import org.jetbrains.kotlin.idea.intentions.calleeName
import org.jetbrains.kotlin.idea.intentions.toResolvedCall
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtDotQualifiedExpression
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.util.OperatorNameConventions
class ReplaceInvokeIntention : SelfTargetingRangeIntention<KtDotQualifiedExpression>(
@@ -21,7 +24,10 @@ class ReplaceInvokeIntention : SelfTargetingRangeIntention<KtDotQualifiedExpress
KotlinBundle.lazyMessage("replace.invoke.with.direct.call")
), HighPriorityAction {
override fun applicabilityRange(element: KtDotQualifiedExpression): TextRange? {
if (element.calleeName != OperatorNameConventions.INVOKE.asString() || element.callExpression?.typeArgumentList != null) return null
if (element.calleeName != OperatorNameConventions.INVOKE.asString() ||
element.callExpression?.typeArgumentList != null ||
(element.toResolvedCall(BodyResolveMode.PARTIAL)?.resultingDescriptor as? FunctionDescriptor)?.isOperator != true
) return null
return element.callExpression?.calleeExpression?.textRange
}
@@ -0,0 +1,3 @@
public class JavaClass {
void invoke() {}
}
@@ -0,0 +1,3 @@
public class JavaClass {
void invoke() {}
}
@@ -0,0 +1,3 @@
fun main() {
JavaClass().<caret>invoke()
}
@@ -0,0 +1,3 @@
fun main() {
JavaClass()()
}
@@ -0,0 +1,8 @@
// IS_APPLICABLE: false
class C {
fun invoke() {}
}
fun main() {
C().<caret>invoke()
}
@@ -3930,6 +3930,11 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
runTest("idea/testData/intentions/conventionNameCalls/replaceInvoke/invokeInExpression.kt");
}
@TestMetadata("java.kt")
public void testJava() throws Exception {
runTest("idea/testData/intentions/conventionNameCalls/replaceInvoke/java.kt");
}
@TestMetadata("namedArgumentInvoke.kt")
public void testNamedArgumentInvoke() throws Exception {
runTest("idea/testData/intentions/conventionNameCalls/replaceInvoke/namedArgumentInvoke.kt");
@@ -3940,6 +3945,11 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
runTest("idea/testData/intentions/conventionNameCalls/replaceInvoke/noArgumentInvoke.kt");
}
@TestMetadata("notOperator.kt")
public void testNotOperator() throws Exception {
runTest("idea/testData/intentions/conventionNameCalls/replaceInvoke/notOperator.kt");
}
@TestMetadata("typeAndValueArgument.kt")
public void testTypeAndValueArgument() throws Exception {
runTest("idea/testData/intentions/conventionNameCalls/replaceInvoke/typeAndValueArgument.kt");