package com.jetbrains.lang.dart.ide.index;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.indexing.*;
import com.intellij.util.io.*;
import org.jetbrains.annotations.NotNull;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class DartPartUriIndex extends FileBasedIndexExtension<String, List<String>> {
public static final ID<String, List<String>> DART_PATH_INDEX = ID.create("DartPathIndex");
private DataIndexer<String, List<String>, FileContent> myDataIndexer = new MyDataIndexer();
@NotNull
@Override
public ID<String, List<String>> getName() {
return DART_PATH_INDEX;
}
@Override
public int getVersion() {
return DartIndexUtil.INDEX_VERSION;
}
@NotNull
@Override
public DataIndexer<String, List<String>, FileContent> getIndexer() {
return myDataIndexer;
}
@NotNull
@Override
public KeyDescriptor<String> getKeyDescriptor() {
return EnumeratorStringDescriptor.INSTANCE;
}
@NotNull
@Override
public DataExternalizer<List<String>> getValueExternalizer() {
return new DataExternalizer<List<String>>() {
@Override
public void save(@NotNull DataOutput out, List<String> value) throws IOException {
DataInputOutputUtil.writeINT(out, value.size());
for (String path : value) {
IOUtil.writeUTF(out, path);
}
}
@Override
public List<String> read(@NotNull DataInput in) throws IOException {
final int size = DataInputOutputUtil.readINT(in);
final List<String> result = new ArrayList<>(size);
for (int i = 0; i < size; ++i) {
result.add(IOUtil.readUTF(in));
}
return result;
}
};
}
@NotNull
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return DartInputFilter.INSTANCE;
}
@Override
public boolean dependsOnFileContent() {
return true;
}
public static List<String> getPartUris(@NotNull final Project project, @NotNull final VirtualFile virtualFile) {
final List<String> result = new ArrayList<>();
for (List<String> list : FileBasedIndex.getInstance().getValues(DART_PATH_INDEX, virtualFile.getName(),
GlobalSearchScope.fileScope(project, virtualFile))) {
result.addAll(list);
}
return result;
}
private static class MyDataIndexer implements DataIndexer<String, List<String>, FileContent> {
@Override
@NotNull
public Map<String, List<String>> map(@NotNull final FileContent inputData) {
return Collections.singletonMap(inputData.getFileName(), DartIndexUtil.indexFile(inputData).getPartUris());
}
}
}