マッチ式の末尾にカンマで終わるコメントがあるとrustfmtがフォーマットに失敗する話

業務で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として報告した。