package com.nvlad.yii2support.views.inspections;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiWhiteSpace;
import com.jetbrains.php.lang.psi.elements.*;
import com.nvlad.yii2support.common.PsiUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.HashSet;
/**
* Created by NVlad on 16.01.2017.
*/
class UnusedParametersLocalQuickFix implements LocalQuickFix {
private HashSet<String> myUnusedParams;
UnusedParametersLocalQuickFix() {
}
UnusedParametersLocalQuickFix(HashSet<String> unusedParams) {
myUnusedParams = unusedParams;
}
@Nls
@NotNull
@Override
public String getName() {
return getFamilyName();
}
@Nls
@NotNull
@Override
public String getFamilyName() {
return "Remove all unused parameters";
}
@Override
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
PsiElement viewParameters = descriptor.getPsiElement();
if (viewParameters instanceof MethodReference) {
viewParameters = ((MethodReference) viewParameters).getParameters()[1];
}
if (myUnusedParams != null) {
final ArrayList<PsiElement> unused = new ArrayList<>();
if (viewParameters instanceof ArrayCreationExpression) {
for (ArrayHashElement element : ((ArrayCreationExpression) viewParameters).getHashElements()) {
if (element.getKey() != null) {
final String key = ((StringLiteralExpression) element.getKey()).getContents();
if (myUnusedParams.contains(key)) {
unused.add(element);
}
}
}
for (PsiElement element : unused) {
PsiUtil.deleteArrayElement(element);
}
}
if (viewParameters instanceof FunctionReference) {
for (PsiElement element : ((FunctionReference) viewParameters).getParameters()) {
if (element instanceof StringLiteralExpression) {
if (myUnusedParams.contains(((StringLiteralExpression) element).getContents())) {
unused.add(element);
}
}
}
for (PsiElement element : unused) {
PsiUtil.deleteFunctionParam(element);
}
}
} else {
if (viewParameters.getPrevSibling() instanceof PsiWhiteSpace) {
viewParameters.getPrevSibling().delete();
}
viewParameters.getPrevSibling().delete();
viewParameters.delete();
}
}
}