mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
let the lookup pretend to know about elements' matchers, not elements themselves
This commit is contained in:
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+2
-2
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user