# 通知設計書 103-hintConf

## 概要

本ドキュメントは、Nimコンパイラの`hintConf`ヒント通知に関する設計を定義する。このヒントは、使用された設定ファイルを通知するものである。

### 本通知の処理概要

`hintConf`ヒントは、Nimコンパイラがコンパイル時に読み込んだ設定ファイル（`.cfg`ファイルや`.nims`スクリプト）のパスを開発者に通知するヒントメッセージである。

**業務上の目的・背景**：Nimコンパイラは複数の設定ファイルを階層的に読み込む（システム設定、ユーザー設定、プロジェクト設定など）。この通知により、開発者は実際にどの設定ファイルが読み込まれたかを把握でき、設定の問題をデバッグしやすくなる。特に複数の設定ファイルが存在する環境や、設定の優先順位を理解する際に重要である。

**通知の送信タイミング**：設定ファイルのロード処理完了後、コンパイル処理の初期段階で送信される。具体的には`loadConfigs`関数内の`showHintConf`テンプレートで、すべての設定ファイルを読み込んだ後に一括して出力される。

**通知の受信者**：コンパイル実行者（開発者）がコンソール出力（stderr）を通じてこの通知を受信する。

**通知内容の概要**：「used config file '$1'」という形式で、$1に設定ファイルの絶対パスが代入される。

**期待されるアクション**：開発者は読み込まれた設定ファイルを確認し、意図しない設定ファイルが読み込まれていないか、または必要な設定ファイルが読み込まれているかを検証する。

## 通知種別

コンソール出力（コンパイラヒント）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（コンパイルプロセス内で即時出力） |
| 優先度 | 低（ヒント情報） |
| リトライ | 無し |

### 送信先決定ロジック

標準エラー出力（stderr）に送信される。`--stdout`オプションが指定されている場合は標準出力（stdout）に送信される。`writelnHook`が設定されている場合は、そのフック関数に委譲される。

## 通知テンプレート

### コンソール出力の場合

| 項目 | 内容 |
|-----|------|
| メッセージ種別 | Hint |
| フォーマット | `Hint: used config file '{パス}' [Conf]` |
| 色 | 緑色（HintColor = fgGreen） |

### 本文テンプレート

```
Hint: used config file '/path/to/nim.cfg' [Conf]
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| $1 | 設定ファイルのパス | conf.configFiles配列 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| コンパイル処理 | 設定ファイルロード完了 | `hintConf in conf.mainPackageNotes` | すべての設定ファイルをロードした後 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| hintConf not in mainPackageNotes | hintConfはmainPackageNotes経由でチェックされる |
| optHints not in conf.options | ヒント出力自体が無効化されている場合 |
| verbosity = 0 | NotesVerbosity[0]から除外されている |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[loadConfigs開始] --> B[システム設定読み込み]
    B --> C[ユーザー設定読み込み]
    C --> D[親ディレクトリ設定読み込み]
    D --> E[プロジェクト設定読み込み]
    E --> F[NimScript実行]
    F --> G[showHintConf呼び出し]
    G --> H{各configFile}
    H --> I[rawMessage hintConf]
    I --> J{次のファイルあり?}
    J -->|Yes| H
    J -->|No| K[終了]
```

## データベース参照・更新仕様

該当なし（ファイルシステムやデータベースへのアクセスなし）

### 参照データ

| データ | 用途 | 備考 |
|--------|------|------|
| conf.configFiles | 読み込まれた設定ファイルのリスト | AbsoluteFileの配列 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 該当なし | このヒントは情報出力のみ | - |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 制限なし | 設定ファイルの数だけ出力 |

### 配信時間帯

制限なし（コンパイル実行時に即時出力）

## セキュリティ考慮事項

- 設定ファイルのパスにはユーザー名などのシステム情報が含まれる可能性がある
- CI/CDログに出力される場合、システムパス情報が漏洩する可能性に注意

## 備考

