don't let DomCompletionContributor process java class references in plugin.xml (IDEA-92934)

This commit is contained in:
peter
2012-10-16 15:00:26 +02:00
parent aa4a27b491
commit cd9fc2209f
3 changed files with 38 additions and 43 deletions
@@ -53,10 +53,7 @@ public class JavaClassReferenceCompletionContributor extends CompletionContribut
JavaClassNameCompletionContributor.addAllClasses(parameters, result);
}
else {
CompletionData data = CompletionUtil.getCompletionDataByElement(position, parameters.getOriginalFile());
if (data != null) {
LegacyCompletionContributor.completeReference(parameters, result, data);
}
LegacyCompletionContributor.completeReference(parameters, result);
}
result.stopHere();
}
@@ -18,16 +18,12 @@ package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.openapi.paths.PsiDynaReference;
import com.intellij.openapi.util.Ref;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.patterns.PsiElementPattern;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.ReferenceRange;
import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference;
import com.intellij.util.PairConsumer;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.LinkedHashSet;
@@ -37,43 +33,34 @@ import java.util.Set;
* @author peter
*/
public class LegacyCompletionContributor extends CompletionContributor {
public static boolean DEBUG = false;
public LegacyCompletionContributor() {
final PsiElementPattern.Capture<PsiElement> everywhere = PlatformPatterns.psiElement();
extend(CompletionType.BASIC, everywhere, new CompletionProvider<CompletionParameters>() {
@Override
public void addCompletions(@NotNull final CompletionParameters parameters,
final ProcessingContext matchingContext,
@NotNull final CompletionResultSet _result) {
final PsiFile file = parameters.getOriginalFile();
final int startOffset = parameters.getOffset();
final PsiElement insertedElement = parameters.getPosition();
CompletionData completionData = CompletionUtil.getCompletionDataByElement(insertedElement, file);
if (completionData == null) return;
@Override
public void fillCompletionVariants(CompletionParameters parameters, CompletionResultSet _result) {
if (parameters.getCompletionType() != CompletionType.BASIC) {
return;
}
CompletionData completionData = getCompletionData(parameters);
if (completionData == null) return;
final CompletionResultSet result = _result.withPrefixMatcher(completionData.findPrefix(insertedElement, startOffset));
completeReference(parameters, result, completionData);
final Set<LookupElement> lookupSet = new LinkedHashSet<LookupElement>();
final Set<CompletionVariant> keywordVariants = new HashSet<CompletionVariant>();
completionData.addKeywordVariants(keywordVariants, insertedElement, parameters.getOriginalFile());
completionData
.completeKeywordsBySet(lookupSet, keywordVariants, insertedElement, result.getPrefixMatcher(), file);
for (final LookupElement item : lookupSet) {
result.addElement(item);
}
}
});
final PsiElement insertedElement = parameters.getPosition();
final CompletionResultSet result = _result.withPrefixMatcher(completionData.findPrefix(insertedElement, parameters.getOffset()));
completeReference(parameters, result);
final Set<LookupElement> lookupSet = new LinkedHashSet<LookupElement>();
final Set<CompletionVariant> keywordVariants = new HashSet<CompletionVariant>();
PsiFile file = parameters.getOriginalFile();
completionData.addKeywordVariants(keywordVariants, insertedElement, file);
completionData.completeKeywordsBySet(lookupSet, keywordVariants, insertedElement, result.getPrefixMatcher(), file);
result.addAllElements(lookupSet);
}
public static boolean completeReference(final CompletionParameters parameters,
final CompletionResultSet result,
final CompletionData completionData) {
public static boolean completeReference(final CompletionParameters parameters, final CompletionResultSet result) {
final CompletionData completionData = getCompletionData(parameters);
if (completionData == null) {
return false;
}
final Ref<Boolean> hasVariants = Ref.create(false);
processReferences(parameters, result, new PairConsumer<PsiReference, CompletionResultSet>() {
@Override
@@ -92,6 +79,11 @@ public class LegacyCompletionContributor extends CompletionContributor {
return hasVariants.get().booleanValue();
}
private static CompletionData getCompletionData(CompletionParameters parameters) {
final PsiElement position = parameters.getPosition();
return CompletionUtil.getCompletionDataByElement(position, parameters.getOriginalFile());
}
public static void processReferences(final CompletionParameters parameters,
final CompletionResultSet result,
final PairConsumer<PsiReference, CompletionResultSet> consumer) {
@@ -43,7 +43,7 @@ public class DomCompletionContributor extends CompletionContributor{
}
private boolean domKnowsBetter(final CompletionParameters parameters, final CompletionResultSet result) {
final PsiElement element = PsiTreeUtil.getParentOfType(parameters.getPosition(), XmlTag.class, XmlAttributeValue.class);
final XmlAttributeValue element = PsiTreeUtil.getParentOfType(parameters.getPosition(), XmlAttributeValue.class);
if (element == null) {
return false;
}
@@ -51,9 +51,15 @@ public class DomCompletionContributor extends CompletionContributor{
if (isSchemaEnumerated(element)) {
return false;
}
final PsiReference[] references = myProvider.getReferencesByElement(element, new ProcessingContext());
if (references.length > 0) {
return LegacyCompletionContributor.completeReference(parameters, result, new XmlCompletionData());
final PsiElement parent = element.getParent();
if (parent instanceof XmlAttribute) {
XmlAttributeDescriptor descriptor = ((XmlAttribute)parent).getDescriptor();
if (descriptor != null && descriptor.getDefaultValue() != null) {
final PsiReference[] references = myProvider.getReferencesByElement(element, new ProcessingContext());
if (references.length > 0) {
return LegacyCompletionContributor.completeReference(parameters, result);
}
}
}
return false;
}