Complete words in XML even if there are classes in the completion list (IDEA-50044)

This commit is contained in:
peter
2010-03-08 21:53:22 +00:00
parent 59f690abc4
commit ebf8bc4fd9
10 changed files with 28 additions and 18 deletions
@@ -75,6 +75,7 @@ public class BasicToClassNameDelegator extends CompletionContributor{
if (lookupElement instanceof JavaPsiClassReferenceElement) {
((JavaPsiClassReferenceElement)lookupElement).setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE);
}
lookupElement.putUserData(XmlCompletionContributor.WORD_COMPLETION_COMPATIBLE, Boolean.TRUE); //todo think of a less dirty interaction
result.addElement(lookupElement);
}
});
@@ -1 +1 @@
Settings Settings other
Settings Settings<caret> other
@@ -1 +1 @@
Settings Settings other
Settings Settings<caret> other
@@ -1 +1 @@
<a>Settings Settings <caret>other</a>
<a>Settings Settings<caret> other</a>
@@ -1,4 +1,4 @@
<root>
<a value="Settings"/>
<a value="Settings <caret>"></a>
<a value="Settings<caret>"></a>
</root>
@@ -1,4 +1,4 @@
public class MyClass {
String b = "My";
// public <caret>
// public<caret>
}
@@ -1,2 +1,2 @@
$test
$test <caret>
$test<caret>
@@ -1,4 +1,4 @@
public class MyClass {
/** comment MyClass <caret>*/
/** comment MyClass<caret> */
}
@@ -16,16 +16,13 @@
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.TailTypeDecorator;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.codeInsight.TailType;
import com.intellij.lang.ASTNode;
import com.intellij.lang.LanguageWordCompletion;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.DumbAware;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.util.Computable;
import static com.intellij.patterns.StandardPatterns.character;
import com.intellij.psi.PlainTextTokenTypes;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
@@ -33,9 +30,12 @@ import com.intellij.psi.PsiReference;
import com.intellij.psi.filters.getters.AllWordsGetter;
import com.intellij.psi.tree.IElementType;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import static com.intellij.patterns.StandardPatterns.character;
/**
* @author peter
*/
@@ -44,11 +44,11 @@ public class WordCompletionContributor extends CompletionContributor implements
@Override
public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet result) {
if (parameters.getCompletionType() == CompletionType.BASIC && shouldPerformWordCompletion(parameters)) {
addWordCompletionWariants(result, parameters);
addWordCompletionVariants(result, parameters, Collections.<String>emptySet());
}
}
public static void addWordCompletionWariants(CompletionResultSet result, CompletionParameters parameters) {
public static void addWordCompletionVariants(CompletionResultSet result, CompletionParameters parameters, Set<String> excludes) {
int startOffset = parameters.getOffset();
PsiElement insertedElement = parameters.getPosition();
final CompletionResultSet javaResultSet = result.withPrefixMatcher(CompletionUtil.findJavaIdentifierPrefix(insertedElement, startOffset));
@@ -57,9 +57,11 @@ public class WordCompletionContributor extends CompletionContributor implements
character().javaIdentifierPart().andNot(character().equalTo('$')),
character().javaIdentifierStart()));
for (final String word : AllWordsGetter.getAllWords(insertedElement, startOffset)) {
final LookupElement item = TailTypeDecorator.withTail(LookupElementBuilder.create(word), TailType.SPACE);
javaResultSet.addElement(item);
plainResultSet.addElement(item);
if (!excludes.contains(word)) {
final LookupElement item = LookupElementBuilder.create(word);
javaResultSet.addElement(item);
plainResultSet.addElement(item);
}
}
}
@@ -26,6 +26,7 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
@@ -37,12 +38,13 @@ import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.psi.xml.XmlTokenType;
import com.intellij.util.ProcessingContext;
import com.intellij.util.Consumer;
import com.intellij.util.ProcessingContext;
import com.intellij.xml.XmlBundle;
import com.intellij.xml.XmlElementDescriptor;
import com.intellij.xml.XmlExtension;
import com.intellij.xml.impl.schema.AnyXmlElementDescriptor;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -54,6 +56,7 @@ import java.util.Set;
* @author Dmitry Avdeev
*/
public class XmlCompletionContributor extends CompletionContributor {
public static final Key<Boolean> WORD_COMPLETION_COMPATIBLE = Key.create("WORD_COMPLETION_COMPATIBLE");
@NonNls public static final String TAG_NAME_COMPLETION_FEATURE = "tag.name.completion";
private static final InsertHandlerDecorator<LookupElement> QUOTE_EATER = new InsertHandlerDecorator<LookupElement>() {
@@ -92,10 +95,14 @@ public class XmlCompletionContributor extends CompletionContributor {
return;
}
final Set<String> usedWords = new THashSet<String>();
final Ref<Boolean> addWordVariants = Ref.create(true);
result.runRemainingContributors(parameters, new Consumer<LookupElement>() {
public void consume(LookupElement element) {
addWordVariants.set(false);
if (element.getUserData(WORD_COMPLETION_COMPATIBLE) == null) {
addWordVariants.set(false);
}
usedWords.add(element.getLookupString());
result.addElement(LookupElementDecorator.withInsertHandler(element, QUOTE_EATER));
}
});
@@ -108,7 +115,7 @@ public class XmlCompletionContributor extends CompletionContributor {
}
if (addWordVariants.get().booleanValue()) {
WordCompletionContributor.addWordCompletionWariants(result, parameters);
WordCompletionContributor.addWordCompletionVariants(result, parameters, usedWords);
}
}
});