package fr.adrienbrault.idea.symfony2plugin.templating.path; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.util.CachedValue; import com.intellij.psi.util.CachedValueProvider; import com.intellij.psi.util.CachedValuesManager; import com.intellij.psi.util.PsiModificationTracker; import fr.adrienbrault.idea.symfony2plugin.TwigHelper; import fr.adrienbrault.idea.symfony2plugin.extension.TwigNamespaceExtension; import fr.adrienbrault.idea.symfony2plugin.extension.TwigNamespaceExtensionParameter; import org.jetbrains.annotations.NotNull; import org.jetbrains.yaml.psi.YAMLFile; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; /** * Extract Twig path of config.yml * * twig: * paths: * "%kernel.root_dir%/../src/vendor/bundle/Resources/views": core * * @author Daniel Espendiller <daniel@espendiller.net> */ public class ConfigAddPathTwigNamespaces implements TwigNamespaceExtension { private static final Key<CachedValue<Collection<TwigPath>>> CACHE = new Key<>("TWIG_CONFIG_ADD_PATH_CACHE"); @NotNull @Override public Collection<TwigPath> getNamespaces(@NotNull TwigNamespaceExtensionParameter parameter) { CachedValue<Collection<TwigPath>> cache = parameter.getProject().getUserData(CACHE); if (cache == null) { cache = CachedValuesManager.getManager(parameter.getProject()).createCachedValue(() -> CachedValueProvider.Result.create(getTwigPaths(parameter), PsiModificationTracker.MODIFICATION_COUNT), false ); parameter.getProject().putUserData(CACHE, cache); } return cache.getValue(); } @NotNull private Collection<TwigPath> getTwigPaths(@NotNull TwigNamespaceExtensionParameter parameter) { VirtualFile configDir = VfsUtil.findRelativeFile(parameter.getProject().getBaseDir(), "app", "config"); if(configDir == null) { return Collections.emptyList(); } Collection<TwigPath> twigPaths = new ArrayList<>(); // app/config/config*yml for (VirtualFile file : configDir.getChildren()) { if(!file.getName().startsWith("config.yml")) { continue; } PsiFile psiFile = PsiManager.getInstance(parameter.getProject()).findFile(file); if(!(psiFile instanceof YAMLFile)) { continue; } for (Pair<String, String> stringStringPair : TwigHelper.getTwigPathFromYamlConfigResolved((YAMLFile) psiFile)) { // default path String first = stringStringPair.getFirst(); if(first == null || first.equals("")) { first = TwigPathIndex.MAIN; } twigPaths.add(new TwigPath(stringStringPair.getSecond(), first, TwigPathIndex.NamespaceType.ADD_PATH, true)); } } return twigPaths; } }