package fr.adrienbrault.idea.symfony2plugin.stubs.indexes; import com.intellij.ide.highlighter.XmlFileType; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlFile; import com.intellij.util.indexing.*; import com.intellij.util.io.DataExternalizer; import com.intellij.util.io.EnumeratorStringDescriptor; import com.intellij.util.io.KeyDescriptor; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.form.util.FormUtil; import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.externalizer.StringSetDataExternalizer; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.yaml.YAMLFileType; import org.jetbrains.yaml.psi.YAMLFile; import java.util.Map; import java.util.Set; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class ServicesTagStubIndex extends FileBasedIndexExtension<String, Set<String>> { public static final ID<String, Set<String>> KEY = ID.create("fr.adrienbrault.idea.symfony2plugin.service_tags"); private final KeyDescriptor<String> myKeyDescriptor = new EnumeratorStringDescriptor(); @NotNull @Override public DataIndexer<String, Set<String>, FileContent> getIndexer() { return inputData -> { Map<String, Set<String>> map = new THashMap<>(); PsiFile psiFile = inputData.getPsiFile(); if(!Symfony2ProjectComponent.isEnabledForIndex(psiFile.getProject())) { return map; } if (!ServicesDefinitionStubIndex.isValidForIndex(inputData, psiFile)) { return map; } if(psiFile instanceof YAMLFile) { map.putAll(FormUtil.getTags((YAMLFile) psiFile)); } if(psiFile instanceof XmlFile) { map.putAll(FormUtil.getTags((XmlFile) psiFile)); } return map; }; } @NotNull @Override public ID<String, Set<String>> getName() { return KEY; } @NotNull @Override public KeyDescriptor<String> getKeyDescriptor() { return this.myKeyDescriptor; } @NotNull public DataExternalizer<Set<String>> getValueExternalizer() { return new StringSetDataExternalizer(); } @NotNull @Override public FileBasedIndex.InputFilter getInputFilter() { return file -> file.getFileType() == XmlFileType.INSTANCE || file.getFileType() == YAMLFileType.YML; } @Override public boolean dependsOnFileContent() { return true; } @Override public int getVersion() { return 4; } }