package org.jetbrains.plugins.clojure.findUsages; import com.intellij.lang.cacheBuilder.DefaultWordsScanner; import com.intellij.lang.cacheBuilder.WordsScanner; import com.intellij.lang.findUsages.FindUsagesProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNamedElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.clojure.lexer.ClojureFlexLexer; import org.jetbrains.plugins.clojure.lexer.ClojureTokenTypes; import org.jetbrains.plugins.clojure.psi.api.defs.ClDef; import org.jetbrains.plugins.clojure.psi.api.symbols.ClSymbol; /** * @author ilyas */ public class ClojureFindUsagesProvider implements FindUsagesProvider{ @Nullable public WordsScanner getWordsScanner() { return new DefaultWordsScanner(new ClojureFlexLexer(), ClojureTokenTypes.IDENTIFIERS, ClojureTokenTypes.COMMENTS, ClojureTokenTypes.STRINGS); } public boolean canFindUsagesFor(@NotNull PsiElement psiElement) { return psiElement instanceof ClDef || psiElement instanceof ClSymbol; } public String getHelpId(@NotNull PsiElement psiElement) { return null; } @NotNull public String getType(@NotNull PsiElement element) { if (element instanceof ClSymbol) return "symbol"; if (element instanceof ClDef) return "definition"; return "entity"; } @NotNull public String getDescriptiveName(@NotNull PsiElement element) { if (element instanceof ClSymbol) { ClSymbol symbol = (ClSymbol) element; final String name = symbol.getText(); return name == null ? symbol.getText() : name; } if (element instanceof ClDef) { ClDef def = (ClDef) element; return def.getPresentationText(); } if (element instanceof PsiNamedElement) { final String s = ((PsiNamedElement) element).getName(); return s != null ? s : element.getText(); } return element.getText(); } @NotNull public String getNodeText(@NotNull PsiElement element, boolean useFullName) { if (element instanceof ClSymbol) { ClSymbol symbol = (ClSymbol) element; final String name = symbol.getReferenceName(); return name == null ? symbol.getText() : name; } if (element instanceof ClDef) { ClDef def = (ClDef) element; return def.getDefinedName(); } return element.getText(); } }