From 10646035be9f227e8fd86bf807d77918a3e2d238 Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 15 Apr 2011 16:27:47 +0200 Subject: [PATCH] let the lookup pretend to know about elements' matchers, not elements themselves --- .../completion/JavaCharFilter.java | 4 +-- .../completion/CompletionTestCase.java | 2 +- .../completion/LightCompletionTestCase.java | 2 +- .../completion/CodeCompletionHandlerBase.java | 4 +-- .../CompletionProgressIndicator.java | 2 +- .../intellij/codeInsight/lookup/Lookup.java | 6 +++- .../lookup/impl/LookupCellRenderer.java | 2 +- .../codeInsight/lookup/impl/LookupImpl.java | 30 +++++++++++-------- .../codeInsight/lookup/impl/LookupModel.java | 4 +-- .../codeInsight/lookup/impl/TypedHandler.java | 8 ++--- 10 files changed, 36 insertions(+), 28 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java index c978caec7131..555ca026a05e 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCharFilter.java @@ -74,9 +74,7 @@ public class JavaCharFilter extends CharFilter { if (c == ',' && o instanceof PsiVariable) { int lookupStart = ((LookupImpl)lookup).getLookupStart(); String name = ((PsiVariable)o).getName(); - if (lookupStart >= 0 && - name != null && - name.equals(item.getPrefixMatcher().getPrefix() + ((LookupImpl)lookup).getAdditionalPrefix())) { + if (lookupStart >= 0 && name != null && name.equals(lookup.itemPattern(item))) { return Result.HIDE_LOOKUP; } } diff --git a/java/testFramework/src/com/intellij/codeInsight/completion/CompletionTestCase.java b/java/testFramework/src/com/intellij/codeInsight/completion/CompletionTestCase.java index d91987d1302b..e92cbe8a52ec 100644 --- a/java/testFramework/src/com/intellij/codeInsight/completion/CompletionTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/completion/CompletionTestCase.java @@ -56,7 +56,7 @@ public abstract class CompletionTestCase extends DaemonAnalyzerTestCase { LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(myEditor); myItems = lookup == null ? null : lookup.getItems().toArray(new LookupElement[lookup.getItems().size()]); - myPrefix = lookup == null ? "" : lookup.getItems().get(0).getPrefixMatcher().getPrefix(); + myPrefix = lookup == null ? "" : lookup.itemPattern(lookup.getItems().get(0)); } public void setType(CompletionType type) { diff --git a/java/testFramework/src/com/intellij/codeInsight/completion/LightCompletionTestCase.java b/java/testFramework/src/com/intellij/codeInsight/completion/LightCompletionTestCase.java index 7742283df347..9ddb469b3b97 100644 --- a/java/testFramework/src/com/intellij/codeInsight/completion/LightCompletionTestCase.java +++ b/java/testFramework/src/com/intellij/codeInsight/completion/LightCompletionTestCase.java @@ -50,7 +50,7 @@ public abstract class LightCompletionTestCase extends LightCodeInsightTestCase { LookupImpl lookup = (LookupImpl)LookupManager.getActiveLookup(myEditor); myItems = lookup == null ? null : lookup.getItems().toArray(LookupElement.EMPTY_ARRAY); - myPrefix = lookup == null ? null : lookup.getItems().get(0).getPrefixMatcher().getPrefix(); + myPrefix = lookup == null ? null : lookup.itemPattern(lookup.getItems().get(0)); } public void setType(CompletionType type) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index d2f0aaf07ce8..b8729966fa79 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -429,7 +429,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { indicator.closeAndFinish(true); final Runnable restorePrefix = rememberDocumentState(indicator.getEditor()); indicator.getOffsetMap() - .addOffset(CompletionInitializationContext.START_OFFSET, (offset1 - item.getPrefixMatcher().getPrefix().length())); + .addOffset(CompletionInitializationContext.START_OFFSET, (offset1 - indicator.getLookup().itemPattern(item).length())); handleSingleItem(offset2, indicator, items, item.getLookupString(), item); // the insert handler may have started a live template with completion @@ -453,7 +453,7 @@ public class CodeCompletionHandlerBase implements CodeInsightActionHandler { uniqueText = item.getLookupString(); // text may be not ready yet } - if (!StringUtil.startsWithIgnoreCase(uniqueText, item.getPrefixMatcher().getPrefix())) { + if (!StringUtil.startsWithIgnoreCase(uniqueText, context.getLookup().itemPattern(item))) { FeatureUsageTracker.getInstance().triggerFeatureUsed(CodeCompletionFeatures.EDITING_COMPLETION_CAMEL_HUMPS); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java index 4b058324d323..3ae792461a45 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/completion/CompletionProgressIndicator.java @@ -474,7 +474,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement final List items = myLookup.getItems(); for (LookupElement item : items) { - if (!(item.getPrefixMatcher().getPrefix() + myLookup.getAdditionalPrefix()).equals(item.getLookupString())) { + if (!myLookup.itemPattern(item).equals(item.getLookupString())) { return false; } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/Lookup.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/Lookup.java index d55504c31ab2..b4502f0bf649 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/Lookup.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/Lookup.java @@ -16,6 +16,7 @@ package com.intellij.codeInsight.lookup; +import com.intellij.codeInsight.completion.PrefixMatcher; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.util.UserDataHolder; @@ -24,7 +25,6 @@ import com.intellij.psi.PsiFile; import org.jetbrains.annotations.Nullable; import java.awt.*; -import java.util.*; import java.util.List; public interface Lookup extends UserDataHolder{ @@ -67,4 +67,8 @@ public interface Lookup extends UserDataHolder{ void showItemPopup(JBPopup hint); boolean showElementActions(); + + String itemPattern(LookupElement element); + + PrefixMatcher itemMatcher(LookupElement item); } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java index e8dcbf017672..d405d7842943 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java @@ -246,7 +246,7 @@ public class LookupCellRenderer implements ListCellRenderer { final SimpleColoredComponent nameComponent) { final SimpleTextAttributes base = new SimpleTextAttributes(style, foreground); - final String prefix = myLookup.itemPrefix(item); + final String prefix = myLookup.itemPattern(item); if (prefix.length() > 0) { Iterable ranges = new NameUtil.MinusculeMatcher("*" + prefix, NameUtil.MatchingCaseSensitivity.NONE).matchingFragments(name); if (ranges != null) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java index d96a658c88fc..70db7aa6776a 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupImpl.java @@ -449,7 +449,7 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { int minPrefixLength = items.isEmpty() ? 0 : Integer.MAX_VALUE; for (final LookupElement item : items) { - minPrefixLength = Math.min(item.getPrefixMatcher().getPrefix().length(), minPrefixLength); + minPrefixLength = Math.min(itemMatcher(item).getPrefix().length(), minPrefixLength); } updateLookupStart(minPrefixLength); @@ -560,8 +560,9 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { return ContainerUtil.flatten(classifier.classify(better)); } - String itemPrefix(LookupElement element) { - return element.getPrefixMatcher().getPrefix() + myAdditionalPrefix; + @Override + public String itemPattern(LookupElement element) { + return itemMatcher(element).getPrefix() + myAdditionalPrefix; } private LookupArranger getActualArranger() { @@ -572,7 +573,7 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { } private boolean isExactPrefixItem(LookupElement item) { - return item.getAllLookupStrings().contains(itemPrefix(item)); + return item.getAllLookupStrings().contains(itemPattern(item)); } private boolean prefixMatches(final LookupElement item) { @@ -580,7 +581,12 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { if (myAdditionalPrefix.length() == 0) return item.isPrefixMatched(); - return item.getPrefixMatcher().cloneWithPrefix(itemPrefix(item)).prefixMatches(item); + return itemMatcher(item).cloneWithPrefix(itemPattern(item)).prefixMatches(item); + } + + @Override + public PrefixMatcher itemMatcher(LookupElement item) { + return item.getPrefixMatcher(); } /** @@ -658,11 +664,11 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { public void run() { EditorModificationUtil.deleteSelectedText(myEditor); final int caretOffset = myEditor.getCaretModel().getOffset(); - final String prefix = item.getPrefixMatcher().getPrefix(); - int lookupStart = caretOffset - prefix.length() - myAdditionalPrefix.length(); + final String prefix = itemPattern(item); + int lookupStart = caretOffset - prefix.length(); final String lookupString = item.getLookupString(); - if (!StringUtil.startsWithConcatenationOf(lookupString, prefix, myAdditionalPrefix)) { + if (!lookupString.startsWith(prefix)) { //todo another lookup string may match the prefix FeatureUsageTracker.getInstance().triggerFeatureUsed("editing.completion.camelHumps"); } @@ -963,7 +969,7 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { final LookupElement firstItem = (LookupElement)listModel.getElementAt(0); if (listModel.getSize() == 1 && firstItem instanceof EmptyLookupItem) return false; - final PrefixMatcher firstItemMatcher = firstItem.getPrefixMatcher(); + final PrefixMatcher firstItemMatcher = itemMatcher(firstItem); final String oldPrefix = firstItemMatcher.getPrefix(); final String presentPrefix = oldPrefix + myAdditionalPrefix; final PrefixMatcher matcher = firstItemMatcher.cloneWithPrefix(presentPrefix); @@ -977,10 +983,10 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { for (int i = 1; i < listModel.getSize(); i++) { LookupElement item = (LookupElement)listModel.getElementAt(i); - if (!oldPrefix.equals(item.getPrefixMatcher().getPrefix())) return false; + if (!oldPrefix.equals(itemMatcher(item).getPrefix())) return false; lookupString = item.getLookupString(); - div = divideString(lookupString, item.getPrefixMatcher().cloneWithPrefix(presentPrefix)); + div = divideString(lookupString, itemMatcher(item).cloneWithPrefix(presentPrefix)); if (div < 0) return false; String _afterCaret = lookupString.substring(div); @@ -1031,7 +1037,7 @@ public class LookupImpl extends LightweightHint implements Lookup, Disposable { myEditor.getDocument().insertString(offset, afterCaret); final String newPrefix = presentPrefix + afterCaret; - myModel.retainMatchingItems(newPrefix); + myModel.retainMatchingItems(newPrefix, this); myAdditionalPrefix = ""; offset += afterCaret.length(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupModel.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupModel.java index 0dcc8ce52afd..403ee8be98dc 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupModel.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupModel.java @@ -111,12 +111,12 @@ public class LookupModel { } } - void retainMatchingItems(final String newPrefix) { + void retainMatchingItems(final String newPrefix, final LookupImpl lookup) { synchronized (lock) { final List newItems = ContainerUtil.findAll(myItems, new Condition() { @Override public boolean value(LookupElement item) { - return item.isValid() && item.setPrefixMatcher(item.getPrefixMatcher().cloneWithPrefix(newPrefix)); + return item.isValid() && item.setPrefixMatcher(lookup.itemMatcher(item).cloneWithPrefix(newPrefix)); } }); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java index e35a477054a6..b9666f8c99e4 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/TypedHandler.java @@ -110,13 +110,13 @@ public class TypedHandler implements TypedActionHandler { if (currentItem != null && charTyped != ' ') { if (charTyped != '*' || filtersDecision != CharFilter.Result.SELECT_ITEM_AND_FINISH_LOOKUP) { String postfix = lookup.getAdditionalPrefix() + charTyped; - final PrefixMatcher matcher = currentItem.getPrefixMatcher(); + final PrefixMatcher matcher = lookup.itemMatcher(currentItem); if (matcher.cloneWithPrefix(matcher.getPrefix() + postfix).prefixMatches(currentItem)) { return CharFilter.Result.ADD_TO_PREFIX; } for (final LookupElement element : lookup.getItems()) { - if (element.isPrefixMatched() && - element.getPrefixMatcher().cloneWithPrefix(element.getPrefixMatcher().getPrefix() + postfix).prefixMatches(element)) { + PrefixMatcher elementMatcher = lookup.itemMatcher(element); + if (elementMatcher.cloneWithPrefix(elementMatcher.getPrefix() + postfix).prefixMatches(element)) { return CharFilter.Result.ADD_TO_PREFIX; } } @@ -132,7 +132,7 @@ public class TypedHandler implements TypedActionHandler { @Nullable private static CharFilter.Result getFiltersDecision(char charTyped, LookupImpl lookup) { LookupElement item = lookup.getCurrentItem(); - int prefixLength = (item == null ? 0 : item.getPrefixMatcher().getPrefix().length()) + lookup.getAdditionalPrefix().length(); + int prefixLength = item == null ? lookup.getAdditionalPrefix().length(): lookup.itemPattern(item).length(); for (final CharFilter extension : getFilters()) { final CharFilter.Result result = extension.acceptChar(charTyped, prefixLength, lookup);