package fr.adrienbrault.idea.symfony2plugin.completion.yaml; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrar; import fr.adrienbrault.idea.symfony2plugin.codeInsight.GotoCompletionRegistrarParameter; import fr.adrienbrault.idea.symfony2plugin.completion.DecoratedServiceCompletionProvider; import fr.adrienbrault.idea.symfony2plugin.config.yaml.YamlElementPatternHelper; import fr.adrienbrault.idea.symfony2plugin.routing.RouteGotoCompletionProvider; import fr.adrienbrault.idea.symfony2plugin.templating.TemplateGotoCompletionRegistrar; import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.yaml.psi.YAMLMapping; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class YamlGotoCompletionRegistrar implements GotoCompletionRegistrar { @Override public void register(GotoCompletionRegistrarParameter registrar) { // defaults: // route: <caret> registrar.register( YamlElementPatternHelper.getSingleLineScalarKey("route"), RouteGotoCompletionProvider::new ); // defaults: // template: <caret> registrar.register( YamlElementPatternHelper.getSingleLineScalarKey("template"), TemplateGotoCompletionRegistrar::new ); // foo.service: // decorates: <caret> registrar.register( YamlElementPatternHelper.getSingleLineScalarKey("decorates"), MyDecoratedServiceCompletionProvider::new ); } private static class MyDecoratedServiceCompletionProvider extends DecoratedServiceCompletionProvider { MyDecoratedServiceCompletionProvider(PsiElement psiElement) { super(psiElement); } @Nullable @Override public String findClassForElement(@NotNull PsiElement psiElement) { YAMLMapping parentOfType = PsiTreeUtil.getParentOfType(psiElement, YAMLMapping.class); if(parentOfType == null) { return null; } return YamlHelper.getYamlKeyValueAsString(parentOfType, "class"); } @Nullable @Override public String findIdForElement(@NotNull PsiElement psiElement) { YAMLMapping parentOfType = PsiTreeUtil.getParentOfType(psiElement, YAMLMapping.class); if(parentOfType == null) { return null; } return YamlHelper.getYamlKeyValueAsString(parentOfType, "id"); } } }