From 1191e9bee8bcd734b586b4b2136d7807bcbcb8c0 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 25 Jun 2015 16:50:48 +0200 Subject: [PATCH] don't evalute all usage target descriptions when adding to history (EA-64966 - INRE: FileBasedIndexImpl.handleDumbMode) --- .../find/findUsages/UsageHistory.java | 52 +++++++++++-------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/find/findUsages/UsageHistory.java b/platform/lang-impl/src/com/intellij/find/findUsages/UsageHistory.java index 7bd5147de340..802cc2be0353 100644 --- a/platform/lang-impl/src/com/intellij/find/findUsages/UsageHistory.java +++ b/platform/lang-impl/src/com/intellij/find/findUsages/UsageHistory.java @@ -15,44 +15,52 @@ */ package com.intellij.find.findUsages; -import com.intellij.openapi.util.Condition; import com.intellij.usages.ConfigurableUsageTarget; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.hash.EqualityPolicy; +import com.intellij.util.containers.hash.LinkedHashMap; import org.jetbrains.annotations.NotNull; -import java.util.Collections; -import java.util.List; +import java.util.*; public class UsageHistory { // the last element is the most recent - private final List myHistory = ContainerUtil.createLockFreeCopyOnWriteList(); + @SuppressWarnings("unchecked") + private final Map myHistory = new LinkedHashMap((EqualityPolicy)EqualityPolicy.IDENTITY) { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + // todo configure history depth limit + return size() > 15; + } + }; public void add(@NotNull ConfigurableUsageTarget usageTarget) { final String descriptiveName = usageTarget.getLongDescriptiveName(); - ContainerUtil.retainAll(myHistory, new Condition() { - @Override - public boolean value(ConfigurableUsageTarget existing) { - return !existing.getLongDescriptiveName().equals(descriptiveName); + synchronized (myHistory) { + final Set> entries = myHistory.entrySet(); + for (Iterator> iterator = entries.iterator(); iterator.hasNext(); ) { + if (iterator.next().getValue().equals(descriptiveName)) { + iterator.remove(); + } } - }); - myHistory.add(usageTarget); - - // todo configure history depth limit - if (myHistory.size() > 15) { - myHistory.remove(0); + myHistory.put(usageTarget, descriptiveName); } } @NotNull public List getAll() { - removeInvalidElementsFromHistory(); - return Collections.unmodifiableList(myHistory); - } - - private void removeInvalidElementsFromHistory() { - for (ConfigurableUsageTarget target : myHistory) { - if (!target.isValid()) myHistory.remove(target); + synchronized (myHistory) { + List result = ContainerUtil.newArrayList(); + final Set entries = myHistory.keySet(); + for (Iterator iterator = entries.iterator(); iterator.hasNext(); ) { + final ConfigurableUsageTarget target = iterator.next(); + if (!target.isValid()) { + iterator.remove(); + } else { + result.add(target); + } + } + return result; } } - }