package fr.adrienbrault.idea.symfony2plugin.stubs.indexes; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; 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 com.jetbrains.twig.elements.TwigExtendsTag; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.TwigHelper; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import java.util.Map; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class TwigExtendsStubIndex extends FileBasedIndexExtension<String, Void> { public static final ID<String, Void> KEY = ID.create("fr.adrienbrault.idea.symfony2plugin.twig_extends_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 -> { Map<String, Void> map = new THashMap<>(); PsiFile psiFile = inputData.getPsiFile(); if(!Symfony2ProjectComponent.isEnabledForIndex(psiFile.getProject())) { return map; } if(!(psiFile instanceof TwigFile)) { return map; } PsiElement[] twigExtendsTags = PsiTreeUtil.collectElements(psiFile, psiElement -> psiElement instanceof TwigExtendsTag ); if(twigExtendsTags.length == 0) { return map; } for(PsiElement twigExtendsTag: twigExtendsTags) { for (String s : TwigHelper.getTwigExtendsTagTemplates((TwigExtendsTag) twigExtendsTag)) { map.put(s, 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; } }