我写的服务接收代码片段并处理它们,片段可以是补充程序或片段,如果是片段,我需要添加封闭的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")
}
我还尝试查看file
返回的ParseFile
,检查Decls
,但看起来它会在第一个错误后停止解析,所以Decls
是在这种情况下nil
。所以我的问题是有一种强有力的方法来解决这个问题吗?
PS。包含子句和所需的导入是不相关的,因为我将处理过的代码反馈到golang.org/x/tools/imports
。
答案 0 :(得分:0)
可能有用的最蠢的事情是在读取文件后(最有可能是缓冲区),是对func main(){
进行字符串搜索。
如果它尚未格式化,您可能需要将其更改为具有空格的正则表达式,但它应该非常简单。