package org.jetbrains.plugins.clojure.psi.impl;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.Condition;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.clojure.lexer.ClojureTokenTypes;
import org.jetbrains.plugins.clojure.psi.ClojurePsiElement;
import org.jetbrains.plugins.clojure.psi.ClojurePsiElementImpl;
import org.jetbrains.plugins.clojure.psi.api.ClKeyword;
import org.jetbrains.plugins.clojure.psi.api.ClMap;
import java.util.Arrays;
import java.util.List;
/**
* @author ilyas
*/
public class ClMapImpl extends ClojurePsiElementImpl implements ClMap {
public ClMapImpl(ASTNode node) {
super(node);
}
@Override
public String toString() {
return "ClMap";
}
@NotNull
public PsiElement getFirstBrace() {
PsiElement element = findChildByType(ClojureTokenTypes.LEFT_CURLY);
assert element != null;
return element;
}
public PsiElement getLastBrace() {
return findChildByType(ClojureTokenTypes.RIGHT_CURLY);
}
public List<ClMapEntry> getEntries() {
return Arrays.asList(findChildrenByClass(ClMapEntry.class));
}
public ClojurePsiElement getValue(final String key) {
final ClMapEntry entry = ContainerUtil.find(getEntries(), new Condition<ClMapEntry>() {
public boolean value(ClMapEntry clMapEntry) {
final ClKeyword clKeyword = clMapEntry.getKeywordKey();
if (clKeyword == null) return false;
final String text = StringUtil.trimStart(clKeyword.getText(), ":");
return text.equals(key);
}
});
if (entry == null) return null;
return entry.getValue();
}
}