# 画面設計書 8-nim check（構文チェック）

## 概要

本ドキュメントは、Nimソースコードの構文・型チェックのみを実行するサブコマンド`nim check`のCLIインターフェース設計書です。

### 本画面の処理概要

`nim check`コマンドは、Nimソースコードのコンパイルを行わずに構文解析と型チェックのみを実行するサブコマンドです。コード生成やバイナリ生成を行わないため、高速にエラーチェックを行うことができ、IDE連携やCI/CDパイプラインでのプリチェックに適しています。

**業務上の目的・背景**：コンパイル時間を短縮しつつ、コードの構文エラーや型エラーを早期に検出します。コード生成フェーズをスキップするため、フルコンパイルと比較して大幅に高速な検証が可能です。

**画面へのアクセス方法**：ターミナルから`nim check <filename.nim>`を実行します。

**主要な操作・処理内容**：
1. ソースファイルの読み込み
2. 字句解析（レキサー処理）
3. 構文解析（パーサー処理）
4. 意味解析（セマンティック処理）
5. 型チェックと名前解決
6. エラー/警告の報告

**画面遷移**：
- 入力元：`nim`メインコマンドから`cmdCheck`として呼び出し
- 遷移先：なし（チェック完了後終了）

**権限による表示制御**：OSのファイルシステム権限に依存。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 2 | レキサー（字句解析） | 補助機能 | ソースコードの字句解析のみ実行 |
| 3 | パーサー（構文解析） | 補助機能 | 構文解析のみ実行 |
| 4 | セマンティック解析 | 主機能 | 型チェック・名前解決をコンパイルせずに実行 |

## 画面種別

CLIサブコマンド（構文チェック）

## URL/ルーティング

```
nim check [options] <projectfile.nim>
```

オプション例：
- `nim check hello.nim` - 構文・型チェック
- `nim check --backend:js hello.nim` - JSバックエンドとしてチェック
- `nim check --styleCheck:hint hello.nim` - スタイルチェック付き

## 入出力項目

| 項目名 | 型 | 入力/出力 | 必須 | 説明 |
|--------|-----|----------|------|------|
| projectfile | string | 入力 | はい | チェック対象のNimソースファイル |
| --backend:TYPE | enum | 入力 | いいえ | ターゲットバックエンド（c/js） |
| --styleCheck | enum | 入力 | いいえ | スタイルチェックレベル |
| 標準出力 | text | 出力 | - | ヒント・警告 |
| 標準エラー | text | 出力 | - | エラー出力 |
| 終了コード | int | 出力 | - | 0:成功、1:エラー |

## 表示項目

| 項目 | 説明 | 表示条件 |
|------|------|----------|
| エラーメッセージ | 構文/型エラーの詳細 | エラー発生時 |
| 警告メッセージ | 警告レベルの問題 | 警告発生時 |
| ヒントメッセージ | 情報レベルのメッセージ | ヒント有効時 |
| 成功メッセージ | チェック成功 | エラーなし時 |

## イベント仕様

### 1-コマンド処理開始

`commands.nim`で`"check"`を`cmdCheck`にマップ（行482）：

1. `parseCommand("check")` -> `cmdCheck`
2. 設定とオプションの初期化

### 2-commandCheck実行

`main.nim`の`commandCheck`関数（行88-98）で処理：

```nim
proc commandCheck(graph: ModuleGraph) =
  let conf = graph.config
  conf.setErrorMaxHighMaybe
  defineSymbol(conf.symbols, "nimcheck")
  if optWasNimscript in conf.globalOptions:
    defineSymbol(conf.symbols, "nimscript")
    defineSymbol(conf.symbols, "nimconfig")
  elif conf.backend == backendJs:
    setTarget(conf.target, osJS, cpuJS)
  setPipeLinePass(graph, SemPass)
  compilePipelineProject(graph)
```

### 3-シンボル定義

チェックモード専用のシンボルを定義：
- **行91**: `defineSymbol("nimcheck")` - nim checkモードを示す
- **行92-94**: NimScript由来の場合は`nimscript`と`nimconfig`を定義
- **行95-96**: JSバックエンドの場合はターゲットをJS向けに設定

### 4-セマンティック解析パイプライン

- **行97**: `setPipeLinePass(graph, SemPass)` - コード生成をスキップしセマンティック解析のみ
- **行98**: `compilePipelineProject(graph)` - プロジェクトをコンパイルパイプラインで処理

### 5-ファイル操作のスキップ

`scriptconfig.nim`の各種コールバックで`cmdCheck`の場合はファイル操作をスキップ：
- **行70**: `listFilesImpl` - ファイル一覧取得をスキップ
- **行75**: `listDirsImpl` - ディレクトリ一覧取得をスキップ
- **行90, 95, 100, 105**: `removeDir`, `removeFile`, `createDir` - 削除/作成をスキップ
- **行115**: `rawExec` - 外部コマンド実行をスキップ

## データベース更新仕様

本CLIツールはデータベースを使用しません。

### ファイルシステム操作

