[kotlin k2] Fix ChangeToFunctionInvocationFix producing invalid code for generic function

^KTIJ-30062

GitOrigin-RevId: 21c2817779ee0b8d662d902d8a68d33b28c672cd
This commit is contained in:
Andrey Cherkasov
2024-05-25 02:03:01 +00:00
committed by intellij-monorepo-bot
parent 0ab6a8e24f
commit f572557a66
5 changed files with 39 additions and 4 deletions
@@ -4,15 +4,20 @@ package org.jetbrains.kotlin.idea.k2.codeinsight.fixes
import org.jetbrains.kotlin.analysis.api.fir.diagnostics.KaFirDiagnostic
import org.jetbrains.kotlin.idea.codeinsight.api.applicators.fixes.KotlinQuickFixFactory
import org.jetbrains.kotlin.idea.quickfix.ChangeToFunctionInvocationFix
import org.jetbrains.kotlin.psi.KtCallExpression
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtTypeArgumentList
import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments
internal object ChangeToFunctionInvocationFixFactory {
val changeToFunctionInvocationFixFactory = KotlinQuickFixFactory.ModCommandBased { diagnostic: KaFirDiagnostic.FunctionCallExpected ->
val expression = diagnostic.psi as? KtExpression ?: return@ModCommandBased emptyList()
listOf(
ChangeToFunctionInvocationFix(expression)
)
val next = expression.getNextSiblingIgnoringWhitespaceAndComments()
val parent = expression.parent
if (next is KtTypeArgumentList && parent is KtCallExpression) {
return@ModCommandBased listOf(ChangeToFunctionInvocationFix(parent))
}
listOf(ChangeToFunctionInvocationFix(expression))
}
}
@@ -6119,6 +6119,11 @@ public abstract class HighLevelQuickFixTestGenerated extends AbstractHighLevelQu
runTest("../../../idea/tests/testData/quickfix/variables/changeToFunctionInvocation/funInvWithoutParentheses.kt");
}
@TestMetadata("genericFunction.kt")
public void testGenericFunction() throws Exception {
runTest("../../../idea/tests/testData/quickfix/variables/changeToFunctionInvocation/genericFunction.kt");
}
@TestMetadata("inStringTemplate.kt")
public void testInStringTemplate() throws Exception {
runTest("../../../idea/tests/testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate.kt");
@@ -17718,6 +17718,11 @@ public abstract class K1QuickFixTestGenerated extends AbstractK1QuickFixTest {
runTest("testData/quickfix/variables/changeToFunctionInvocation/funInvWithoutParentheses.kt");
}
@TestMetadata("genericFunction.kt")
public void testGenericFunction() throws Exception {
runTest("testData/quickfix/variables/changeToFunctionInvocation/genericFunction.kt");
}
@TestMetadata("inStringTemplate.kt")
public void testInStringTemplate() throws Exception {
runTest("testData/quickfix/variables/changeToFunctionInvocation/inStringTemplate.kt");
@@ -0,0 +1,10 @@
// "Change to function invocation" "true"
// ERROR: No value passed for parameter 'i'
fun <T> foo(i: Int) = 42
fun main() {
val listFoo = foo<caret><String>
}
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeToFunctionInvocationFix
// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeToFunctionInvocationFix
@@ -0,0 +1,10 @@
// "Change to function invocation" "true"
// ERROR: No value passed for parameter 'i'
fun <T> foo(i: Int) = 42
fun main() {
val listFoo = foo<String>()
}
// FUS_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeToFunctionInvocationFix
// FUS_K2_QUICKFIX_NAME: org.jetbrains.kotlin.idea.quickfix.ChangeToFunctionInvocationFix