make ctrl+space in java offer all class names, not just the imported ones

This commit is contained in:
peter
2010-08-22 18:37:29 +01:00
parent 8a1e09a947
commit a5dcfb5582
7 changed files with 55 additions and 39 deletions
@@ -17,12 +17,10 @@ package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.lookup.AutoCompletionPolicy;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.lang.StdLanguages;
import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiJavaCodeReferenceElement;
/**
* @author peter
@@ -31,13 +29,7 @@ public class BasicToClassNameDelegator extends AbstractBasicToClassNameDelegator
@Override
protected boolean isClassNameCompletionSupported(CompletionResultSet result, PsiFile file, PsiElement position) {
final boolean isJava = file.getLanguage() == StdLanguages.JAVA;
if (!isJava && !(file.getLanguage() instanceof XMLLanguage)) return false;
if (isJava) {
if (!(position.getParent() instanceof PsiJavaCodeReferenceElement)) return false;
if (((PsiJavaCodeReferenceElement)position.getParent()).getQualifier() != null) return false;
}
if (!(file.getLanguage() instanceof XMLLanguage)) return false;
final String s = result.getPrefixMatcher().getPrefix();
if (StringUtil.isEmpty(s) || !Character.isUpperCase(s.charAt(0))) return false;
@@ -50,6 +50,7 @@ import com.intellij.psi.impl.source.tree.ElementType;
import com.intellij.psi.scope.ElementClassFilter;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.Consumer;
import com.intellij.util.PairConsumer;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
@@ -166,24 +167,24 @@ public class JavaCompletionContributor extends CompletionContributor {
return;
}
final PsiElement insertedElement = parameters.getPosition();
if (!insertedElement.getContainingFile().getLanguage().isKindOf(StdLanguages.JAVA)) {
final PsiElement position = parameters.getPosition();
if (!position.getContainingFile().getLanguage().isKindOf(StdLanguages.JAVA)) {
return;
}
final PsiFile file = parameters.getOriginalFile();
final int startOffset = parameters.getOffset();
final PsiElement lastElement = file.findElementAt(startOffset - 1);
final int offset = parameters.getOffset();
final PsiElement lastElement = file.findElementAt(offset - 1);
final JavaAwareCompletionData completionData = ApplicationManager.getApplication().runReadAction(new Computable<JavaAwareCompletionData>() {
public JavaAwareCompletionData compute() {
return getCompletionDataByElementInner(lastElement);
}
});
if (ANNOTATION_ATTRIBUTE_NAME.accepts(insertedElement)) {
if (ANNOTATION_ATTRIBUTE_NAME.accepts(position)) {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
completeAnnotationAttributeName(_result, file, insertedElement, parameters);
completeAnnotationAttributeName(_result, file, position, parameters);
}
});
_result.stopHere();
@@ -197,10 +198,10 @@ public class JavaCompletionContributor extends CompletionContributor {
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
if (reference instanceof PsiJavaReference) {
final ElementFilter filter = getReferenceFilter(insertedElement);
final ElementFilter filter = getReferenceFilter(position);
if (filter != null) {
final boolean isSwitchLabel = SWITCH_LABEL.accepts(insertedElement);
for (LookupElement element : JavaCompletionUtil.processJavaReference(insertedElement,
final boolean isSwitchLabel = SWITCH_LABEL.accepts(position);
for (LookupElement element : JavaCompletionUtil.processJavaReference(position,
(PsiJavaReference) reference,
new ElementExtractorFilter(filter),
checkAccess,
@@ -228,11 +229,15 @@ public class JavaCompletionContributor extends CompletionContributor {
}
for (Object completion : variants) {
if (completion == null) {
LOG.error("Position=" + insertedElement + "\n;Reference=" + reference + "\n;variants=" + Arrays.toString(variants));
LOG.error("Position=" + position + "\n;Reference=" + reference + "\n;variants=" + Arrays.toString(variants));
}
if (completion instanceof LookupElement) {
result.addElement((LookupElement)completion);
} else {
}
else if (completion instanceof PsiClass) {
result.addElement(AllClassesGetter.createLookupItem((PsiClass)completion));
}
else {
result.addElement(LookupItemUtil.objectToLookupItem(completion));
}
}
@@ -243,9 +248,9 @@ public class JavaCompletionContributor extends CompletionContributor {
final Set<LookupElement> lookupSet = new LinkedHashSet<LookupElement>();
final Set<CompletionVariant> keywordVariants = new HashSet<CompletionVariant>();
completionData.addKeywordVariants(keywordVariants, insertedElement, parameters.getOriginalFile());
final CompletionResultSet result = _result.withPrefixMatcher(completionData.findPrefix(insertedElement, startOffset));
completionData.completeKeywordsBySet(lookupSet, keywordVariants, insertedElement, result.getPrefixMatcher(), parameters.getOriginalFile());
completionData.addKeywordVariants(keywordVariants, position, parameters.getOriginalFile());
final CompletionResultSet result = _result.withPrefixMatcher(completionData.findPrefix(position, offset));
completionData.completeKeywordsBySet(lookupSet, keywordVariants, position, result.getPrefixMatcher(), parameters.getOriginalFile());
ApplicationManager.getApplication().runReadAction(new Runnable() {
public void run() {
@@ -265,9 +270,41 @@ public class JavaCompletionContributor extends CompletionContributor {
result.addElement(item);
}
if (shouldRunClassNameCompletion(result, file, position)) {
result.runRemainingContributors(new CompletionParameters(position, file, CompletionType.CLASS_NAME, offset, parameters.getInvocationCount()), new Consumer<LookupElement>() {
@Override
public void consume(LookupElement lookupElement) {
result.addElement(lookupElement);
}
});
}
result.stopHere();
}
private static boolean shouldRunClassNameCompletion(CompletionResultSet result, PsiFile file, PsiElement position) {
final PsiElement parent = position.getParent();
if (!(parent instanceof PsiJavaCodeReferenceElement)) return false;
if (((PsiJavaCodeReferenceElement)parent).getQualifier() != null) return false;
PsiElement grand = parent.getParent();
if (grand instanceof PsiSwitchLabelStatement) {
return false;
}
if (grand instanceof PsiAnonymousClass) {
grand = grand.getParent();
}
if (grand instanceof PsiNewExpression && ((PsiNewExpression)grand).getQualifier() != null) {
return false;
}
final String s = result.getPrefixMatcher().getPrefix();
if (StringUtil.isEmpty(s) || !Character.isUpperCase(s.charAt(0))) return false;
return true;
}
private static void completeAnnotationAttributeName(CompletionResultSet result, PsiFile file, PsiElement insertedElement,
CompletionParameters parameters) {
PsiNameValuePair pair = PsiTreeUtil.getParentOfType(insertedElement, PsiNameValuePair.class);
@@ -1,5 +0,0 @@
class Bar {
{
GregCale<caret>
}
}
@@ -5,7 +5,6 @@
package com.intellij.codeInsight.completion;
import com.intellij.JavaTestUtil;
import com.intellij.codeInsight.lookup.Lookup;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupManager;
import com.intellij.codeInsight.lookup.impl.LookupImpl;
@@ -39,7 +38,6 @@ public class HeavyNormalCompletionTest extends CompletionTestCase{
createClass("package foo.bar; public class AxBxCxDxEx {}");
configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
((LookupImpl)LookupManager.getActiveLookup(myEditor)).finishLookup(Lookup.NORMAL_SELECT_CHAR);
checkResultByFile("/codeInsight/completion/normal/" + getTestName(false) + "_after.java");
}
@@ -467,12 +467,6 @@ public class NormalCompletionTest extends LightCompletionTestCase {
checkResultByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
}
public void testNoAllClassesAutoInsert() throws Throwable {
configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
assertStringItems("GregorianCalendar");
checkResultByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
}
public void testFinishClassNameWithDot() throws Throwable {
configureByFile("/codeInsight/completion/normal/" + getTestName(false) + ".java");
type('.');
@@ -54,7 +54,7 @@
<lang.literalEscaper language="XML" implementationClass="com.intellij.lang.xml.XmlLiteralEscaper"/>
<completion.contributor language="any" implementationClass="com.intellij.codeInsight.completion.XmlCompletionContributor" id="xml"
order="first, before basic2ClassName"/>
order="first"/>
<lookup.charFilter implementation="com.intellij.codeInsight.completion.XmlCharFilter" id="xml"/>
+2 -2
View File
@@ -226,9 +226,9 @@
<lookup.actionProvider implementation="com.intellij.codeInsight.completion.ExcludeFromCompletionLookupActionProvider"/>
<completion.contributor language="any" implementationClass="com.intellij.codeInsight.completion.BasicToClassNameDelegator" id="basic2ClassName"
order="first, before javaMemberName"/>
order="first, before javaMemberName, after xml"/>
<completion.contributor language="JAVA" implementationClass="com.intellij.codeInsight.completion.JavaCompletionContributor" id="javaLegacy"
order="last, before legacy, before default"/>
order="last, before legacy, before default, before javaClassName"/>
<completion.contributor language="any" implementationClass="com.intellij.codeInsight.completion.JavaClassReferenceCompletionContributor" id="javaClassReference"/>
<completion.contributor language="any" implementationClass="com.intellij.codeInsight.completion.JavaMethodMergingContributor" id="methodMerger"