mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
make ctrl+space in java offer all class names, not just the imported ones
This commit is contained in:
+1
-9
@@ -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;
|
||||
|
||||
+51
-14
@@ -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>
|
||||
}
|
||||
}
|
||||
-2
@@ -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"/>
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user