diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java index 66759b08bdd2..764533085a4e 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionUtil.java @@ -40,6 +40,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.filters.TrueFilter; import com.intellij.util.ExceptionUtil; +import com.intellij.util.UnmodifiableIterator; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NonNls; @@ -271,14 +272,40 @@ public class CompletionUtil { return result; } - public static List getImmutableLookupStrings(@NotNull LookupElement element) { - try { - return ContainerUtil.newArrayList(element.getAllLookupStrings()); - } - catch (ConcurrentModificationException e) { - final Attachment dump = new Attachment("threadDump.txt", ThreadDumper.dumpThreadsToString()); - throw new LogEventException("Error while traversing lookup strings of " + element + " of " + element.getClass(), - ExceptionUtil.getThrowableText(e), dump); - } + public static Iterable iterateLookupStrings(@NotNull final LookupElement element) { + return new Iterable() { + @NotNull + @Override + public Iterator iterator() { + final Iterator original = element.getAllLookupStrings().iterator(); + return new UnmodifiableIterator(original) { + @Override + public boolean hasNext() { + try { + return super.hasNext(); + } + catch (ConcurrentModificationException e) { + throw handleCME(e); + } + } + + @Override + public String next() { + try { + return super.next(); + } + catch (ConcurrentModificationException e) { + throw handleCME(e); + } + } + + private LogEventException handleCME(ConcurrentModificationException e) { + final Attachment dump = new Attachment("threadDump.txt", ThreadDumper.dumpThreadsToString()); + return new LogEventException("Error while traversing lookup strings of " + element + " of " + element.getClass(), + ExceptionUtil.getThrowableText(e), dump); + } + }; + } + }; } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java index b7c3c517eaef..6ddd60c02fd6 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/impl/CamelHumpMatcher.java @@ -45,7 +45,7 @@ public class CamelHumpMatcher extends PrefixMatcher { @Override public boolean isStartMatch(LookupElement element) { - for (String s : CompletionUtil.getImmutableLookupStrings(element)) { + for (String s : CompletionUtil.iterateLookupStrings(element)) { FList ranges = myCaseInsensitiveMatcher.matchingFragments(s); if (ranges == null) continue; if (ranges.isEmpty() || skipUnderscores(s) >= ranges.get(0).getStartOffset()) { 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 66f6c7f0bfdc..d6ea8390b069 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 @@ -61,7 +61,7 @@ public class LiftShorterItemsClassifier extends Classifier { public void addElement(LookupElement added, ProcessingContext context) { myCount++; - for (String string : CompletionUtil.getImmutableLookupStrings(added)) { + for (String string : CompletionUtil.iterateLookupStrings(added)) { if (string.length() == 0) continue; myElements.putValue(string, added); @@ -97,7 +97,7 @@ public class LiftShorterItemsClassifier extends Classifier { private void calculateToLift(LookupElement element) { boolean hasChanges = false; - for (String string : CompletionUtil.getImmutableLookupStrings(element)) { + for (String string : CompletionUtil.iterateLookupStrings(element)) { for (int len = 1; len < string.length(); len++) { String prefix = string.substring(0, len); for (LookupElement shorterElement : myElements.get(prefix)) {