package fr.adrienbrault.idea.symfony2plugin.intentions.xml; import com.intellij.codeInsight.hint.HintManager; 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.XmlElementFactory; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlTag; import com.intellij.util.IncorrectOperationException; import com.jetbrains.php.lang.psi.elements.PhpClass; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.action.ServiceActionUtil; import fr.adrienbrault.idea.symfony2plugin.intentions.php.XmlServiceArgumentIntention; import fr.adrienbrault.idea.symfony2plugin.stubs.ContainerCollectionResolver; import fr.adrienbrault.idea.symfony2plugin.util.dict.ServiceTag; import fr.adrienbrault.idea.symfony2plugin.util.dict.ServiceUtil; import org.jetbrains.annotations.NotNull; import java.util.Set; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class XmlServiceTagIntention extends PsiElementBaseIntentionAction { @Override public boolean isAvailable(@NotNull Project project, Editor editor, @NotNull PsiElement psiElement) { if(psiElement.getContainingFile().getFileType() != XmlFileType.INSTANCE || !Symfony2ProjectComponent.isEnabled(psiElement.getProject())) { return false; } return XmlServiceArgumentIntention.getServiceTagValid(psiElement) != null; } @Override public void invoke(@NotNull final Project project, final Editor editor, @NotNull PsiElement psiElement) throws IncorrectOperationException { final XmlTag xmlTag = XmlServiceArgumentIntention.getServiceTagValid(psiElement); if(xmlTag == null) { return; } final PhpClass phpClassFromXmlTag = ServiceActionUtil.getPhpClassFromXmlTag(xmlTag, new ContainerCollectionResolver.LazyServiceCollector(project)); if(phpClassFromXmlTag == null) { return; } Set<String> phpServiceTags = ServiceUtil.getPhpClassServiceTags(phpClassFromXmlTag); if(phpServiceTags.size() == 0) { HintManager.getInstance().showErrorHint(editor, "Ops, no possible Tag found"); return; } for (XmlTag tag : xmlTag.getSubTags()) { if(!"tag".equals(tag.getName())) { continue; } XmlAttribute name = tag.getAttribute("name"); if(name == null) { continue; } String value = name.getValue(); if(phpServiceTags.contains(value)) { phpServiceTags.remove(value); } } ServiceUtil.insertTagWithPopupDecision(editor, phpServiceTags, tag -> { ServiceTag serviceTag = new ServiceTag(phpClassFromXmlTag, tag); ServiceUtil.decorateServiceTag(serviceTag); xmlTag.addSubTag(XmlElementFactory.getInstance(project).createTagFromText(serviceTag.toXmlString()), false); }); } @NotNull @Override public String getFamilyName() { return "Symfony"; } @NotNull @Override public String getText() { return "Symfony: Add Tags"; } }