mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
composite file include index
GitOrigin-RevId: 7ce1b2b00ac87486fc19bad8915f3c8d56fb6610
This commit is contained in:
committed by
intellij-monorepo-bot
parent
28dbae9bbd
commit
40466bc42f
@@ -12,10 +12,8 @@ import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.FactoryMap;
|
||||
import com.intellij.util.containers.MultiMap;
|
||||
import com.intellij.util.indexing.*;
|
||||
import com.intellij.util.io.DataExternalizer;
|
||||
import com.intellij.util.io.EnumeratorStringDescriptor;
|
||||
import com.intellij.util.io.IOUtil;
|
||||
import com.intellij.util.io.KeyDescriptor;
|
||||
import com.intellij.util.io.*;
|
||||
import gnu.trove.THashSet;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.DataInput;
|
||||
@@ -24,6 +22,8 @@ import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author Dmitry Avdeev
|
||||
@@ -59,19 +59,37 @@ public class FileIncludeIndex extends FileBasedIndexExtension<String, List<FileI
|
||||
@NotNull
|
||||
@Override
|
||||
public DataIndexer<String, List<FileIncludeInfoImpl>, FileContent> getIndexer() {
|
||||
return new DataIndexer<String, List<FileIncludeInfoImpl>, FileContent>() {
|
||||
@Override
|
||||
return new CompositeDataIndexer<String, List<FileIncludeInfoImpl>, Set<FileIncludeProvider>, Set<String>>() {
|
||||
@NotNull
|
||||
public Map<String, List<FileIncludeInfoImpl>> map(@NotNull FileContent inputData) {
|
||||
@Override
|
||||
public Set<FileIncludeProvider> calculateSubIndexer(@NotNull IndexedFile file) {
|
||||
return
|
||||
FileIncludeProvider
|
||||
.EP_NAME
|
||||
.getExtensionList()
|
||||
.stream()
|
||||
.filter(provider -> provider.acceptFile(file.getFile()))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Set<String> getSubIndexerVersion(@NotNull Set<FileIncludeProvider> providers) {
|
||||
return ContainerUtil.map2Set(providers, provider -> provider.getId() + ":" + provider.getVersion());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public KeyDescriptor<Set<String>> getSubIndexerVersionDescriptor() {
|
||||
return new StringSetDescriptor();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Map<String, List<FileIncludeInfoImpl>> map(@NotNull FileContent inputData, @NotNull Set<FileIncludeProvider> providers) {
|
||||
Map<String, List<FileIncludeInfoImpl>> map = FactoryMap.create(key -> new ArrayList<>());
|
||||
|
||||
for (FileIncludeProvider provider : FileIncludeProvider.EP_NAME.getExtensionList()) {
|
||||
if (!provider.acceptFile(inputData.getFile())) continue;
|
||||
FileIncludeInfo[] infos = provider.getIncludeInfos(inputData);
|
||||
if (infos.length == 0) continue;
|
||||
|
||||
for (FileIncludeInfo info : infos) {
|
||||
for (FileIncludeProvider provider : providers) {
|
||||
for (FileIncludeInfo info : provider.getIncludeInfos(inputData)) {
|
||||
FileIncludeInfoImpl impl = new FileIncludeInfoImpl(info.path, info.offset, info.runtimeOnly, provider.getId());
|
||||
map.get(info.fileName).add(impl);
|
||||
}
|
||||
@@ -148,11 +166,46 @@ public class FileIncludeIndex extends FileBasedIndexExtension<String, List<FileI
|
||||
@Override
|
||||
public int getVersion() {
|
||||
int version = BASE_VERSION;
|
||||
for (FileIncludeProvider provider : FileIncludeProvider.EP_NAME.getExtensionList()) {
|
||||
version = version * 31 + (provider.getVersion() ^ provider.getClass().getName().hashCode());
|
||||
|
||||
if (!InvertedIndex.ARE_COMPOSITE_INDEXERS_ENABLED) {
|
||||
for (FileIncludeProvider provider : FileIncludeProvider.EP_NAME.getExtensionList()) {
|
||||
version = version * 31 + (provider.getVersion() ^ provider.getClass().getName().hashCode());
|
||||
}
|
||||
}
|
||||
|
||||
return version;
|
||||
}
|
||||
|
||||
private static class StringSetDescriptor implements KeyDescriptor<Set<String>> {
|
||||
@Override
|
||||
public int getHashCode(Set<String> value) {
|
||||
return value.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEqual(Set<String> val1, Set<String> val2) {
|
||||
return val1.equals(val2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(@NotNull DataOutput out, Set<String> value) throws IOException {
|
||||
DataInputOutputUtil.writeINT(out, value.size());
|
||||
for (String s : value) {
|
||||
IOUtil.writeUTF(out, s);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> read(@NotNull DataInput in) throws IOException {
|
||||
int size = DataInputOutputUtil.readINT(in);
|
||||
THashSet<String> result = new THashSet<>(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
result.add(IOUtil.readUTF(in));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user