User: joe Date: 23 Sep 23 22:00 Revision: 11e17b9ad4866a4e15db2166a4bcf26a8adadf29 Summary: Add quick fix for WrongOperationParametersInspection TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=8759&personal=false Index: src/main/kotlin/platform/mixin/inspection/mixinextras/WrongOperationParametersInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/mixinextras/WrongOperationParametersInspection.kt (revision ceb3a61a0d36f66c6588d428b418fe7203fd4e14) +++ src/main/kotlin/platform/mixin/inspection/mixinextras/WrongOperationParametersInspection.kt (revision 11e17b9ad4866a4e15db2166a4bcf26a8adadf29) @@ -24,11 +24,19 @@ import com.demonwav.mcdev.platform.mixin.util.MixinConstants import com.demonwav.mcdev.platform.mixin.util.isAssignable import com.demonwav.mcdev.util.McdevDfaUtil +import com.intellij.codeInsight.intention.FileModifier.SafeFieldForPreview +import com.intellij.codeInspection.LocalQuickFixOnPsiElement import com.intellij.codeInspection.ProblemsHolder +import com.intellij.openapi.project.Project import com.intellij.psi.JavaElementVisitor +import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiCallExpression import com.intellij.psi.PsiClass import com.intellij.psi.PsiClassType +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiExpressionList import com.intellij.psi.PsiField +import com.intellij.psi.PsiFile import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethodCallExpression import com.intellij.psi.util.PsiTreeUtil @@ -62,10 +70,10 @@ .firstOrNull { (_, param) -> (param.type as? PsiClassType)?.resolve()?.qualifiedName == MixinConstants.MixinExtras.OPERATION } ?: return - val expectedParamTypes = containingMethod.parameterList.parameters.asSequence() + val (expectedParamTypes, paramNames) = containingMethod.parameterList.parameters.asSequence() .take(operationIndex) - .map { it.type } - .toList() + .map { (it.type to it.name) } + .unzip() val qualifier = expression.methodExpression.qualifierExpression ?: return if (!McdevDfaUtil.isSometimesEqualToParameter(qualifier, operationParam)) { @@ -82,8 +90,31 @@ } } - val problemElement = expression.argumentList - holder.registerProblem(problemElement, "Operation.call called with the wrong parameter types") + holder.registerProblem( + expression.argumentList, + "Operation.call called with the wrong parameter types", + ReplaceWithMethodParametersFix(expression.argumentList, paramNames) + ) } } + + private class ReplaceWithMethodParametersFix( + element: PsiExpressionList, + @SafeFieldForPreview private val parameterNames: List + ) : LocalQuickFixOnPsiElement(element) { + override fun getFamilyName() = "Replace with method parameters" + override fun getText() = "Replace with method parameters" + + override fun invoke(project: Project, file: PsiFile, startElement: PsiElement, endElement: PsiElement) { + val argumentList = startElement as? PsiExpressionList ?: return + val elementFactory = JavaPsiFacade.getElementFactory(project) + val newArgumentList = ( + elementFactory.createExpressionFromText( + "foo(${parameterNames.joinToString(", ")})", + argumentList + ) as PsiCallExpression + ).argumentList!! + argumentList.replace(newArgumentList) -} + } + } +}