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

时间:2016-05-19 13:09:43

标签: go

我写的服务接收代码片段并处理它们,片段可以是补充程序或片段,如果是片段,我需要添加封闭的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

1 个答案:

答案 0 :(得分:0)

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

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