gpt4 book ai didi

go - 解析片段并找到所有顶级定义

转载 作者:数据小太阳 更新时间:2023-10-29 03:27:13 25 4
gpt4 key购买 nike

我正在编写的服务接收代码片段并对其进行处理,这些片段可以是补充程序或片段,如果是片段,我需要添加封闭的 main 函数。例如,片段:

var v int
v = 3
fmt.Println(v)

应该归类为片段,并在其中添加main:

func main() {
var v int
v = 3
fmt.Println(v)
}

如果代码段是:

package main
import "fmt"
func main() {
fmt.Println("hello")
}

则不应进行任何修改。

我现在的做法是针对代码段运行 go 解析器:

var fset *token.FileSet
file, err := parser.ParseFile(fset, "stdin", code, 0)
if err != nil {
// add function
code = fmt.Sprintf("func main() {\n%s\n}", code)
// ...
}

这适用于上面的第一个代码片段,但是如果该片段在一些其他声明之后具有 main 函数,则它会失败,例如

type S struct {
a int
}
func main() {
fmt.Println("foo")
}

我也尝试查看 ParseFile 返回的 file,检查 Decls,但它看起来会在第 1 次后停止解析错误,所以 Decls 在这种情况下是 nil。所以我的问题是有没有一种可靠的方法来处理这个问题?

附言。包子句的包含和所需的导入是不相关的,因为我将处理后的代码提供给 golang.org/x/tools/imports 无论如何。

最佳答案

可能工作的最愚蠢的事情是在读入文件(最有可能是缓冲区)之后,对 func main(){ 进行字符串搜索。

如果它尚未格式化,您可能需要将其更改为带有空格的正则表达式,但它应该非常简单。

关于go - 解析片段并找到所有顶级定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37324215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com