diff --git a/platform/lang-impl/src/com/intellij/psi/impl/include/FileIncludeIndex.java b/platform/lang-impl/src/com/intellij/psi/impl/include/FileIncludeIndex.java index cb934a975d30..24e1496ef83d 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/include/FileIncludeIndex.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/include/FileIncludeIndex.java @@ -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, FileContent> getIndexer() { - return new DataIndexer, FileContent>() { - @Override + return new CompositeDataIndexer, Set, Set>() { @NotNull - public Map> map(@NotNull FileContent inputData) { + @Override + public Set calculateSubIndexer(@NotNull IndexedFile file) { + return + FileIncludeProvider + .EP_NAME + .getExtensionList() + .stream() + .filter(provider -> provider.acceptFile(file.getFile())) + .collect(Collectors.toSet()); + } + @NotNull + @Override + public Set getSubIndexerVersion(@NotNull Set providers) { + return ContainerUtil.map2Set(providers, provider -> provider.getId() + ":" + provider.getVersion()); + } + + @NotNull + @Override + public KeyDescriptor> getSubIndexerVersionDescriptor() { + return new StringSetDescriptor(); + } + + @NotNull + @Override + public Map> map(@NotNull FileContent inputData, @NotNull Set providers) { Map> 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> { + @Override + public int getHashCode(Set value) { + return value.hashCode(); + } + + @Override + public boolean isEqual(Set val1, Set val2) { + return val1.equals(val2); + } + + @Override + public void save(@NotNull DataOutput out, Set value) throws IOException { + DataInputOutputUtil.writeINT(out, value.size()); + for (String s : value) { + IOUtil.writeUTF(out, s); + } + } + + @Override + public Set read(@NotNull DataInput in) throws IOException { + int size = DataInputOutputUtil.readINT(in); + THashSet result = new THashSet<>(size); + for (int i = 0; i < size; i++) { + result.add(IOUtil.readUTF(in)); + } + return result; + } + } + }