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

Source Code of org.jetbrains.plugins.clojure.psi.resolve.processors.SymbolResolveProcessor

package org.jetbrains.plugins.clojure.psi.resolve.processors;

import com.intellij.openapi.util.Key;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiNamedElement;
import com.intellij.psi.ResolveState;
import com.intellij.psi.scope.NameHint;
import org.jetbrains.plugins.clojure.psi.impl.list.ListDeclarations;
import org.jetbrains.plugins.clojure.psi.resolve.ClojureResolveResultImpl;

import java.util.HashSet;
import java.util.Set;

/**
* @author ilyas
*/
public class SymbolResolveProcessor extends ResolveProcessor implements NameHint {

  private final Set<PsiElement> myProcessedElements = new HashSet<PsiElement>();
  private final PsiElement myPlace;
  private final boolean incompleteCode;

  public SymbolResolveProcessor(String myName, PsiElement myPlace, boolean incompleteCode, ResolveKind[] kinds) {
    super(myName, kinds);
    this.myPlace = myPlace;
    this.incompleteCode = incompleteCode;
  }


  public boolean execute(PsiElement element, ResolveState resolveState) {
    if (element instanceof PsiNamedElement && !myProcessedElements.contains(element)) {
      if (!kindMatches((PsiNamedElement) element)) return true;
      PsiNamedElement namedElement = (PsiNamedElement) element;
      boolean isAccessible = isAccessible(namedElement);
      myCandidates.add(new ClojureResolveResultImpl(namedElement, isAccessible));
      myProcessedElements.add(namedElement);
      return !ListDeclarations.isLocal(element);
      //todo specify as it's possible!
    }

    return true;
  }

  /*
  todo: add ElementClassHints
   */
  public <T> T getHint(Key<T> hintKey) {
    if (hintKey == NameHint.KEY && myName != null) {
      return (T) this;
    }

    return null;
  }

  public PsiElement getPlace() {
    return myPlace;
  }

  public String getName(ResolveState resolveState) {
    return myName;
  }

  protected boolean isAccessible(PsiNamedElement namedElement) {
    //todo implement me
    return true;
  }

  public boolean shouldProcess(DeclarationKind kind) {
    return true;
  }
}
TOP

Related Classes of org.jetbrains.plugins.clojure.psi.resolve.processors.SymbolResolveProcessor

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.