package org.jetbrains.plugins.clojure.psi.impl; import com.intellij.lang.ASTNode; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.StubBasedPsiElement; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.stubs.StubIndex; import com.intellij.util.Function; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.clojure.psi.ClStubElementType; import org.jetbrains.plugins.clojure.psi.ClojureBaseElementImpl; import org.jetbrains.plugins.clojure.psi.api.ClKeyword; import org.jetbrains.plugins.clojure.psi.stubs.api.ClKeywordStub; import org.jetbrains.plugins.clojure.psi.stubs.api.ClNsStub; import org.jetbrains.plugins.clojure.psi.stubs.index.ClojureKeywordIndex; import java.util.Collection; import java.util.HashSet; import java.util.Set; /** * @author ilyas */ public class ClKeywordImpl extends ClojureBaseElementImpl<ClKeywordStub> implements ClKeyword, StubBasedPsiElement<ClKeywordStub> { public ClKeywordImpl(ASTNode node) { super(node); } public ClKeywordImpl(ClKeywordStub stub, @NotNull ClStubElementType nodeType) { super(stub, nodeType); } @Override public String toString() { return "ClKeyword"; } @Override @NotNull public String getName() { ClKeywordStub stub = getStub(); if (stub != null) { return stub.getName(); } return getText(); } public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { throw new IncorrectOperationException("Name changing for the keyword"); } @Override public PsiReference getReference() { return this; } public PsiElement getElement() { return this; } public TextRange getRangeInElement() { return new TextRange(0, getTextLength()); } public PsiElement resolve() { return null; } @NotNull public String getCanonicalText() { return getText(); } public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException { return null; } public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException { return null; } public boolean isReferenceTo(PsiElement element) { return false; } public boolean isSoft() { return false; } @NotNull public Object[] getVariants() { final Project project = getProject(); final Collection<String> keys = StubIndex.getInstance().getAllKeys(ClojureKeywordIndex.KEY, project); return keys.toArray(new String[keys.size()]); } }