package com.nvlad.yii2support.views.inspections; import com.intellij.codeInsight.template.Template; import com.intellij.codeInsight.template.TemplateManager; import com.intellij.codeInspection.LocalQuickFix; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiErrorElement; import com.intellij.psi.PsiWhiteSpace; import com.jetbrains.php.lang.psi.PhpPsiElementFactory; import com.jetbrains.php.lang.psi.elements.ArrayCreationExpression; import com.jetbrains.php.lang.psi.elements.FunctionReference; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.ParameterList; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import java.util.Collection; /** * Created by NVlad on 15.01.2017. */ class RequireParameterLocalQuickFix implements LocalQuickFix { final private String[] myVariables; RequireParameterLocalQuickFix(Collection<String> variables) { myVariables = variables.toArray(new String[variables.size()]); } @Nls @NotNull @Override public String getName() { if (myVariables.length == 1) { return "Add \"%param%\" parameter".replace("%param%", myVariables[0]); } return "Add View parameter(s)"; } @Nls @NotNull @Override public String getFamilyName() { return "Add View parameter"; } @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { ParameterList parameterList = ((MethodReference) descriptor.getPsiElement()).getParameterList(); if (parameterList == null) { return; } PsiElement[] parameters = parameterList.getParameters(); if (parameters.length == 1 || parameters[1] instanceof PsiErrorElement) { ArrayCreationExpression params = PhpPsiElementFactory.createFromText(project, ArrayCreationExpression.class, "[]"); if (params == null) { return; } if (parameters.length == 1) { parameterList.add(PhpPsiElementFactory.createComma(project)); } else { parameterList.deleteChildRange(parameters[1], parameters[1]); } parameterList.add(params); parameters = parameterList.getParameters(); } TemplateManager templateManager = TemplateManager.getInstance(project); Editor editor = FileEditorManager.getInstance(project).getSelectedTextEditor(); if (editor == null) { return; } if (parameters[1] instanceof FunctionReference) { FunctionReference functionReference = (FunctionReference) parameters[1]; if (functionReference.getName() == null || !functionReference.getName().equals("compact")) { return; } Template template = templateManager.createTemplate("", ""); template.setToReformat(true); Boolean firstElement = functionReference.getParameters().length == 0; for (String variable : myVariables) { template.addTextSegment(firstElement ? "'" : ", '"); String var = "$" + variable.toUpperCase() + "$"; template.addVariable(var, "", "\"" + variable + "\"", true); template.addVariableSegment(var); template.addTextSegment("'"); firstElement = false; } PsiElement psiElement = functionReference.getParameterList(); if (psiElement != null) { editor.getCaretModel().moveToOffset(psiElement.getTextRange().getEndOffset()); PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument()); templateManager.startTemplate(editor, template); } return; } if (!(parameters[1] instanceof ArrayCreationExpression)) { return; } ArrayCreationExpression params = (ArrayCreationExpression) parameters[1]; Template template = templateManager.createTemplate("", ""); template.setToReformat(true); Boolean addComma = params.getHashElements().iterator().hasNext(); Boolean newLined = false; PsiElement psiElement = params.getLastChild(); while (psiElement instanceof PsiWhiteSpace || psiElement.getText().equals("]")) { if (psiElement instanceof PsiWhiteSpace && psiElement.getText().contains("\n")) { newLined = true; } psiElement = psiElement.getPrevSibling(); } if (psiElement.getText().equals(",")) { addComma = false; } for (String variable : myVariables) { if (addComma) { template.addTextSegment(","); } template.addTextSegment((newLined ? "\n" : " ")); String templateVariable = "$" + variable.toUpperCase() + "$"; template.addVariable(templateVariable, "", "\"$" + variable + "\"", true); template.addTextSegment("'" + variable + "' => "); template.addVariableSegment(templateVariable); addComma = true; } template.addTextSegment(newLined ? "," : " "); editor.getCaretModel().moveToOffset(psiElement.getTextRange().getEndOffset()); PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument()); templateManager.startTemplate(editor, template); } }