From 0adfeda089907900a3ee76ba40a06733cd833a07 Mon Sep 17 00:00:00 2001 From: "Maxim.Mossienko" Date: Tue, 21 Oct 2014 16:43:25 +0200 Subject: [PATCH] EA-59103 - CME: THashIterator.nextIndex --- .../util/indexing/FileId2ValueMapping.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/platform/lang-impl/src/com/intellij/util/indexing/FileId2ValueMapping.java b/platform/lang-impl/src/com/intellij/util/indexing/FileId2ValueMapping.java index 8c2b0f782e19..ef34f1e7b3c0 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/FileId2ValueMapping.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/FileId2ValueMapping.java @@ -15,8 +15,12 @@ */ package com.intellij.util.indexing; +import com.intellij.util.SmartList; +import gnu.trove.TIntArrayList; import gnu.trove.TIntObjectHashMap; +import java.util.List; + /** * Created by Maxim.Mossienko on 7/4/2014. */ @@ -28,11 +32,29 @@ class FileId2ValueMapping { id2ValueMap = new TIntObjectHashMap(); valueContainer = _valueContainer; + TIntArrayList removedFileIdList = null; + List removedValueList = null; + for (final ValueContainer.ValueIterator valueIterator = _valueContainer.getValueIterator(); valueIterator.hasNext();) { final Value value = valueIterator.next(); for (final ValueContainer.IntIterator intIterator = valueIterator.getInputIdsIterator(); intIterator.hasNext();) { - associateFileIdToValue(intIterator.next(), value); + int id = intIterator.next(); + Value previousValue = id2ValueMap.put(id, value); + if (previousValue != null) { // delay removal of duplicated id -> value mapping since it will affect valueIterator we are using + if (removedFileIdList == null) { + removedFileIdList = new TIntArrayList(); + removedValueList = new SmartList(); + } + removedFileIdList.add(id); + removedValueList.add(previousValue); + } + } + } + + if (removedFileIdList != null) { + for(int i = 0, size = removedFileIdList.size(); i < size; ++i) { + valueContainer.removeValue(removedFileIdList.get(i), removedValueList.get(i)); } } }