From 5ff0e0fb939b7f066d2f30a08c7d368c8ae47b5f Mon Sep 17 00:00:00 2001 From: Peter Gromov Date: Fri, 11 Sep 2009 20:51:17 +0400 Subject: [PATCH] IDEADEV-40378: Second smart completion: offer Collections.singleton(), Collections.singletonList, Collections.singletonMap (and more) --- .../BasicExpressionCompletionContributor.java | 48 +------------ .../CollectionsUtilityMethodsProvider.java | 70 +++++++++++++++++++ 2 files changed, 71 insertions(+), 47 deletions(-) create mode 100644 java/java-impl/src/com/intellij/codeInsight/completion/CollectionsUtilityMethodsProvider.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/BasicExpressionCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/BasicExpressionCompletionContributor.java index b429e76e8231..477a20bdc953 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/BasicExpressionCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/BasicExpressionCompletionContributor.java @@ -4,7 +4,6 @@ */ package com.intellij.codeInsight.completion; -import com.intellij.codeInsight.TailType; import com.intellij.codeInsight.guess.GuessManager; import com.intellij.codeInsight.lookup.*; import com.intellij.openapi.application.ApplicationManager; @@ -13,7 +12,6 @@ import com.intellij.patterns.PsiJavaPatterns; import static com.intellij.patterns.PsiJavaPatterns.psiClass; import static com.intellij.patterns.PsiJavaPatterns.psiElement; import static com.intellij.patterns.StandardPatterns.not; -import static com.intellij.patterns.StandardPatterns.or; import com.intellij.psi.*; import com.intellij.psi.filters.ContextGetter; import com.intellij.psi.filters.element.ExcludeDeclaredFilter; @@ -23,7 +21,6 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Consumer; import com.intellij.util.IncorrectOperationException; import com.intellij.util.ProcessingContext; -import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -66,43 +63,7 @@ public class BasicExpressionCompletionContributor extends ExpressionSmartComplet }); - extend(PsiJavaPatterns.psiElement().withSuperParent(2, - or( - PsiJavaPatterns.psiElement(PsiConditionalExpression.class).withParent( - PsiReturnStatement.class), - PsiJavaPatterns.psiElement(PsiReturnStatement.class))), new CompletionProvider() { - public void addCompletions(@NotNull final JavaSmartCompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result) { - final PsiElement element = parameters.getPosition(); - - final PsiElement parent = element.getParent(); - if (parent instanceof PsiReferenceExpression && ((PsiReferenceExpression)parent).getQualifierExpression() != null) return; - - final PsiClass collectionsClass = - JavaPsiFacade.getInstance(element.getProject()).findClass(CommonClassNames.JAVA_UTIL_COLLECTIONS, element.getResolveScope()); - if (collectionsClass == null) return; - - final PsiType type = parameters.getExpectedType(); - final PsiType defaultType = parameters.getDefaultType(); - addCollectionMethod(result, type, defaultType, CommonClassNames.JAVA_UTIL_LIST, "emptyList", collectionsClass); - addCollectionMethod(result, type, defaultType, CommonClassNames.JAVA_UTIL_SET, "emptySet", collectionsClass); - addCollectionMethod(result, type, defaultType, CommonClassNames.JAVA_UTIL_MAP, "emptyMap", collectionsClass); - - } - - private void addCollectionMethod(final CompletionResultSet result, final PsiType expectedType, - final PsiType defaultType, final String baseClassName, - @NonNls final String method, @NotNull final PsiClass collectionsClass) { - if (isClassType(expectedType, baseClassName) || isClassType(expectedType, CommonClassNames.JAVA_UTIL_COLLECTION) || - isClassType(defaultType, baseClassName) || isClassType(defaultType, CommonClassNames.JAVA_UTIL_COLLECTION)) { - final PsiMethod[] methods = collectionsClass.findMethodsByName(method, false); - if (methods.length != 0) { - result.addElement(JavaCompletionUtil.qualify(((LookupItem)LookupItemUtil.objectToLookupItem(methods[0])).setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE).setTailType( - TailType.NONE))); - } - } - } - - }); + extend(not(psiElement().afterLeaf(".")), new CollectionsUtilityMethodsProvider()); extend(not(psiElement().afterLeaf(".")), new CompletionProvider() { protected void addCompletions(@NotNull final JavaSmartCompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result) { @@ -193,11 +154,4 @@ public class BasicExpressionCompletionContributor extends ExpressionSmartComplet return new ExpressionLookupItem(expression); } - private static boolean isClassType(final PsiType type, final String className) { - if (type instanceof PsiClassType) { - final PsiClass psiClass = ((PsiClassType)type).resolve(); - return psiClass != null && className.equals(psiClass.getQualifiedName()); - } - return false; - } } diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/CollectionsUtilityMethodsProvider.java b/java/java-impl/src/com/intellij/codeInsight/completion/CollectionsUtilityMethodsProvider.java new file mode 100644 index 000000000000..38cdf3b0aa58 --- /dev/null +++ b/java/java-impl/src/com/intellij/codeInsight/completion/CollectionsUtilityMethodsProvider.java @@ -0,0 +1,70 @@ +package com.intellij.codeInsight.completion; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NonNls; +import com.intellij.util.ProcessingContext; +import com.intellij.psi.*; +import static com.intellij.psi.CommonClassNames.*; +import com.intellij.codeInsight.lookup.AutoCompletionPolicy; + +/** +* @author peter +*/ +class CollectionsUtilityMethodsProvider extends CompletionProvider { + public void addCompletions(@NotNull final JavaSmartCompletionParameters parameters, final ProcessingContext context, @NotNull final CompletionResultSet result) { + final PsiElement element = parameters.getPosition(); + + final PsiElement parent = element.getParent(); + if (parent instanceof PsiReferenceExpression && ((PsiReferenceExpression)parent).getQualifierExpression() != null) return; + + final PsiClass collectionsClass = + JavaPsiFacade.getInstance(element.getProject()).findClass(JAVA_UTIL_COLLECTIONS, element.getResolveScope()); + if (collectionsClass == null) return; + + final PsiType type = parameters.getExpectedType(); + final PsiType defaultType = parameters.getDefaultType(); + final PsiElement pparent = parent.getParent(); + if (parameters.getInvocationCount() > 1 || + pparent instanceof PsiReturnStatement || + pparent instanceof PsiConditionalExpression && pparent.getParent() instanceof PsiReturnStatement) { + addCollectionMethod(result, type, defaultType, JAVA_UTIL_LIST, "emptyList", collectionsClass); + addCollectionMethod(result, type, defaultType, JAVA_UTIL_SET, "emptySet", collectionsClass); + addCollectionMethod(result, type, defaultType, JAVA_UTIL_MAP, "emptyMap", collectionsClass); + } + + if (parameters.getInvocationCount() > 1) { + addCollectionMethod(result, type, defaultType, JAVA_UTIL_LIST, "singletonList", collectionsClass); + addCollectionMethod(result, type, defaultType, JAVA_UTIL_SET, "singleton", collectionsClass); + addCollectionMethod(result, type, defaultType, JAVA_UTIL_MAP, "singletonMap", collectionsClass); + + addCollectionMethod(result, type, defaultType, JAVA_UTIL_COLLECTION, "unmodifiableCollection", collectionsClass); + addCollectionMethod(result, type, defaultType, JAVA_UTIL_LIST, "unmodifiableList", collectionsClass); + addCollectionMethod(result, type, defaultType, JAVA_UTIL_SET, "unmodifiableSet", collectionsClass); + addCollectionMethod(result, type, defaultType, JAVA_UTIL_MAP, "unmodifiableMap", collectionsClass); + addCollectionMethod(result, type, defaultType, "java.util.SortedSet", "unmodifiableSortedSet", collectionsClass); + addCollectionMethod(result, type, defaultType, "java.util.SortedMap", "unmodifiableSortedMap", collectionsClass); + } + + } + + private static void addCollectionMethod(final CompletionResultSet result, final PsiType expectedType, + final PsiType defaultType, final String baseClassName, + @NonNls final String method, @NotNull final PsiClass collectionsClass) { + if (isClassType(expectedType, baseClassName) || isClassType(expectedType, JAVA_UTIL_COLLECTION) || + isClassType(defaultType, baseClassName) || isClassType(defaultType, JAVA_UTIL_COLLECTION)) { + final PsiMethod[] methods = collectionsClass.findMethodsByName(method, false); + if (methods.length != 0) { + result.addElement(JavaCompletionUtil.qualify(new JavaMethodCallElement(methods[0]).setAutoCompletionPolicy(AutoCompletionPolicy.NEVER_AUTOCOMPLETE))); + } + } + } + + private static boolean isClassType(final PsiType type, final String className) { + if (type instanceof PsiClassType) { + final PsiClass psiClass = ((PsiClassType)type).resolve(); + return psiClass != null && className.equals(psiClass.getQualifiedName()); + } + return false; + } + +}