package fr.adrienbrault.idea.symfony2plugin.intentions.php;
import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction;
import com.intellij.ide.highlighter.XmlFileType;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.IncorrectOperationException;
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent;
import fr.adrienbrault.idea.symfony2plugin.action.ServiceActionUtil;
import fr.adrienbrault.idea.symfony2plugin.stubs.ContainerCollectionResolver;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class XmlServiceArgumentIntention extends PsiElementBaseIntentionAction {
@Override
public void invoke(@NotNull Project project, Editor editor, @NotNull PsiElement psiElement) throws IncorrectOperationException {
XmlTag xmlTag = getServiceTagValid(psiElement);
if(xmlTag == null) {
return;
}
final List<String> args = ServiceActionUtil.getXmlMissingArgumentTypes(xmlTag, true, new ContainerCollectionResolver.LazyServiceCollector(project));
if (args == null) {
return;
}
ServiceActionUtil.fixServiceArgument(args, xmlTag);
}
@Override
public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement psiElement) {
if(psiElement.getContainingFile().getFileType() != XmlFileType.INSTANCE || !Symfony2ProjectComponent.isEnabled(psiElement.getProject())) {
return false;
}
XmlTag serviceTagValid = getServiceTagValid(psiElement);
if(serviceTagValid == null) {
return false;
}
if(!ServiceActionUtil.isValidXmlParameterInspectionService(serviceTagValid)) {
return false;
}
return ServiceActionUtil.getXmlMissingArgumentTypes(serviceTagValid, true, new ContainerCollectionResolver.LazyServiceCollector(project)) != null;
}
@Nullable
public static XmlTag getServiceTagValid(@NotNull PsiElement psiElement) {
XmlTag xmlTag = PsiTreeUtil.getParentOfType(psiElement, XmlTag.class);
if(xmlTag == null) {
return null;
}
if("service".equals(xmlTag.getName())) {
return xmlTag;
}
xmlTag = PsiTreeUtil.getParentOfType(xmlTag, XmlTag.class);
if(xmlTag != null && "service".equals(xmlTag.getName())) {
return xmlTag;
}
return null;
}
@NotNull
@Override
public String getFamilyName() {
return "Symfony";
}
@NotNull
@Override
public String getText() {
return "Symfony: Add Arguments";
}
}