- hasHint関数で特別処理されており、mainPackageNotes経由でチェックされる
- 設定ファイルの読み込み順序は：システム → ユーザー → 親ディレクトリ → プロジェクト
- `.cfg`ファイルと`.nims`スクリプトの両方がこのヒントの対象

---

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

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

### 推奨読解順序

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

通知種別の定義と設定ファイル管理の仕組みを理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | lineinfos.nim | `compiler/lineinfos.nim` | TMsgKind列挙型でhintConfの定義を確認（109行目） |
| 1-2 | lineinfos.nim | `compiler/lineinfos.nim` | MsgKindToStr配列でメッセージ文字列を確認（226行目） |
| 1-3 | options.nim | `compiler/options.nim` | hasHint関数でhintConfの特別処理を確認（486-493行目） |

**読解のコツ**: hintConfはhasHint関数内で特別処理されており、通常のnotesではなくmainPackageNotesでチェックされる点に注意。

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

設定ファイルロード処理の起点を特定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | nimconf.nim | `compiler/nimconf.nim` | loadConfigs関数（247行目〜）で設定ファイル読み込みの全体像を理解 |
| 2-2 | nimconf.nim | `compiler/nimconf.nim` | showHintConfテンプレート（302-305行目）でhintConf出力処理を確認 |

**主要処理フロー**:
1. **247行目**: `loadConfigs`関数開始
2. **267-268行目**: システム設定ファイル読み込み
3. **273-277行目**: ユーザー設定ファイル読み込み
4. **280-285行目**: 親ディレクトリ設定ファイル読み込み
5. **287-297行目**: プロジェクト設定ファイル読み込み
6. **302-305行目**: `showHintConf`テンプレートで各設定ファイルのヒント出力
7. **321行目**: 最終的なshowHintConf呼び出し

#### Step 3: メッセージ出力層を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | msgs.nim | `compiler/msgs.nim` | rawMessage関数（610-615行目）でメッセージ出力処理 |
| 3-2 | options.nim | `compiler/options.nim` | hasHint関数（486-493行目）でhintConfの特別チェック |

**主要処理フロー**:
- **489行目**: `hintConf`がmainPackageNotesでチェックされる条件分岐

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

```
loadConfigs (nimconf.nim 247行目)
    │
    ├─ readConfigFile (システム設定)
    │      └─ conf.configFiles.add(configPath)
    │
    ├─ readConfigFile (ユーザー設定)
    │      └─ conf.configFiles.add(configPath)
    │
    ├─ readConfigFile (親ディレクトリ設定)
    │      └─ conf.configFiles.add(configPath)
    │
    ├─ readConfigFile (プロジェクト設定)
    │      └─ conf.configFiles.add(configPath)
    │
    ├─ runNimScriptIfExists
    │      └─ conf.configFiles.add(scriptPath)
    │
    └─ showHintConf (302行目)
           │
           └─ for filename in conf.configFiles:
                  └─ rawMessage(conf, hintConf, filename.string)
                         └─ liMessage → styledMsgWriteln
```

### データフロー図

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

設定ファイル群   ───▶ readConfigFile       ───▶ conf.configFiles配列
(nim.cfg等)             │
                        ▼
                   loadConfigs           ───▶ 設定の適用
                        │
                        ▼
                   showHintConf          ───▶ stderr/stdout
                        │                      "Hint: used config file..."
                        ▼
                   rawMessage(hintConf)  ───▶ 各設定ファイルパスを出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lineinfos.nim | `compiler/lineinfos.nim` | ソース | メッセージ種別定義（TMsgKind列挙型） |
| nimconf.nim | `compiler/nimconf.nim` | ソース | 設定ファイル読み込み処理、showHintConf定義 |
| msgs.nim | `compiler/msgs.nim` | ソース | メッセージ出力処理 |
| options.nim | `compiler/options.nim` | ソース | hasHint関数（hintConfの特別処理） |
| scriptconfig.nim | `compiler/scriptconfig.nim` | ソース | NimScript設定ファイル実行 |
