package fr.adrienbrault.idea.symfony2plugin.doctrine.metadata; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.patterns.PlatformPatterns; import com.intellij.patterns.XmlPatterns; import com.intellij.psi.PsiElement; import com.intellij.psi.xml.XmlAttributeValue; import com.jetbrains.php.lang.psi.elements.PhpClass; import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionProvider; import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrar; import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrarParameter; import fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class DoctrineXmlGotoCompletionRegistrar implements GotoCompletionRegistrar { @Override public void register(GotoCompletionRegistrarParameter registrar) { registrar.register(XmlPatterns.psiElement().withParent(PlatformPatterns.or( DoctrineMetadataPattern.getXmlModelClass(), DoctrineMetadataPattern.getXmlRepositoryClass(), DoctrineMetadataPattern.getXmlTargetDocumentClass(), DoctrineMetadataPattern.getXmlTargetEntityClass(), DoctrineMetadataPattern.getEmbeddableNameClassPattern() )), ClassGotoCompletionProvider::new); } private static class ClassGotoCompletionProvider extends GotoCompletionProvider { public ClassGotoCompletionProvider(PsiElement element) { super(element); } @NotNull @Override public Collection<LookupElement> getLookupElements() { return Collections.emptyList(); } @NotNull @Override public Collection<PsiElement> getPsiTargets(PsiElement element) { PsiElement parent = element.getParent(); if(!(parent instanceof XmlAttributeValue)) { return Collections.emptyList(); } String value = ((XmlAttributeValue) parent).getValue(); if(StringUtils.isBlank(value)) { return Collections.emptyList(); } Collection<PsiElement> classes = new ArrayList<>(); for (PhpClass phpClass : DoctrineMetadataUtil.getClassInsideScope(element, value)) { classes.add(phpClass); } return classes; } } }