エラーコード
通常、各エラーメッセージには E0123 のような一意のコードを割り当てるようにしています。
これらのコードは、各 crate にある diagnostics.rs ファイル内でコンパイラに定義されており、
基本的にはマクロで構成されています。
すべてのエラーコードには関連する説明があります。新しいエラーコードにはそれを含める必要があります。
すべての_歴史的な_(もはや出力されない)エラーコードに説明があるわけではないことに注意してください。
エラーの説明
説明は Markdown で書かれており(構文の詳細については CommonMark Spec を参照)、そのすべてが rustc_error_codes crate でリンクされています。
長いエラーコードをどのようにフォーマットし、記述するかの詳細については RFC 1567 を読んでください。
エラーの説明は、エラーメッセージを補足し、そのエラーが_なぜ_発生するのかについて詳細を提供するべきです。 ユーザーが即席の修正をコピー&ペーストできるだけでは役に立ちません。 説明は、ユーザーが自分のコードをコンパイラが受け入れられない理由を理解する助けになるべきです。 Rust は役に立つエラーメッセージを誇りとしており、長文形式の説明も例外ではありません。 ただし、エラーの説明が 全面的に見直される1までは、具体的にどのように書くべきかについてはやや未確定です。 いつものように、レビュー担当者に尋ねるか、Rust Zulip で周囲に尋ねてください。
新しいコードを割り当てる
エラーコードは compiler/rustc_error_codes に格納されています。
新しいエラーを作成するには、まず次に利用可能なコードを見つける必要があります。
それを見つけるには、rustc_error_codes/src/lib.rs を開き、
error_codes! マクロ宣言の末尾までスクロールします。
ここで、使用中の最も大きいエラーコードが E0805 であることがわかった場合、おそらく E0806 が必要になるでしょう。
確実にするために、rg E0806 を実行して確認してください。参照は見つからないはずです。
エラーに対する拡張説明を書く必要があり、
それは rustc_error_codes/src/error_codes/E0806.md に入ります。
エラーを登録するには、次のようにコードを(適切な数値順で)
error_codes! マクロに追加します。
#![allow(unused)]
fn main() {
macro_rules! error_codes {
...
0806,
}
}
実際にエラーを発行するには、struct_span_code_err! マクロを使用できます。
#![allow(unused)]
fn main() {
struct_span_code_err!(self.dcx(), // ここに `DiagCtxt` への何らかのパス
span, // ソース内の任意の span
E0806, // 新しいエラーコード
fluent::example::an_error_message)
.emit() // 実際にエラーを発行する
}
注記やその他のスニペットを追加したい場合は、.emit() を呼び出す前にメソッドを呼び出すことができます。
#![allow(unused)]
fn main() {
struct_span_code_err!(...)
.span_label(another_span, fluent::example::example_label)
.span_note(another_span, fluent::example::separate_note)
.emit()
}
エラーコードを追加する PR の例については、#76143 を参照してください。
エラーコードの doctest を実行する
rustc_error_codes/src/error_codes に追加された例をテストするには、次を使用して
エラーインデックスジェネレーターを実行します。
./x test ./src/tools/error_index_generator