主要观点:
- 询问 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
分支。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。