業務でRustのコードを書いていて、rustfmt
が失敗する事象に遭遇した。
少し調べたところ、MatchArmsの後にカンマを含むコメントがあると、うまく動かないことが分かった。
以下は2つの連続した改行が1つの改行に詰められることを期待したコードである。rustfmt
はマッチ式全体のフォーマットを諦めてしまう。
fn f() {
let x = 0;
match x {
0 => {}
1 => {}
_ => {}
// foo
// bar,
}
}
尚、マッチ式の外のフォーマットは継続される。ファイル全体がフォーマットされなくなったりはしない。
おそらく、コメント中のカンマとMatchArms中のExpressionに対応するカンマの区別が出来ず、混乱していると思われる。
いくらか恐ろしいのは、rustfmt
は上記のコードについてフォーマットが失敗したことを一切エラーとして報告しないことだ。フォーマットに失敗するコードがCIの際に検知されず、デプロイまで素通りしてしまう恐れがある。
マッチ式の途中に意図的に空白だけの行を配置する等の手段でエラーとして報告させることはできる。その場合はerror[internal]: left behind trailing whitespace
として報告される。フォーマット後のバリデーションチェックで(rustfmt
自身の)エラーチェックを行っているものと思われる。
この事象はGitHubでIssueとして報告した。