package fr.adrienbrault.idea.symfony2plugin.stubs.indexes; import com.intellij.psi.PsiFile; import com.intellij.util.indexing.*; import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; import com.jetbrains.twig.TwigFile; import com.jetbrains.twig.TwigFileType; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.templating.util.TwigUtil; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import java.util.Map; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class TwigIncludeStubIndex extends FileBasedIndexExtension<String, Void> { public static final ID<String, Void> KEY = ID.create("fr.adrienbrault.idea.symfony2plugin.twig_include_tags"); private final KeyDescriptor<String> myKeyDescriptor = new EnumeratorStringDescriptor(); @NotNull @Override public ID<String, Void> getName() { return KEY; } @NotNull @Override public DataIndexer<String, Void, FileContent> getIndexer() { return inputData -> { final Map<String, Void> map = new THashMap<>(); PsiFile psiFile = inputData.getPsiFile(); if(!Symfony2ProjectComponent.isEnabledForIndex(psiFile.getProject())) { return map; } if(!(psiFile instanceof TwigFile)) { return map; } TwigUtil.visitTemplateIncludes((TwigFile) psiFile, templateInclude -> map.put(templateInclude.getTemplateName(), null) ); return map; }; } @NotNull @Override public KeyDescriptor<String> getKeyDescriptor() { return this.myKeyDescriptor; } @NotNull @Override public DataExternalizer<Void> getValueExternalizer() { return ScalarIndexExtension.VOID_DATA_EXTERNALIZER; } @NotNull @Override public FileBasedIndex.InputFilter getInputFilter() { return file -> file.getFileType() == TwigFileType.INSTANCE; } @Override public boolean dependsOnFileContent() { return true; } @Override public int getVersion() { return 3; } }