这是测试文件
func demo() {
name:=xxx()
fmt.Println(name)
}
我最后的穿越代码
ast.Inspect(f, func(node ast.Node) bool {
assign, ok := node.(*ast.AssignStmt) // find -> name:=xxx()
if !ok {
return true
}
if assign == nil {
return true
}
var expr = assign.Lhs[0]
fmt.Println(expr) // find -> name
fmt.Println(nodeString(assign,pass.Fset))
return true
})
我发现我必须像这样从上到下快速旅行。找到AssignStmt,然后得到AssignStmt-〉Lhs
但我需要先找到ast.Ident(name),然后在某些情况下再查找其父项是否为AssignStmt。
我不确定我是否有可能从下往上走。
2条答案
按热度按时间u91tlkcl1#
管理调用检查器时的祖先节点堆栈:
Run it on the playground.
tzdcorbm2#
我遇到了类似的问题,我需要找到它的兄弟姐妹之间的孩子的索引以及它的父节点。我找不到更接近的问题,所以我张贴在这里。
我将Cerise答案中的逻辑分离到一个函数中,并将答案的特定部分移到函数之外,这样更多的人可以利用这种通用形式,保存时间。
查找索引的逻辑类似于查找父节点,另一个数组用来跟踪索引序列到达当前节点就足够了,在每次调用时,n是
nil
,我们从序列中删除最后一项,并增加新的最后一项。看起来有更多的替代方法来寻找父母比日期问题的答案。一个是
astutil.Apply()
另一个是inspector.WithStack()
astutil.Apply()
与两个回调一起使用,一个在访问每个节点的子节点之前激发,另一个在访问每个节点的子节点之后激发;并接受Cursor
示例,该示例保存关于被访问节点的索引和父节点的详细信息。对于
WithStack
,存在一个detailed example