Golang Go语言中ast生成函数时,函数的注释跟函数关联不起来(生成的位置有误),有大佬帮忙解答一下吗?

发布于 1周前 作者 nodeper 来自 Go语言

stackoverflow 地址: https://stackoverflow.com/questions/76947041/code-generation-in-golang-using-the-go-ast-package-to-add-doc-comments-but-comm

当我在 errrmsg 目录中执行 GO GENERATE 时,函数的注释不在正确的位置

// Code generated by gen_code. DO NOT EDIT.
// 提示内容:"成功"
// 状态码:10000
// 提示内容:"失败"
// 状态码:10001

package errmsg

const ( TypeCodeSuccess = 10000 TypeCodeFailed = 10001 )

func GetSuccess() Resp { return Resp{Code: TypeCodeSuccess, Msg: TypeMsgSuccess} }

func GetFailed() Resp { return Resp{Code: TypeCodeFailed, Msg: TypeMsgFailed} }

这是我的代码地址: https://github.com/KingPuiWong/generrcode/blob/master/gencode/main.go

当我试着这样做,但还是不起作用时,你知道怎么解决它吗?谢谢。

    commentMap := ast.NewCommentMap(fset, file, file.Comments)
    ast.Inspect(file, func(node ast.Node) bool {
        switch x := node.(type) {
        case *ast.FuncDecl:
            if strings.HasPrefix(x.Name.Name, "Get") {
                commentText := x.Doc.List[0].Text
                fmt.Println()
                fmt.Printf("comment:%s", commentText)
                commentMap[x] = []*ast.CommentGroup{{List: []*ast.Comment{{Text: commentText, Slash: token.Pos(int(x.Pos() - 1))}}}}
            }
        }
        return true
    })
ast.Print(fset, file)
//os.Exit(1)
// 保存已分配的错误码
err = saveLastErrorCode(projectName, lastCode)
if err != nil {
    return err
    }

这是我想要生成的。

// Code generated by gen_code. DO NOT EDIT.
package errmsg

const ( TypeCodeSuccess = 10000 TypeCodeFailed = 10001 )

// 提示内容:“成功” // 状态码:10000 func GetSuccess() Resp { return Resp{Code: TypeCodeSuccess, Msg: TypeMsgSuccess} }

// 提示内容:“失败” // 状态码:10001 func GetFailed() Resp { return Resp{Code: TypeCodeFailed, Msg: TypeMsgFailed} }


Golang Go语言中ast生成函数时,函数的注释跟函数关联不起来(生成的位置有误),有大佬帮忙解答一下吗?

更多关于Golang Go语言中ast生成函数时,函数的注释跟函数关联不起来(生成的位置有误),有大佬帮忙解答一下吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

10 回复

代码生成推荐用 text/template ,舒服多了

更多关于Golang Go语言中ast生成函数时,函数的注释跟函数关联不起来(生成的位置有误),有大佬帮忙解答一下吗?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


ast 包一般都拿来读的,第一次见到写的。
代码生成用 text/template 或者 jennifer 。

感觉 pos 位置计算有点问题,int(x.Pos() - 1) 可能不是前一行。

pos 的定义可参考这里 https://chai2010.cn/go-ast-book/ch1/index.html 的 1.5 Position 位置信息

https://go.dev/talks/2015/gofmt-en.slide#14 gofmt 的作者介绍过 comments 的处理,不知道对你是否有用。



谢谢,想先学习一下如何用 ast 直接生成,然后再写一个用 text/template 生成的

晚上回去试一下,但是我猜测大概率不会是这个问题

改成 x.post() 也是一样的效果

可以试试 github.com/dave/dst ,注释友好,用法与 ast 差不多

在Go语言中,使用go/astgo/parser包来解析和生成代码时,确实可能会遇到函数注释与函数体关联不正确的问题。这通常是由于注释的位置处理不当或生成代码的逻辑有误。

首先,要确保注释是紧跟在函数声明之前的。在Go的源码中,注释通常被视为独立的节点,并不直接附属于函数声明。因此,在生成AST时,需要手动管理注释与函数声明的相对位置。

其次,检查生成代码的逻辑。在将AST转换回源码时,使用go/format包可以帮助保留注释和其他源码格式。特别是format.Node函数,它能够将AST格式化为符合Go语言规范的源码,同时尝试保留原有的注释位置。

如果注释仍然与函数关联不起来,可能需要更精细地控制注释的插入位置。一种方法是,在生成函数声明节点之前,先插入一个注释节点。这可以通过构建一个新的AST节点列表来实现,其中注释节点紧跟在函数声明之前。

最后,如果问题依旧存在,建议详细检查AST的结构,确保注释节点和函数声明节点的父子关系或兄弟关系正确无误。此外,查阅Go语言的官方文档和社区提供的资源,如Stack Overflow和GitHub上的相关讨论,也能提供额外的帮助和见解。

希望这些建议能帮助你解决函数注释与函数关联不起来的问题。

回到顶部