如何使用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
相关产品推荐
相关产品推荐

