package org.jetbrains.plugins.clojure.psi.resolve.completion; import com.intellij.codeInsight.completion.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.Consumer; import org.jetbrains.plugins.clojure.psi.api.ClList; import org.jetbrains.plugins.clojure.psi.api.symbols.ClSymbol; import org.jetbrains.plugins.clojure.psi.impl.list.ListDeclarations; /** * @author Alefas * @since 15.01.13 */ public class ClojureClassNameCompletionContributor extends CompletionContributor { public static void completeClassName(final CompletionParameters parameters, final CompletionResultSet result) { final PsiElement position = parameters.getPosition(); final PsiElement parent = position.getParent(); if (!(parent instanceof ClSymbol)) return; ClSymbol symbol = (ClSymbol) parent; if (symbol.getQualifierSymbol() != null) return; final PsiElement list = symbol.getParent(); final boolean isInImport; if (list instanceof ClList) { isInImport = ((ClList) list).getFirstSymbol().getNameString().equals(ListDeclarations.IMPORT); } else { isInImport = false; } final PrefixMatcher prefixMatcher = result.getPrefixMatcher(); final boolean filterByScope = parameters.getInvocationCount() <= 1; AllClassesGetter.processJavaClasses(parameters, prefixMatcher, filterByScope, new Consumer<PsiClass>() { public void consume(final PsiClass clazz) { if (!AllClassesGetter.isAcceptableInContext(position, clazz, filterByScope, true)) return; final ClojureLookupItem lookupItem = new ClojureLookupItem(clazz); lookupItem.setClassName(true); lookupItem.setInImport(isInImport); result.addElement(lookupItem); } }); } public static boolean shouldRunClassName(CompletionParameters parameters, PrefixMatcher prefixMatcher, boolean checkInvocationCount) { final PsiElement position = parameters.getPosition(); if (checkInvocationCount && parameters.getInvocationCount() < 2) return false; final PsiElement parent = position.getParent(); if (!(parent instanceof ClSymbol)) return false; if (((ClSymbol) parent).getQualifierSymbol() != null) return false; if (checkInvocationCount && parameters.getInvocationCount() >= 2) return true; final String prefix = prefixMatcher.getPrefix(); return prefix.length() > 0 && prefix.substring(0, 1).toUpperCase().equals(prefix.substring(0, 1)); } @Override public void fillCompletionVariants(CompletionParameters parameters, CompletionResultSet result) { if (parameters.getCompletionType() != CompletionType.BASIC) return; //only basic completion is here if (shouldRunClassName(parameters, result.getPrefixMatcher(), true)) { completeClassName(parameters, result); } } }