格式化代码的艺术 · mcyoung

主要观点:现代编程语言需要格式化工具使代码美观且一致,Go 从一开始就提供了格式化工具但存在不足,好的格式化需保留 AST(抽象语法树)的跨度、空白和排序信息等。
关键信息

  • Go 格式化工具不能强制最大列宽,2010 年代的 rustfmt 和 clang-format 提供了此功能。
  • AST 是程序语法的图形表示,JSON 的朴素 AST 存在问题,好的 AST 需保留跨度、空白和排序信息等。
  • 可通过递归打印 AST 实现简单格式化,但存在小列表处理问题,涉及列换行和宽度计算。
  • 很多格式化方法易导致二次复杂度,应设计模型指定行如何中断并跟踪布局信息。
  • 可借鉴 HTML DOM 设计代码的 DOM,包含各种标签用于处理文本、换行、缩进等,通过多遍算法确定布局和渲染。
  • YAML 有特殊列表语法,需在 DOM 中特殊处理,还可添加其他增强功能如单词换行等。
    重要细节
  • Rust 中通过#[derive(Debug)]递归打印结构体,格式化 JSON AST 时需处理各种情况,如小列表的特殊处理。
  • 计算字符串宽度需考虑 Unicode 字符、制表符等,不同语言和库可能有不同处理方式。
  • 设计代码的 DOM 时要考虑各种标签的作用,如<text><indent><group>等,通过多遍算法确定布局和渲染。
  • 示例代码展示了如何处理不同语言结构的格式化,如 C++的函数修饰符、YAML 的列表等。
  • 作者写了一个 Rust 库用于格式化,但未在 crates.io 上发布,认为布局算法简单可移植到其他语言。
阅读 7
0 条评论