go - 在 AST 中查找包引用

标签 go abstract-syntax-tree

我正在尝试使用 go/ast 包对 go 程序的某些部分执行源到源转换。我的目标之一是从带有风格化注释的接口(interface)定义中自动生成实现该接口(interface)的结构的定义。我有这个程序( https://github.com/MarkNahabedian/defimpl )工作,除了我目前的实现并不总是在输出文件中包含输出文件所需的输入文件中的那些包。
当前的实现在确定要导入的内容方面有点笨拙。相反,我正在尝试使用 ast.Walk 来查找包引用。我的明显假设是任何包引用都将显示为 ast.BinaryExpr 的 X 成员。通过检测生成此(人为测试)输出的代码

// This file was automatically generated by defimpl from c:\Users\Mark Nahabedian\go\src\defimpl\test\code.go.
package test

import "reflect"
import "defimpl/runtime"

type ThingImpl struct {
    node ast.Node
}

var _ Thing = (*ThingImpl)(nil)

func init() {
    inter := reflect.TypeOf(func(t Thing) {}).In(0)
    var impl *ThingImpl
    runtime.Register(inter, reflect.TypeOf(impl))
}

// Node is part of the Thing interface.
func (x *ThingImpl) Node() ast.Node {
    return x.node
}
我看到 AST 中没有 BinaryExpr 节点。我的问题是:“ast.Node”的 AST 节点类型是什么。
我希望 go/ast 包的文档在它定义的接口(interface)和结构类型之间提供了清晰的关联。

最佳答案

表达式 ast.Nodeselector表达。 go/ast 包表示带有 *ast.SelectorExpr 的表达式类型。
要了解语言特征在 go/ast 中是如何表示的,请使用该特征解析一个小程序并转储结果树。 spew package是一种方便的倒树工具。运行an example on the playground .

关于go - 在 AST 中查找包引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64320939/

相关文章:

尝试实现(复制)数据库/缓存查询场景时出现 Golang (GO) channel 问题

struct - 在 Go 中干净地实现结构的多级结构

firebase - Golang、Firebase...将 MAP 转换为结构 slice

go - 从 opentelemetry 的请求 header 中提取跟踪器的正确方法

mysql - 使用下划线从 golang 结构体访问 mysql 字段

c++ - clang:自定义属性在 AST 中不可见

static-analysis - 通过静态分析检测缺少 if/else 语句

java - Eclipse 从 .java 文件创建 CompilationUnit

javascript - 允许在客户端上编写的 JavaScript 在服务器上执行的最安全方法是什么?

java - 如何在 ANTLR 3 树解析器中表达多个节点