From c9054ad8a118fc57fcc677d7c185363e18117edc Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 24 Sep 2012 17:36:07 +0400 Subject: [PATCH] don't suggest duplicate class variants in java class references on second completion (IDEA-91913) --- .../JavaClassNameCompletionContributor.java | 18 ++++++++------ ...vaClassReferenceCompletionContributor.java | 24 +++++++++++++++++-- resources/src/META-INF/IdeaPlugin.xml | 2 +- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java index 266e9baec2f8..edd11ed4728b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassNameCompletionContributor.java @@ -54,16 +54,20 @@ public class JavaClassNameCompletionContributor extends CompletionContributor { public void fillCompletionVariants(CompletionParameters parameters, final CompletionResultSet _result) { if (parameters.getCompletionType() == CompletionType.CLASS_NAME || parameters.isExtendedCompletion() && mayContainClassName(parameters)) { - CompletionResultSet result = _result.withPrefixMatcher(CompletionUtil.findReferenceOrAlphanumericPrefix(parameters)); - addAllClasses(parameters, parameters.getInvocationCount() <= 1, result.getPrefixMatcher(), new Consumer() { - @Override - public void consume(LookupElement element) { - _result.addElement(element); - } - }); + addAllClasses(parameters, _result); } } + static void addAllClasses(CompletionParameters parameters, final CompletionResultSet _result) { + CompletionResultSet result = _result.withPrefixMatcher(CompletionUtil.findReferenceOrAlphanumericPrefix(parameters)); + addAllClasses(parameters, parameters.getInvocationCount() <= 1, result.getPrefixMatcher(), new Consumer() { + @Override + public void consume(LookupElement element) { + _result.addElement(element); + } + }); + } + private static boolean mayContainClassName(CompletionParameters parameters) { PsiElement position = parameters.getPosition(); PsiFile file = position.getContainingFile(); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassReferenceCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassReferenceCompletionContributor.java index b51d363fec78..ec587b446235 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassReferenceCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaClassReferenceCompletionContributor.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.completion; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiReference; import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference; @@ -34,10 +35,29 @@ public class JavaClassReferenceCompletionContributor extends CompletionContribut final PsiReference last = references[references.length - 1]; context.setReplacementOffset(last.getRangeInElement().getEndOffset() + last.getElement().getTextRange().getStartOffset()); } - } - @Nullable + @Override + public void fillCompletionVariants(CompletionParameters parameters, CompletionResultSet result) { + PsiElement position = parameters.getPosition(); + JavaClassReference reference = findJavaClassReference(position.getContainingFile(), parameters.getOffset()); + if (reference == null) { + return; + } + + if (parameters.getCompletionType() == CompletionType.CLASS_NAME || parameters.isExtendedCompletion()) { + JavaClassNameCompletionContributor.addAllClasses(parameters, result); + } + else { + CompletionData data = CompletionUtil.getCompletionDataByElement(position, parameters.getOriginalFile()); + if (data != null) { + LegacyCompletionContributor.completeReference(parameters, result, data); + } + } + result.stopHere(); + } + + @Nullable public static JavaClassReference findJavaClassReference(final PsiFile file, final int offset) { PsiReference reference = file.findReferenceAt(offset); if (reference instanceof PsiMultiReference) { diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 94e5f7dd7ebc..0ba816b6ea7a 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -241,7 +241,7 @@ + id="javaClassReference" order="before legacy"/>