From e6d309b0a020f4b62c863ae69d2d2ee5c5d112e2 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 9 Aug 2012 23:08:41 +0200 Subject: [PATCH] a yet faster LiftShorterItemsClassifier --- .../impl/LiftShorterItemsClassifier.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/LiftShorterItemsClassifier.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/LiftShorterItemsClassifier.java index 8462a508e663..138a9c8ac16d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/LiftShorterItemsClassifier.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/LiftShorterItemsClassifier.java @@ -58,44 +58,44 @@ public class LiftShorterItemsClassifier extends Classifier { } @Override - public void addElement(LookupElement element) { + public void addElement(LookupElement added) { myCount++; - final Set toUpdate = new THashSet(TObjectHashingStrategy.IDENTITY); - toUpdate.add(element); - - final Set strings = getAllLookupStrings(element); + final Set strings = getAllLookupStrings(added); for (String string : strings) { if (string.length() == 0) continue; - myElements.putValue(string, element); + myElements.putValue(string, added); mySortedStrings.add(string); final NavigableSet after = mySortedStrings.tailSet(string, false); for (String s : after) { if (!s.startsWith(string)) { break; } - toUpdate.addAll(myElements.get(s)); + for (LookupElement longer : myElements.get(s)) { + addShorterItem(added, longer); + } } } - myNext.addElement(element); + myNext.addElement(added); - for (LookupElement lookupElement : toUpdate) { - recalculateToLift(lookupElement); - } + calculateToLift(added); } - private void recalculateToLift(LookupElement element) { - final THashSet forPreselection = loadItems(element, myToLiftForPreselection); - final THashSet forSorting = loadItems(element, myToLiftForSorting); + private void addShorterItem(LookupElement shorter, LookupElement longer) { + Map map = myCondition.shouldLift(shorter, longer) ? myToLiftForPreselection : myToLiftForSorting; + THashSet toLift = loadItems(longer, map); + toLift.add(shorter); + saveItems(longer, toLift, map); + } + + private void calculateToLift(LookupElement element) { + final THashSet forPreselection = new THashSet(TObjectHashingStrategy.IDENTITY); + final THashSet forSorting = new THashSet(TObjectHashingStrategy.IDENTITY); for (String string : getAllLookupStrings(element)) { for (int len = 1; len < string.length(); len++) { String prefix = string.substring(0, len); for (LookupElement shorterElement : myElements.get(prefix)) { - if (forSorting.contains(shorterElement) || forPreselection.contains(shorterElement)) { - continue; - } - if (myCondition.shouldLift(shorterElement, element)) { forPreselection.add(shorterElement); } else { @@ -110,8 +110,8 @@ public class LiftShorterItemsClassifier extends Classifier { } private static THashSet loadItems(LookupElement key, final Map map) { - final THashSet forPreselection = new THashSet(TObjectHashingStrategy.IDENTITY); LookupElement[] items = map.get(key); + final THashSet forPreselection = new THashSet(items == null ? 2 : items.length * 2, TObjectHashingStrategy.IDENTITY); if (items != null) { Collections.addAll(forPreselection, items); } @@ -119,7 +119,6 @@ public class LiftShorterItemsClassifier extends Classifier { } private void saveItems(LookupElement key, THashSet items, final Map map) { - map.remove(key); if (!items.isEmpty()) { map.put(key, internItems(items)); }