let the lookup pretend to know about elements' matchers, not elements themselves

This commit is contained in:
peter
2011-04-18 14:52:41 +02:00
parent 2be0d770cb
commit 10646035be
10 changed files with 36 additions and 28 deletions
@@ -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;
}
}
@@ -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) {
@@ -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) {
@@ -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);
}
@@ -474,7 +474,7 @@ public class CompletionProgressIndicator extends ProgressIndicatorBase implement
final List<LookupElement> 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;
}
@@ -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);
}
@@ -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<TextRange> ranges = new NameUtil.MinusculeMatcher("*" + prefix, NameUtil.MatchingCaseSensitivity.NONE).matchingFragments(name);
if (ranges != null) {
@@ -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();
@@ -111,12 +111,12 @@ public class LookupModel {
}
}
void retainMatchingItems(final String newPrefix) {
void retainMatchingItems(final String newPrefix, final LookupImpl lookup) {
synchronized (lock) {
final List<LookupElement> newItems = ContainerUtil.findAll(myItems, new Condition<LookupElement>() {
@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));
}
});
@@ -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);