Package org.jetbrains.plugins.clojure.psi.resolve.completion

Source Code of org.jetbrains.plugins.clojure.psi.resolve.completion.ClojureClassNameCompletionContributor

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);
    }
  }
}
TOP

Related Classes of org.jetbrains.plugins.clojure.psi.resolve.completion.ClojureClassNameCompletionContributor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.