使用 Tree-sitter 解析 Protobuf 定义

主要观点:

  • 对于使用 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-sittergithub.com/smacker/go-tree-sitter/protobuf
  • 展示了如何在 Neovim 中使用InspectTreeEditQuery进行查询和可视化,以及如何编写具体的 Tree-sitter 查询来提取所需数据。
  • 给出了在 Go 代码中解析 protobuf 文件的函数ParseMessageGetMessageFields,包括创建解析器、执行查询、遍历匹配结果并构建数据结构等步骤。

重要细节:

  • GetMessageFields函数中,通过遍历查询匹配结果,根据不同的捕获名称获取消息名、字段名、字段类型、枚举名、枚举键和枚举值等信息,并进行相应的处理和存储。
  • queryTree函数用于启动 Tree-sitter 查询并创建查询游标。
  • 最终得到的Message结构体以 JSON 形式展示了提取的 protobuf 信息,可用于后续生成绑定或其他操作。
阅读 18
0 条评论