package fr.adrienbrault.idea.symfony2plugin.routing; import com.intellij.psi.*; import com.intellij.util.ProcessingContext; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.config.xml.XmlHelper; import fr.adrienbrault.idea.symfony2plugin.util.controller.ControllerIndex; import org.jetbrains.annotations.NotNull; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class RouteXmlReferenceContributor extends PsiReferenceContributor { @Override public void registerReferenceProviders(PsiReferenceRegistrar registrar) { registrar.registerReferenceProvider( XmlHelper.getRouteDefaultWithKeyAttributePattern("_controller"), new PsiReferenceProvider() { @NotNull @Override public PsiReference[] getReferencesByElement(@NotNull PsiElement psiElement, @NotNull ProcessingContext processingContext) { if(!Symfony2ProjectComponent.isEnabled(psiElement)) { return new PsiReference[0]; } return new PsiReference[] { new RouteActionReference(psiElement) }; } } ); } private static class RouteActionReference extends PsiPolyVariantReferenceBase<PsiElement> { public RouteActionReference(PsiElement psiElement) { super(psiElement); } @NotNull @Override public ResolveResult[] multiResolve(boolean b) { return PsiElementResolveResult.createResults( RouteHelper.getMethodsOnControllerShortcut(getElement().getProject(), getElement().getText()) ); } @NotNull @Override public Object[] getVariants() { return ControllerIndex.getControllerLookupElements(getElement().getProject()).toArray(); } } }