diff --git a/jps/jps-builders/src/org/jetbrains/jps/backwardRefs/index/CompilerReferenceIndex.java b/jps/jps-builders/src/org/jetbrains/jps/backwardRefs/index/CompilerReferenceIndex.java
index 61ca320b0898..8ce1276c008f 100644
--- a/jps/jps-builders/src/org/jetbrains/jps/backwardRefs/index/CompilerReferenceIndex.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/backwardRefs/index/CompilerReferenceIndex.java
@@ -273,7 +273,8 @@ public class CompilerReferenceIndex {
16 * 1024,
false,
true,
- readOnly) {
+ readOnly,
+ null) {
@Override
public void checkCanceled() {
//TODO
diff --git a/platform/lang-impl/src/com/intellij/util/indexing/VfsAwareMapIndexStorage.java b/platform/lang-impl/src/com/intellij/util/indexing/VfsAwareMapIndexStorage.java
index d410a6060cc3..f55c173e52f2 100644
--- a/platform/lang-impl/src/com/intellij/util/indexing/VfsAwareMapIndexStorage.java
+++ b/platform/lang-impl/src/com/intellij/util/indexing/VfsAwareMapIndexStorage.java
@@ -58,7 +58,7 @@ public final class VfsAwareMapIndexStorage extends MapIndexStorage extends MapIndexStorage implements IndexStorage myDataExternalizer;
private final boolean myKeyIsUniqueForIndexedFile;
private final boolean myReadOnly;
+ @Nullable private final IntIntFunction myInputRemapping;
protected MapIndexStorage(@NotNull File storageFile,
@NotNull KeyDescriptor keyDescriptor,
@NotNull DataExternalizer valueExternalizer,
final int cacheSize,
boolean keyIsUniqueForIndexedFile) throws IOException {
- this(storageFile, keyDescriptor, valueExternalizer, cacheSize, keyIsUniqueForIndexedFile, true, false);
+ this(storageFile, keyDescriptor, valueExternalizer, cacheSize, keyIsUniqueForIndexedFile, true, false, null);
}
protected MapIndexStorage(@NotNull File storageFile,
@@ -59,13 +61,20 @@ public abstract class MapIndexStorage implements IndexStorage implements IndexStorage(getStorageFile(), myKeyDescriptor, myDataExternalizer, myKeyIsUniqueForIndexedFile) {
+ map = new ValueContainerMap(getStorageFile(), myKeyDescriptor, myDataExternalizer, myKeyIsUniqueForIndexedFile, myInputRemapping) {
@Override
protected boolean isReadOnly() {
return myReadOnly;
diff --git a/platform/util/src/com/intellij/util/indexing/impl/ValueContainerImpl.java b/platform/util/src/com/intellij/util/indexing/impl/ValueContainerImpl.java
index 649d28d08696..0bd6d77b400c 100644
--- a/platform/util/src/com/intellij/util/indexing/impl/ValueContainerImpl.java
+++ b/platform/util/src/com/intellij/util/indexing/impl/ValueContainerImpl.java
@@ -17,6 +17,7 @@
package com.intellij.util.indexing.impl;
import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.util.IntIntFunction;
import com.intellij.util.SmartList;
import com.intellij.util.containers.EmptyIterator;
import com.intellij.util.indexing.ValueContainer;
@@ -454,14 +455,16 @@ class ValueContainerImpl extends UpdatableValueContainer implement
static final int NUMBER_OF_VALUES_THRESHOLD = 20;
- public void readFrom(DataInputStream stream, DataExternalizer extends Value> externalizer) throws IOException {
+ public void readFrom(@NotNull DataInputStream stream,
+ @NotNull DataExternalizer extends Value> externalizer,
+ @NotNull IntIntFunction inputRemapping) throws IOException {
FileId2ValueMapping mapping = null;
while (stream.available() > 0) {
final int valueCount = DataInputOutputUtil.readINT(stream);
if (valueCount < 0) {
// ChangeTrackingValueContainer marked inputId as invalidated, see ChangeTrackingValueContainer.saveTo
- final int inputId = -valueCount;
+ final int inputId = inputRemapping.fun(-valueCount);
if (mapping == null && size() > NUMBER_OF_VALUES_THRESHOLD) { // avoid O(NumberOfValues)
mapping = new FileId2ValueMapping<>(this);
@@ -484,7 +487,7 @@ class ValueContainerImpl extends UpdatableValueContainer implement
if (idCountOrSingleValue > 0) {
addValue(idCountOrSingleValue, value);
- if (mapping != null) mapping.associateFileIdToValue(idCountOrSingleValue, value);
+ if (mapping != null) mapping.associateFileIdToValue(inputRemapping.fun(idCountOrSingleValue), value);
} else {
idCountOrSingleValue = -idCountOrSingleValue;
ChangeBufferingList changeBufferingList = ensureFileSetCapacityForValue(value, idCountOrSingleValue);
@@ -492,9 +495,10 @@ class ValueContainerImpl extends UpdatableValueContainer implement
for (int i = 0; i < idCountOrSingleValue; i++) {
final int id = DataInputOutputUtil.readINT(stream);
- if (changeBufferingList != null) changeBufferingList.add(prev + id);
- else addValue(prev + id, value);
- if (mapping != null) mapping.associateFileIdToValue(prev + id, value);
+ int remappedInputId = inputRemapping.fun(prev + id);
+ if (changeBufferingList != null) changeBufferingList.add(remappedInputId);
+ else addValue(remappedInputId, value);
+ if (mapping != null) mapping.associateFileIdToValue(remappedInputId, value);
prev += id;
}
}
diff --git a/platform/util/src/com/intellij/util/indexing/impl/ValueContainerMap.java b/platform/util/src/com/intellij/util/indexing/impl/ValueContainerMap.java
index 1a8658f68ea1..66908255ee8c 100644
--- a/platform/util/src/com/intellij/util/indexing/impl/ValueContainerMap.java
+++ b/platform/util/src/com/intellij/util/indexing/impl/ValueContainerMap.java
@@ -15,6 +15,7 @@
*/
package com.intellij.util.indexing.impl;
+import com.intellij.util.IntIntFunction;
import com.intellij.util.io.DataExternalizer;
import com.intellij.util.io.KeyDescriptor;
import com.intellij.util.io.PersistentHashMap;
@@ -32,8 +33,9 @@ class ValueContainerMap extends PersistentHashMap keyKeyDescriptor,
@NotNull DataExternalizer valueExternalizer,
- boolean keyIsUniqueForIndexedFile) throws IOException {
- super(file, keyKeyDescriptor, new ValueContainerExternalizer<>(valueExternalizer));
+ boolean keyIsUniqueForIndexedFile,
+ @NotNull IntIntFunction inputRemapping) throws IOException {
+ super(file, keyKeyDescriptor, new ValueContainerExternalizer<>(valueExternalizer, inputRemapping));
myValueExternalizer = valueExternalizer;
myKeyIsUniqueForIndexedFile = keyIsUniqueForIndexedFile;
}
@@ -68,9 +70,11 @@ class ValueContainerMap extends PersistentHashMap implements DataExternalizer> {
@NotNull private final DataExternalizer myValueExternalizer;
+ @NotNull private final IntIntFunction myInputRemapping;
- private ValueContainerExternalizer(@NotNull DataExternalizer valueExternalizer) {
+ private ValueContainerExternalizer(@NotNull DataExternalizer valueExternalizer, @NotNull IntIntFunction inputRemapping) {
myValueExternalizer = valueExternalizer;
+ myInputRemapping = inputRemapping;
}
@Override
@@ -83,7 +87,7 @@ class ValueContainerMap extends PersistentHashMap read(@NotNull final DataInput in) throws IOException {
final ValueContainerImpl valueContainer = new ValueContainerImpl<>();
- valueContainer.readFrom((DataInputStream)in, myValueExternalizer);
+ valueContainer.readFrom((DataInputStream)in, myValueExternalizer, myInputRemapping);
return valueContainer;
}
}