# 診断

Kagari コンパイラの診断にはすべて番号付きのコードがあります。この部の各ページでは、コードごとに意味、それを発生させる最小のプログラム、直し方を示します。

## コード {#codes}

コードは 1 文字の英字と 4 桁の数字からなります（例: `E2001`）。

- `E` はエラー、`W` は警告です。警告は同じ検査のエラーと同じ番号帯を使うため、`W2039` は型エラーの間にあります。
- 先頭の数字は、それを報告する検査を表します。

| コード | 検査 | ページ |
| ----- | ----- | ---- |
| `E0xxx` | 構文 | [構文](syntax.md) |
| `E1xxx` | モジュール、アイテム、名前解決、アセット | [モジュール、アイテム、名前](modules.md) |
| `E2xxx`, `W2xxx` | 型、パターン、`match` の網羅性 | [型](types.md) |
| `E3xxx`, `W3xxx` | 種別: `fn`、`pushdown fn`、`const fn`、シーンの規則 | [種別](kinds.md) |
| `E4xxx` | 定数評価 | [定数評価](eval.md) |
| `E5xxx`, `W5xxx` | 物語の解析 | [物語の解析](analysis.md) |
| `E6xxx`, `W6xxx` | ゲームシステムの検査 | [ゲームシステム](system.md) |
| `E7xxx` | バイトコード生成 | [生成](emit.md) |

## 重大度 {#severity}

- **エラー**はビルドを止めます。エラーが残っている間、`kagari build` は `.kagari` ファイルを書き出さず、`kagari check` は 0 以外の終了ステータスで終了します。
- **警告**は、おそらく誤りであるもの（到達しない `match` アーム、捨てられた `#[must_use]` の値、到達しないシーンなど）を報告します。ビルドは成功します。

## 出力形式 {#output-format}

`kagari check` と `kagari build` は、各診断を 1 行で表示します。

```text
path:line:col: error[E2001]: message
```

警告の場合は `warning[W2039]` になります。行と列は 1 始まりで、列はバイトではなく文字単位で数えます。パスはプロジェクトディレクトリからの相対パスです。診断が別の場所にも言及する場合は、字下げした注記行が続きます。

```text
src/main.kis:2:4: error[E1014]: message
  note: src/main.kis:1:4: message
```

報告するものがなければ、`kagari check` は `no diagnostics` と表示します。言語サーバーもエディター上で同じコードとメッセージの診断を表示します。

## コードの調べ方 {#looking-a-code-up}

各コードには、小文字のコードをアンカーとする見出しがあります。`E2001` を調べるには [`types.md#e2001`](types.md#e2001) を開きます。一般に、ページはコードの先頭の数字に対応するもの（上の表を参照）で、アンカーは `#` に小文字のコードを続けたもの（例: `#w5009`）です。
