主要观点:
- 对于使用 Protocol Buffers(protobuf)的工作,通常工具
protoc
虽支持插件生成各种输出,但自定义时有限,protoc-gen-gotemplate
虽好用但无法构建复杂逻辑,protoreflect
在 Go 中处理编译结果很痛苦。 - 在工作中,对 protobuf 定义的使用有限,维护自定义映射很浪费时间,希望有更自动可重复的解决方案。
- 介绍了如何利用 Tree-sitter 解析 protobuf 定义并提取所需信息,包括通过 Neovim 中的
InspectTree
可视化 AST,使用EditQuery
编写查询,以及在 Go 代码中与 Tree-sitter 交互来解析和处理 protobuf 文件,最终得到包含消息名、枚举信息和字段信息的Message
结构体。
关键信息:
- 提供了一个典型的 protobuf 消息定义示例,包含单个枚举类型和 4 个字段。
- 介绍了 Tree-sitter 的 Go 绑定及相关 protobuf 绑定,如
github.com/smacker/go-tree-sitter
和github.com/smacker/go-tree-sitter/protobuf
。 - 展示了如何在 Neovim 中使用
InspectTree
和EditQuery
进行查询和可视化,以及如何编写具体的 Tree-sitter 查询来提取所需数据。 - 给出了在 Go 代码中解析 protobuf 文件的函数
ParseMessage
和GetMessageFields
,包括创建解析器、执行查询、遍历匹配结果并构建数据结构等步骤。
重要细节:
- 在
GetMessageFields
函数中,通过遍历查询匹配结果,根据不同的捕获名称获取消息名、字段名、字段类型、枚举名、枚举键和枚举值等信息,并进行相应的处理和存储。 queryTree
函数用于启动 Tree-sitter 查询并创建查询游标。- 最终得到的
Message
结构体以 JSON 形式展示了提取的 protobuf 信息,可用于后续生成绑定或其他操作。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。