package sk.stuba.fiit.perconik.core.java.dom.traverse;
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.TreeTraverser;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.collect.Sets.newHashSet;
public final class CachedTraverser extends TreeTraverser<ASTNode> {
final Set<ASTNode> nodes;
final ListMultimap<ASTNode, ASTNode> children;
private CachedTraverser(@Nullable final ASTNode node) {
this.nodes = newHashSet();
this.children = LinkedListMultimap.create();
if (node != null) {
this.load(node);
}
}
private void load(final ASTNode node) {
final ASTVisitor visitor = new ASTVisitor(true) {
@Override
public void preVisit(final ASTNode node) {
CachedTraverser.this.nodes.add(node);
ASTNode parent = node.getParent();
if (parent != null) {
CachedTraverser.this.children.put(node.getParent(), node);
}
}
};
node.accept(visitor);
}
public static CachedTraverser create(@Nullable final ASTNode node) {
return new CachedTraverser(node);
}
@Override
public List<ASTNode> children(@Nullable final ASTNode node) {
checkArgument(this.nodes.contains(node));
return this.children.get(node);
}
}