package org.jetbrains.plugins.clojure.psi.impl.list;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.StubBasedPsiElement;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.plugins.clojure.psi.ClojureBaseElementImpl;
import org.jetbrains.plugins.clojure.psi.ClojurePsiElement;
import org.jetbrains.plugins.clojure.psi.api.ClList;
import org.jetbrains.plugins.clojure.psi.api.ClQuotedForm;
import org.jetbrains.plugins.clojure.psi.api.symbols.ClSymbol;
import org.jetbrains.plugins.clojure.lexer.ClojureTokenTypes;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.NotNull;
import com.intellij.psi.PsiElement;
import com.intellij.psi.stubs.NamedStub;
import com.intellij.psi.stubs.IStubElementType;
import com.intellij.psi.impl.source.tree.LeafPsiElement;
import com.intellij.lang.ASTNode;
import org.jetbrains.plugins.clojure.psi.stubs.api.ClDefStub;
import java.util.List;
/**
* @author ilyas
*/
public abstract class ClListBaseImpl<T extends StubElement> extends ClojureBaseElementImpl<T> implements ClList, StubBasedPsiElement<T> {
public ClListBaseImpl(T stub, @NotNull IStubElementType nodeType) {
super(stub, nodeType);
}
public ClListBaseImpl(ASTNode node) {
super(node);
}
@Nullable
public String getPresentableText() {
final ClSymbol first = findChildByClass(ClSymbol.class);
if (first == null) return null;
final String text1 = getHeadText();
PsiElement next = PsiTreeUtil.getNextSiblingOfType(first, ClSymbol.class);
if (next == null) return text1;
else return text1 + " " + next.getText();
}
@Nullable
public String getHeadText() {
PsiElement first = getFirstNonLeafElement();
if (first == null) return null;
return first.getText();
}
@Nullable
public ClSymbol getFirstSymbol() {
PsiElement child = getFirstChild();
while (child instanceof LeafPsiElement) {
child = child.getNextSibling();
}
if (child instanceof ClSymbol) {
return (ClSymbol) child;
}
return null;
}
@NotNull
public PsiElement getFirstBrace() {
PsiElement element = findChildByType(ClojureTokenTypes.LEFT_PAREN);
assert element != null;
return element;
}
public PsiElement getSecondNonLeafElement() {
PsiElement first = getFirstChild();
while (first != null && isWrongElement(first)) {
first = first.getNextSibling();
}
if (first == null) {
return null;
}
PsiElement second = first.getNextSibling();
while (second != null && isWrongElement(second)) {
second = second.getNextSibling();
}
return second;
}
public PsiElement getLastBrace() {
return findChildByType(ClojureTokenTypes.RIGHT_PAREN);
}
}