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 externalizer) throws IOException { + public void readFrom(@NotNull DataInputStream stream, + @NotNull DataExternalizer 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; } }