菜单

代码格式化器

相关源文件

Sway 代码格式化工具(swayfmt)是一个根据预定义样式指南自动格式化 Sway 源代码的工具,类似于 Rust 的 rustfmt。它为 Sway 项目提供一致、标准化的格式,并且可以通过配置文件进行自定义。本文档概述了代码格式化工具的架构和功能、其配置选项以及它如何与 Sway 生态系统集成。

架构

代码格式化工具的设计侧重于解析 Sway 源代码、根据样式规则对其进行转换以及保留注释和换行符。以下是格式化工具架构的高级概述:

图:代码格式化工具架构

来源

核心组件是 Formatter 结构体,它协调整个格式化过程。

图:关键格式化工具组件

来源

格式化流程

格式化工具遵循以下关键步骤来处理源代码:

  1. 解析:源代码被解析成 AST(抽象语法树)。
  2. 注释收集:提取注释并将其映射到其位置。
  3. AST 格式化:通过调用相应的 Format trait 实现,根据样式规则格式化每个 AST 节点。
  4. 注释插入:将注释重新插入到其适当的位置。
  5. 换行符处理:保留换行符序列(最多可配置的阈值)。
  6. 换行符样式应用:根据配置应用一致的换行符样式。

格式化逻辑的核心是通过 Format trait 实现的。

图:Format Trait 实现

来源

注释和空白字符处理

格式化工具最复杂的方面之一是在重新格式化代码的同时保留注释和空白字符。

图:注释和空白字符处理

来源

格式化工具支持几种类型的注释:

注释类型描述示例
新行注释前面带换行符的注释// This is a newlined comment
行尾注释行末注释let x = 5; // This is a trailing comment
行内注释位于标记之间的块注释fn foo(/* inlined comment */ x: u64)
多行注释跨越多行的块注释/* This is a\n multilined\n comment */

来源

配置选项

格式化工具可以通过在 Sway 项目根目录放置 swayfmt.toml 配置文件进行自定义。

空白字符配置

选项描述默认
max_width最大行宽100
tab_spaces制表符空格数4
newline_style换行符样式(AutoNativeUnixWindows汽车
newline_threshold最大连续换行符数2

结构体配置

选项描述默认
field_alignment结构体字段对齐关闭
small_structures_single_line将小型结构体格式化为单行false

field_alignment 选项可以设置为:

  • Off:无对齐
  • AlignFields(threshold):如果字段名长度低于阈值,则对齐字段冒号

字段对齐示例

// Without alignment (Off)
struct Example {
    short: u64,
    very_long_field_name: bool,
}

// With alignment (AlignFields(20))
struct Example {
    short          : u64,
    very_long_field_name: bool,
}

来源

特定构造的格式化规则

函数格式化

函数会进行适当的间距和缩进格式化。

pub fn example_function(
    param1: u64,
    param2: bool,
) -> bool {
    // Function body
    true
}

当函数包含 where 子句时,它会在新行上格式化。

pub fn generic_function<T>(param: T) -> T
where
    T: MyTrait,
{
    // Function body
    param
}

来源

控制流格式化

ifmatchwhilefor 等控制流构造会以一致的间距进行格式化。

if condition {
    // Then block
} else if another_condition {
    // Else-if block
} else {
    // Else block
}

match value {
    Pattern1 => expression1,
    Pattern2 => {
        // Block expression
        expression2
    },
}

来源

表达式格式化

表达式根据其复杂性进行格式化。格式化工具使用启发式方法来确定何时使用多行格式化。

// Short expressions on one line
let result = a + b;

// Complex expressions broken into multiple lines
let complex_result = very_long_expression()
    .method_call()
    .another_method_call();

来源

使用格式化工具

格式化工具可以通过两种方式使用:

  1. 通过 forc fmt:Fuel Orchestrator (forc) 提供了一个格式化命令。
  2. 通过编程方式:直接使用 Formatter 结构体。

用于编程使用

用于自定义配置

与语言服务器集成

该格式化工具已与 Sway 语言服务器协议(LSP)实现集成,为支持 LSP 的 IDE 和编辑器提供格式化功能。

图:格式化工具与 LSP 集成

当语言服务器接收到格式化请求时,它会使用 swayfmt 格式化工具对文档进行格式化,并将格式化后的文本返回给 IDE/编辑器。

结论

Sway 代码格式化工具提供了一种一致的、可配置的方法来格式化 Sway 代码。通过将格式化逻辑分离到不同的组件中,并为不同的 AST 节点实现 Format trait,它实现了模块化和可扩展的设计。凭借其保留注释和敏感处理空白字符的能力,它在强制执行一致风格的同时,保持了代码的语义意义和可读性。