| 操作 | 対象 | 種別 | 概要 |
|------|------|------|------|
| チェック | *.nim | READ | Nimソースファイル読み込み |
| 出力 | nimcache/* | WRITE | キャッシュファイル（_check拡張子） |

## メッセージ仕様

| メッセージ種別 | メッセージ | 発生条件 |
|---------------|----------|----------|
| エラー | "undeclared identifier: '$1'" | 未定義の識別子参照 |
| エラー | "type mismatch: got <$1> but expected <$2>" | 型の不一致 |
| エラー | "syntax error" | 構文エラー |
| 警告 | "XDeclaredButNotUsed" | 未使用の宣言 |
| ヒント | "Success" | チェック成功時 |

## 例外処理

| 状態 | エラーメッセージ | 処理 |
|------|-----------------|------|
| ソースファイル不在 | "cannot open file: $1" | エラー終了 |
| 構文エラー | パースエラーメッセージ | エラー終了 |
| 型エラー | 型チェックエラーメッセージ | エラー終了 |

## 備考

- コード生成をスキップするため、フルコンパイルより大幅に高速
- `nimcheck`シンボルで条件分岐可能（`when defined(nimcheck):`）
- `--backend:js`でJavaScriptターゲットとしてチェック可能
- `nimcache`ディレクトリに`_check`拡張子でキャッシュ保存（options.nim 行824）
- IDE連携（nimsuggest）でも同様のチェックモードが使用される
- `cmdCheck`時はNimScriptのファイル操作系コールバックが無効化される

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | options.nim | `compiler/options.nim` | cmdCheck（Command列挙型行157） |
| 1-2 | options.nim | `compiler/options.nim` | _check拡張子の設定（行824） |

**読解のコツ**: `cmdCheck`はコード生成をスキップするコマンドモード。nimcacheの拡張子が`_check`となる点に注目。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | commands.nim | `compiler/commands.nim` | parseCommand "check" -> cmdCheck（行482） |
| 2-2 | main.nim | `compiler/main.nim` | cmdCheckケース（行416-417） |

**主要処理フロー**:
1. **commands.nim 行482**: `"check"` -> `cmdCheck`
2. **main.nim 行416-417**: `of cmdCheck: commandCheck(graph)`

#### Step 3: チェック処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | main.nim | `compiler/main.nim` | commandCheck関数（行88-98） |

**主要処理フロー**:
- **行90**: `conf.setErrorMaxHighMaybe` - エラー上限設定
- **行91**: `defineSymbol("nimcheck")` - checkモードシンボル定義
- **行97**: `setPipeLinePass(graph, SemPass)` - セマンティック解析のみ設定
- **行98**: `compilePipelineProject(graph)` - プロジェクトのコンパイル

#### Step 4: ファイル操作スキップを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | scriptconfig.nim | `compiler/scriptconfig.nim` | cmdCheck時のスキップ処理（行70-191） |

**主要処理フロー**:
- 各コールバック内で`graph.config.cmd == cmdCheck`の場合、実際の操作をスキップ
- ファイル操作、ディレクトリ操作、外部コマンド実行が対象

### プログラム呼び出し階層図

```
nim.nim::handleCmdLine()
    │
    ├─ mainCommand()
    │      │
    │      └─ case cmdCheck
    │             │
    │             └─ commandCheck(graph)
    │                    │
    │                    ├─ conf.setErrorMaxHighMaybe()
    │                    │
    │                    ├─ defineSymbol("nimcheck")
    │                    │
    │                    ├─ [if NimScript] defineSymbol("nimscript")
    │                    │
    │                    ├─ [if JS backend] setTarget(osJS, cpuJS)
    │                    │
    │                    ├─ setPipeLinePass(SemPass)  # コード生成スキップ
    │                    │
    │                    └─ compilePipelineProject()
    │                           │
    │                           ├─ レキサー処理
    │                           │
    │                           ├─ パーサー処理
    │                           │
    │                           └─ セマンティック解析
    │                                  │
    │                                  ├─ 型チェック
    │                                  │
    │                                  ├─ 名前解決
    │                                  │
    │                                  └─ エラー/警告報告
    │
    └─ genSuccessX()  # 成功時のみ
```

### データフロー図

```
[入力]                      [処理]                           [出力]

*.nim ───▶ レキサー ───▶ トークン列
                 │
                 ▼
トークン列 ───▶ パーサー ───▶ AST
                 │
                 ▼
AST ───▶ セマンティック解析 ───▶ 型チェック済みAST
                 │
                 ├─ エラー → 標準エラー出力
                 │
                 ├─ 警告 → 標準出力
                 │
                 └─ 成功 → "Success" メッセージ

[注意] コード生成フェーズはスキップ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| main.nim | `compiler/main.nim` | ソース | commandCheck関数（行88-98）、cmdCheckケース（行416-417） |
| commands.nim | `compiler/commands.nim` | ソース | parseCommand "check" -> cmdCheck（行482） |
| options.nim | `compiler/options.nim` | ソース | cmdCheck定義（行157）、_check拡張子（行824） |
| scriptconfig.nim | `compiler/scriptconfig.nim` | ソース | cmdCheck時のファイル操作スキップ |
| msgs.nim | `compiler/msgs.nim` | ソース | cmdCheck時のエラー出力制御（行648） |
| semtypes.nim | `compiler/semtypes.nim` | ソース | cmdCheck時の型チェック特殊処理（行2486） |
