如何编写代码格式化程序

主要观点:

  • 询问 10 位开发者关于代码格式的意见会得到 10 种不同观点,且这些意见多基于主观喜好而非事实。
  • 代码格式化器可让计算机决定代码格式,避免人工争论,如 Go 的 gofmt 推动了代码格式化器的使用。
  • 介绍了多种流行的代码格式化器及其首次引入时间。
  • 详细阐述了构建代码格式化器的步骤,包括节点和树的定义、宽度计算、包裹需求跟踪、AST 转换为格式化树等。
  • 以 Inko 语言为例展示了如何编写代码格式化器,并给出了实际应用的示例和相关资源。

关键信息:

  • 不同语言的代码格式化器及引入时间,如 Python 的 autopep8(2010)、Go 的 gofmt(2013)等。
  • 节点和树的定义,如 Text、Unicode、SpaceOrLine 等节点,以及通过 sum 类型创建树。
  • 宽度计算方法,根据节点类型计算宽度,考虑包裹需求。
  • 包裹需求跟踪使用 Wrap 枚举。
  • 引入 Generator 和 Builder 类型进行 AST 到格式化树的转换。
  • 实际应用示例展示了如何使用代码格式化器处理不同情况。

重要细节:

  • Inko 中定义枚举的方式,如 class enum Letter { case A case B case C }
  • 构造 Unicode 节点的辅助方法 Node.unicode(value: String)
  • 计算节点宽度的递归算法,根据不同节点类型处理。
  • 在处理 Group 节点时计算宽度并判断是否需要包裹。
  • Generator 类型的各个字段及相关方法,如生成字符串、处理不同节点等。
  • Builder 类型用于访问 AST 并转换为 Node 值,支持简单函数调用等。
  • 实际应用中处理 (trailing) 注释的步骤及示例代码。
  • 代码示例可在https://github.com/yorickpeterse/code-formatting-in-inko获取,需使用 Inko 的main分支。
阅读 13
0 条评论