【问题标题】:Finding package references in an AST在 AST 中查找包引用
【发布时间】:2020-10-12 15:38:07
【问题描述】:

我正在尝试使用 go/ast 包对 go 程序的某些部分执行源到源转换。我的目标之一是从具有程式化 cmets 的接口定义中自动生成,即实现该接口的结构的定义。我有这个程序 (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 包的文档提供接口和它定义的结构类型之间的明确关联。

【问题讨论】:

    标签: go abstract-syntax-tree


    【解决方案1】:

    表达式ast.Nodeselector 表达式。 go/ast 包代表*ast.SelectorExpr 类型的表达式。

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

    【讨论】:

    • 非常感谢。这就是我最终要做的事情。
    • 当我开始着手进行这项更改时,我记得“select”与我想要的内容有关,但发现 SelectStmt 与渠道有关,并没有进一步查看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多