You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用x/tools/go/analysis保留/分析代码注释

Go Analysis框架保留AST注释的解决方案

默认情况下,go/analysis框架的解析流程会忽略注释以提升性能,所以直接通过pass.Files拿到的AST不包含注释。要保留注释,需要在Analyzer的Run函数中手动调整解析逻辑:

  • 重新解析源码并保留注释
    不要直接使用框架传入的已解析AST,而是读取原文件内容,用带parser.ParseComments选项的解析器重新解析:

    func (a *Analyzer) Run(pass *analysis.Pass) (interface{}, error) {
        for _, f := range pass.Files {
            // 获取当前文件路径
            filePath := pass.Fset.File(f.Pos()).Name()
            // 读取文件源码
            srcBytes, err := os.ReadFile(filePath)
            if err != nil {
                return nil, err
            }
            // 配置解析模式,开启注释保留
            parseMode := parser.ParseComments
            // 重新解析得到带注释的AST
            astWithComments, err := parser.ParseFile(pass.Fset, filePath, srcBytes, parseMode)
            if err != nil {
                return nil, err
            }
            // 此时astWithComments.Comments可直接访问所有注释
            // 执行你的分析逻辑...
        }
        return nil, nil
    }
    
  • 关联注释与AST节点
    若需要将注释和对应的AST节点绑定,使用ast.NewCommentMap生成映射关系:

    // 生成注释与节点的映射
    commentMap := ast.NewCommentMap(pass.Fset, astWithComments, astWithComments.Comments)
    // 获取某个节点关联的注释集合
    // targetNodeComments := commentMap[targetASTNode]
    
  • 性能与兼容性注意

    • 重新解析会增加额外性能开销,处理大量文件时需权衡功能与性能。
    • 不要修改pass.Files中的原始AST,避免影响其他Analyzer的正常运行。

内容的提问来源于stack exchange,提问作者thunder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:30:42