Descriptionthe AST walker currently provides no way to find out how the
nodes in the tree are nested with respect to one another.
a simple change to the Visitor interface makes it possible
to do this (for example to maintain a current node-depth, or a
knowledge of the name of the current function).
Visit(nil) is called at the end of a node's children;
this make possible the channel-based interface below,
amongst other possibilities.
It is still just as simple to get the original behaviour - just
return the same Visitor from Visit.
Here are a couple of possible Visitor types.
// closure-based
type FVisitor func(n interface{}) FVisitor
func (f FVisitor) Visit(n interface{}) Visitor {
return f(n);
}
// channel-based
type CVisitor chan Visit;
type Visit struct {
node interface{};
reply chan CVisitor;
};
func (v CVisitor) Visit(n interface{}) Visitor
{
if n == nil {
close(v);
} else {
reply := make(chan CVisitor);
v <- Visit{n, reply};
r := <-reply;
if r == nil {
return nil;
}
return r;
}
return nil;
}
Patch Set 1 #Patch Set 2 : code review 166047: the AST walker currently provides no way to find out how the #Patch Set 3 : code review 166047: the AST walker currently provides no way to find out how the #Patch Set 4 : code review 166047: the AST walker currently provides no way to find out how the #
Total comments: 7
Patch Set 5 : code review 166047: the AST walker currently provides no way to find out how the #Patch Set 6 : code review 166047: the AST walker currently provides no way to find out how the #Patch Set 7 : code review 166047: the AST walker currently provides no way to find out how the #
Total comments: 1
MessagesTotal messages: 8
|