package com.cedricziel.idea.typo3.index;
import com.cedricziel.idea.typo3.domain.TYPO3ServiceDefinition;
import com.cedricziel.idea.typo3.index.externalizer.StringSetDataExternalizer;
import com.cedricziel.idea.typo3.psi.visitor.CoreServiceDefinitionParserVisitor;
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.php.lang.PhpFileType;
import com.jetbrains.php.lang.psi.PhpFile;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import java.util.*;
public class CoreServiceMapStubIndex extends FileBasedIndexExtension<String, Set<String>> {
public static final ID<String, Set<String>> KEY = ID.create("com.cedricziel.idea.typo3.index.core_service_map");
public static final String EXT_LOCALCONF_PHP_FILENAME = "ext_localconf.php";
private final KeyDescriptor<String> myKeyDescriptor = new EnumeratorStringDescriptor();
@NotNull
@Override
public DataIndexer<String, Set<String>, FileContent> getIndexer() {
return inputData -> {
final Map<String, Set<String>> map = new THashMap<>();
PsiFile psiFile = inputData.getPsiFile();
if (psiFile instanceof PhpFile) {
Map<String, ArrayList<TYPO3ServiceDefinition>> serviceMap = new THashMap<>();
psiFile.accept(new CoreServiceDefinitionParserVisitor(serviceMap));
serviceMap.forEach((serviceId, definitionList) -> {
Set<String> implementations = new HashSet<>();
definitionList.forEach(typo3ServiceDefinition -> implementations.add(typo3ServiceDefinition.getClassName()));
map.put(serviceId, implementations);
});
}
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() == PhpFileType.INSTANCE && file.getName().equals(EXT_LOCALCONF_PHP_FILENAME);
}
@Override
public boolean dependsOnFileContent() {
return true;
}
@Override
public int getVersion() {
return 1;
}
}