-
Go ast.CommentMap 不是按注释语义做绑定,而是依据源码位置、空行和重要节点边界选择关联对象。本文解释注释落到外层声明的原因,并说明 AST 改写时如何同步更新映射。
-
用 go/types 对完成类型检查的 Package 取出 Scope,按稳定顺序列出包级对象,再用 Object.Exported 和 Lookup 过滤并读取导出 API 的类型信息。
-
围绕 Go ast.CommentMap 讲清删除声明后的注释过滤、节点替换时的 Update 迁移,以及 ParseComments、Filter 和 format.Node 的配合边界。
-
Go types.Package.Imports 返回的是当前包的直接导入列表,不是完整传递依赖闭包。本文解释源码顺序、export data 例外,以及如何递归遍历并按包路径去重收集传递依赖。
-
Go Package.Complete 描述包元数据完整状态,不能脱离来源当作当前源码无类型错误的证明。本文区分 Config.Check、错误回调与 MarkComplete,并给出调用方状态设计示例。
-
Go 自建 types.Package 时,NewPackage 得到的对象默认还不完整。本文按包作用域、导入列表和完成门禁拆开说明 MarkComplete 与 Complete 的职责,避免过早标记导致后续分析拿到不完整包信息。
-
Go types.Package.Imports 返回包的直接导入依赖,并保持源码顺序。本文从已有的 *types.Package 出发,用包路径去重递归构建依赖图,再说明 export data 与源码 ImportSpec 的边界。
-
Go types.Package.Path 表示包路径,Name 表示声明名,两者不能互相替代。本文从同名包索引覆盖场景出发,用示例区分本地导入别名,并说明代码生成与缓存的处理边界。
-
Go 静态分析里,TypeAndValue.IsNil 判断的是当前 AST 表达式是否指向预声明 nil,而不是运行时指针是否为空。本文用 types.Info.Types 拆解 nil、(*int)(nil) 和 p == nil 的节点边界,并说明 Type、Value 与 IsNil 的分工。
-
go/types 的 TypeAndValue 同时保存表达式类型与常量值,但 IsType 和 IsValue 判断的是不同语义。本文结合常量、变量、nil、类型转换和内建函数标识符,说明静态分析时怎样组合这些方法。
-
通过 go/types.Info.Types 读取 TypeAndValue.HasOk,区分 map 索引、类型断言、channel 接收与普通表达式的 comma-ok 边界。
-
Go TypeAndValue.Addressable 可识别表达式的可寻址属性。本文用变量、切片索引和 map 索引示例说明 Types 的读取方法,并区分可赋值、复合字面量例外及运行时安全。
-
go/types.Info.Types 里的 TypeAndValue 同时描述表达式类型和常量值。Value 为 nil 通常只说明表达式不是编译期常量,并不表示 Type 缺失。本文用 AST 分析示例区分 Type、Value、IsValue 和 IsNil。
-
使用 go/types 分析表达式时,Info.Types 会把常量表达式记录成 TypeAndValue。本文从最小类型检查流程开始,说明怎样读取 go/constant.Value,区分常量与非常量,并避免用 float64 或普通字符串破坏精度。
-
go/types 的 Initializer.Rhs 本身是 ast.Expr,不直接携带可复制的源码字符串。本文说明如何从 Info.InitOrder 取得包级初始化项,用 types.ExprString 得到规范表达式,再用 token.File 的位置偏移恢复源文件中的原文。