old completion code cleanup

This commit is contained in:
peter
2015-09-08 10:41:05 +02:00
parent 146ad81b1e
commit 09ae3cb028
5 changed files with 34 additions and 111 deletions
@@ -45,7 +45,7 @@ import static com.intellij.patterns.StandardPatterns.character;
import static com.intellij.patterns.StandardPatterns.not;
/**
* @deprecated see {@link com.intellij.codeInsight.completion.CompletionContributor}
* @deprecated see {@link CompletionContributor}
*/
public class CompletionData {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.completion.CompletionData");
@@ -81,30 +81,15 @@ public class CompletionData {
return false;
}
protected void defineScopeEquivalence(Class scopeClass, Class equivClass){
final Iterator<CompletionVariant> iter = myCompletionVariants.iterator();
if(isScopeFinal(scopeClass)){
declareFinalScope(equivClass);
}
while(iter.hasNext()){
final CompletionVariant variant = iter.next();
if(variant.isScopeClassAcceptable(scopeClass)){
variant.includeScopeClass(equivClass, variant.isScopeClassFinal(scopeClass));
}
}
}
/**
* @deprecated
* @see com.intellij.codeInsight.completion.CompletionContributor
* @see CompletionContributor
*/
protected void registerVariant(CompletionVariant variant){
myCompletionVariants.add(variant);
}
public void completeReference(final PsiReference reference, final Set<LookupElement> set, @NotNull final PsiElement position, final PsiFile file,
final int offset){
public void completeReference(final PsiReference reference, final Set<LookupElement> set, @NotNull final PsiElement position, final PsiFile file) {
final CompletionVariant[] variants = findVariants(position, file);
boolean hasApplicableVariants = false;
for (CompletionVariant variant : variants) {
@@ -123,11 +108,9 @@ public class CompletionData {
ContainerUtil.addAll(set, findVariants(position, file));
}
public void completeKeywordsBySet(final Set<LookupElement> set, Set<CompletionVariant> variants, final PsiElement position,
final PrefixMatcher matcher,
final PsiFile file){
void completeKeywordsBySet(final Set<LookupElement> set, Set<CompletionVariant> variants, final PsiElement position){
for (final CompletionVariant variant : variants) {
variant.addKeywords(set, position, matcher, file, this);
variant.addKeywords(set, position, this);
}
}
@@ -164,7 +147,7 @@ public class CompletionData {
protected final CompletionVariant myGenericVariant = new CompletionVariant() {
@Override
public void addReferenceCompletions(PsiReference reference, PsiElement position, Set<LookupElement> set, final PsiFile file,
void addReferenceCompletions(PsiReference reference, PsiElement position, Set<LookupElement> set, final PsiFile file,
final CompletionData completionData) {
completeReference(reference, position, set, TailType.NONE, file, TrueFilter.INSTANCE, this);
}
@@ -260,13 +243,12 @@ public class CompletionData {
if (object instanceof LookupValueWithUIHint && ((LookupValueWithUIHint) object).isBold()) {
item.setBold();
}
item.setAttribute(CompletionUtil.TAIL_TYPE_ATTR, tailType);
item.setAttribute(LookupItem.TAIL_TYPE_ATTR, tailType);
return item;
}
protected void addLookupItem(Set<LookupElement> set, TailType tailType, @NotNull Object completion, final PsiFile file,
final CompletionVariant variant) {
protected void addLookupItem(Set<LookupElement> set, TailType tailType, @NotNull Object completion, final CompletionVariant variant) {
LookupElement ret = objectToLookupItem(completion);
if (ret == null) return;
if (!(ret instanceof LookupItem)) {
@@ -316,7 +298,7 @@ public class CompletionData {
if (completion instanceof PsiElement) {
final PsiElement psiElement = (PsiElement)completion;
if (filter.isClassAcceptable(psiElement.getClass()) && filter.isAcceptable(psiElement, position)) {
addLookupItem(set, tailType, completion, file, variant);
addLookupItem(set, tailType, completion, variant);
}
}
else {
@@ -327,7 +309,7 @@ public class CompletionData {
}
}
try {
addLookupItem(set, tailType, completion, file, variant);
addLookupItem(set, tailType, completion, variant);
}
catch (AssertionError e) {
LOG.error("Caused by variant from reference: " + reference.getClass(), e);
@@ -351,30 +333,27 @@ public class CompletionData {
return references;
}
protected void addKeywords(final Set<LookupElement> set, final PsiElement position, final PrefixMatcher matcher, final PsiFile file,
final CompletionVariant variant, final Object comp, final TailType tailType) {
void addKeywords(final Set<LookupElement> set, final PsiElement position, final CompletionVariant variant, final Object comp, final TailType tailType) {
if (comp instanceof String) {
addKeyword(set, tailType, comp, matcher, file, variant);
addKeyword(set, tailType, comp, variant);
}
else {
final CompletionContext context = position.getUserData(CompletionContext.COMPLETION_CONTEXT_KEY);
if (comp instanceof ContextGetter) {
final Object[] elements = ((ContextGetter)comp).get(position, context);
for (Object element : elements) {
addLookupItem(set, tailType, element, file, variant);
addLookupItem(set, tailType, element, variant);
}
}
}
}
protected void addKeyword(Set<LookupElement> set, final TailType tailType, final Object comp, final PrefixMatcher matcher,
final PsiFile file,
final CompletionVariant variant) {
private void addKeyword(Set<LookupElement> set, final TailType tailType, final Object comp, final CompletionVariant variant) {
for (final LookupElement item : set) {
if (item.getObject().toString().equals(comp.toString())) {
return;
}
}
addLookupItem(set, tailType, comp, file, variant);
addLookupItem(set, tailType, comp, variant);
}
}
@@ -16,11 +16,9 @@
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.TailType;
import com.intellij.codeInsight.lookup.Lookup;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupItem;
import com.intellij.codeInsight.lookup.LookupValueWithPsiElement;
import com.intellij.diagnostic.LogEventException;
import com.intellij.diagnostic.ThreadDumper;
@@ -32,8 +30,6 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.NotNullLazyValue;
import com.intellij.patterns.ElementPattern;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
@@ -42,7 +38,6 @@ 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;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -52,7 +47,6 @@ import java.util.*;
import static com.intellij.patterns.PlatformPatterns.character;
public class CompletionUtil {
public static final Key<TailType> TAIL_TYPE_ATTR = LookupItem.TAIL_TYPE_ATTR;
private static final CompletionData ourGenericCompletionData = new CompletionData() {
{
@@ -61,36 +55,9 @@ public class CompletionUtil {
registerVariant(variant);
}
};
private static final HashMap<FileType, NotNullLazyValue<CompletionData>> ourCustomCompletionDatas = new HashMap<FileType, NotNullLazyValue<CompletionData>>();
public static final @NonNls String DUMMY_IDENTIFIER = CompletionInitializationContext.DUMMY_IDENTIFIER;
public static final @NonNls String DUMMY_IDENTIFIER_TRIMMED = DUMMY_IDENTIFIER.trim();
public static boolean startsWith(String text, String prefix) {
//if (text.length() <= prefix.length()) return false;
return toLowerCase(text).startsWith(toLowerCase(prefix));
}
private static String toLowerCase(String text) {
CodeInsightSettings settings = CodeInsightSettings.getInstance();
switch (settings.COMPLETION_CASE_SENSITIVE) {
case CodeInsightSettings.NONE:
return text.toLowerCase();
case CodeInsightSettings.FIRST_LETTER: {
StringBuffer buffer = new StringBuffer();
buffer.append(text.toLowerCase());
if (buffer.length() > 0) {
buffer.setCharAt(0, text.charAt(0));
}
return buffer.toString();
}
default:
return text;
}
}
@Nullable
public static CompletionData getCompletionDataByElement(@Nullable final PsiElement position, @NotNull PsiFile originalFile) {
if (position == null) return null;
@@ -110,17 +77,15 @@ public class CompletionUtil {
}
@Nullable
public static CompletionData getCompletionDataByFileType(FileType fileType) {
private static CompletionData getCompletionDataByFileType(FileType fileType) {
for(CompletionDataEP ep: Extensions.getExtensions(CompletionDataEP.EP_NAME)) {
if (ep.fileType.equals(fileType.getName())) {
return ep.getHandler();
}
}
final NotNullLazyValue<CompletionData> lazyValue = ourCustomCompletionDatas.get(fileType);
return lazyValue == null ? null : lazyValue.getValue();
return null;
}
public static boolean shouldShowFeature(final CompletionParameters parameters, @NonNls final String id) {
if (FeatureUsageTracker.getInstance().isToBeAdvertisedInLookup(id, parameters.getPosition().getProject())) {
FeatureUsageTracker.getInstance().triggerFeatureShown(id);
@@ -41,7 +41,6 @@ public class CompletionVariant {
private final Set<Scope> myScopeClasses = new HashSet<Scope>();
private ElementFilter myPosition;
private final List<CompletionVariantItem> myCompletionsList = new ArrayList<CompletionVariantItem>();
private final Set<Class> myScopeClassExceptions = new HashSet<Class>();
private InsertHandler myInsertHandler = null;
private final Map<Object, Object> myItemProperties = new HashMap<Object, Object>();
@@ -63,15 +62,15 @@ public class CompletionVariant {
myPosition = position;
}
public boolean isScopeAcceptable(PsiElement scope){
boolean isScopeAcceptable(PsiElement scope){
return isScopeClassAcceptable(scope.getClass());
}
public boolean isScopeFinal(PsiElement scope){
boolean isScopeFinal(PsiElement scope){
return isScopeClassFinal(scope.getClass());
}
public InsertHandler getInsertHandler(){
InsertHandler getInsertHandler(){
return myInsertHandler;
}
@@ -79,15 +78,11 @@ public class CompletionVariant {
myInsertHandler = handler;
}
public void setItemProperty(Object id, Object value){
myItemProperties.put(id, value);
}
public Map<Object, Object> getItemProperties() {
Map<Object, Object> getItemProperties() {
return myItemProperties;
}
public boolean isScopeClassFinal(Class scopeClass){
private boolean isScopeClassFinal(Class scopeClass){
for (final Object myScopeClass : myScopeClasses) {
Scope scope = (Scope)myScopeClass;
if (ReflectionUtil.isAssignable(scope.myClass, scopeClass) && scope.myIsFinalScope) {
@@ -97,7 +92,7 @@ public class CompletionVariant {
return false;
}
public boolean isScopeClassAcceptable(Class scopeClass){
private boolean isScopeClassAcceptable(Class scopeClass){
boolean ret = false;
for (final Object myScopeClass : myScopeClasses) {
@@ -108,21 +103,9 @@ public class CompletionVariant {
}
}
if(ret){
for (final Class aClass: myScopeClassExceptions) {
if (ReflectionUtil.isAssignable(aClass, scopeClass)) {
ret = false;
break;
}
}
}
return ret;
}
public void excludeScopeClass(Class<?> aClass){
myScopeClassExceptions.add(aClass);
}
public void includeScopeClass(Class<?> aClass){
myScopeClasses.add(new Scope(aClass, false));
}
@@ -169,11 +152,11 @@ public class CompletionVariant {
}
}
public boolean isVariantApplicable(PsiElement position, PsiElement scope){
boolean isVariantApplicable(PsiElement position, PsiElement scope){
return isScopeAcceptable(scope) && myPosition.isAcceptable(position, scope);
}
public void addReferenceCompletions(PsiReference reference, PsiElement position, Set<LookupElement> set, final PsiFile file,
void addReferenceCompletions(PsiReference reference, PsiElement position, Set<LookupElement> set, final PsiFile file,
final CompletionData completionData){
for (final CompletionVariantItem ce : myCompletionsList) {
if(ce.myCompletion instanceof ElementFilter){
@@ -183,15 +166,13 @@ public class CompletionVariant {
}
}
public void addKeywords(Set<LookupElement> set, PsiElement position, final PrefixMatcher matcher, final PsiFile file,
final CompletionData completionData){
void addKeywords(Set<LookupElement> set, PsiElement position, final CompletionData completionData) {
for (final CompletionVariantItem ce : myCompletionsList) {
completionData.addKeywords(set, position, matcher, file, this, ce.myCompletion, ce.myTailType);
completionData.addKeywords(set, position, this, ce.myCompletion, ce.myTailType);
}
}
public boolean hasReferenceFilter(){
boolean hasReferenceFilter(){
for (final CompletionVariantItem item: myCompletionsList) {
if (item.myCompletion instanceof ElementFilter) {
return true;
@@ -200,7 +181,7 @@ public class CompletionVariant {
return false;
}
public boolean hasKeywordCompletions(){
boolean hasKeywordCompletions(){
for (final CompletionVariantItem item : myCompletionsList) {
if (!(item.myCompletion instanceof ElementFilter)) {
return true;
@@ -220,7 +201,7 @@ public class CompletionVariant {
}
}
protected static class CompletionVariantItem{
private static class CompletionVariantItem{
public Object myCompletion;
public TailType myTailType;
@@ -240,7 +221,7 @@ public class CompletionVariant {
}
public void setCaseInsensitive(boolean caseInsensitive) {
setItemProperty(LookupItem.CASE_INSENSITIVE, caseInsensitive);
myItemProperties.put(LookupItem.CASE_INSENSITIVE, caseInsensitive);
}
}
@@ -55,7 +55,7 @@ public class LegacyCompletionContributor extends CompletionContributor {
final Set<CompletionVariant> keywordVariants = new HashSet<CompletionVariant>();
PsiFile file = parameters.getOriginalFile();
completionData.addKeywordVariants(keywordVariants, insertedElement, file);
completionData.completeKeywordsBySet(lookupSet, keywordVariants, insertedElement, result.getPrefixMatcher(), file);
completionData.completeKeywordsBySet(lookupSet, keywordVariants, insertedElement);
result.addAllElements(lookupSet);
}
@@ -70,8 +70,7 @@ public class LegacyCompletionContributor extends CompletionContributor {
@Override
public void consume(final PsiReference reference, final CompletionResultSet resultSet) {
final Set<LookupElement> lookupSet = new LinkedHashSet<LookupElement>();
completionData
.completeReference(reference, lookupSet, parameters.getPosition(), parameters.getOriginalFile(), parameters.getOffset());
completionData.completeReference(reference, lookupSet, parameters.getPosition(), parameters.getOriginalFile());
for (final LookupElement item : lookupSet) {
if (resultSet.getPrefixMatcher().prefixMatches(item)) {
hasVariants.set(true);
@@ -18,7 +18,6 @@ package com.intellij.codeInsight.lookup;
import com.intellij.codeInsight.CharTailType;
import com.intellij.codeInsight.TailType;
import com.intellij.codeInsight.completion.CompletionUtil;
import com.intellij.codeInsight.completion.InsertHandler;
import com.intellij.codeInsight.completion.InsertionContext;
import com.intellij.codeInsight.lookup.impl.ElementLookupRenderer;
@@ -222,7 +221,7 @@ public class LookupItem<T> extends MutableLookupElement<T> implements Comparable
if (lookupElement instanceof LookupItem) {
final LookupItem<?> item = (LookupItem)lookupElement;
final TailType attr = item.getAttribute(CompletionUtil.TAIL_TYPE_ATTR);
final TailType attr = item.getAttribute(TAIL_TYPE_ATTR);
if (attr != null) {
return attr;
}