# 通知設計書 69-warnSuspiciousEnumConv

## 概要

本ドキュメントは、Nimコンパイラの警告メッセージ `warnSuspiciousEnumConv` の設計仕様を定義する。この警告は、異なる列挙型間での変換が検出された場合に出力される。

### 本通知の処理概要

この警告は、意味解析フェーズにおいて、ある列挙型から別の列挙型への変換を検出し、潜在的なバグの可能性を開発者に通知する機能を提供する。

**業務上の目的・背景**：異なる列挙型間の変換は、意図しないバグの原因となることがある。例えば、`Color`型の値を`Size`型に変換するようなコードは、多くの場合意図していない操作である。列挙型は通常、特定の意味を持つ値のセットを表現するため、異なる列挙型間での変換は論理的な誤りを示唆している可能性がある。この警告により、開発者は疑わしい型変換を認識し、コードの意図を再確認できる。

**通知の送信タイミング**：コンパイラの意味解析フェーズ（`semexprs.nim`）で、型変換処理において変換元と変換先が両方とも列挙型であり、かつ同一の型でない場合に警告が発生する。

**通知の受信者**：Nimコンパイラを使用してソースコードをコンパイルしている開発者。コンパイル時の警告メッセージとして標準エラー出力またはビルドログに表示される。

**通知内容の概要**：「suspicious code: enum to enum conversion」（疑わしいコード：列挙型から列挙型への変換）というメッセージが出力される。

**期待されるアクション**：開発者は該当箇所のコードを確認し、列挙型間の変換が意図したものかどうかを判断する。意図した変換であれば警告を抑制し、意図していない変換であればコードを修正する。

## 通知種別

コンパイラ警告メッセージ（stderr/ビルドログ出力）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（コンパイル処理中に即座に出力） |
| 優先度 | 中（Warning） |
| リトライ | 無（コンパイル時の一度きりの出力） |

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

警告は、コンパイラオプションで `warnSuspiciousEnumConv`（短縮形: `EnumConv`）が有効になっている場合に出力される。デフォルトで有効。

## 通知テンプレート

### コンパイラ警告出力の場合

| 項目 | 内容 |
|-----|------|
| 出力先 | stderr |
| メッセージ種別 | Warning |
| 形式 | テキスト |

### 本文テンプレート

```
{ファイルパス}({行番号}, {カラム番号}) Warning: suspicious code: enum to enum conversion [EnumConv]
```

### 添付ファイル

なし（コンパイラ出力のため）

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| $1 | メッセージ（固定: "suspicious code: enum to enum conversion"） | semexprs.nimで生成 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| コンパイル処理 | 型変換 | targetTyp.kind == tyEnum かつ srcBaseTyp.kind == tyEnum かつ !sameType | 異なる列挙型間の変換 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| --warning:EnumConv:off | コマンドラインオプションで明示的に無効化 |
| {.warning[EnumConv]:off.} | プラグマで無効化 |
| sameType(targetTyp, srcBaseTyp) | 同一の列挙型への変換（エラーにならない） |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[型変換処理] --> B{targetTyp.kind == tyEnum?}
    B -->|No| C[他の変換処理]
    B -->|Yes| D{srcBaseTyp.kind == tyEnum?}
    D -->|No| C
    D -->|Yes| E{sameType?}
    E -->|Yes| C
    E -->|No| F[message - warnSuspiciousEnumConv]
    F --> G[変換処理継続]
    C --> G
```

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

本警告はコンパイラ内部処理であり、データベースは使用しない。

### 参照テーブル一覧

なし

### 更新テーブル一覧

なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 該当なし | 警告メッセージのため、エラーは発生しない | - |

### リトライ仕様

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

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

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

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

列挙型間の不正な変換は、予期しない動作を引き起こし、セキュリティ上の脆弱性につながる可能性がある。特に、状態遷移や権限レベルを表す列挙型での不正な変換は危険である。

## 備考

- この警告は型安全性を強化するためのもので、Nimの強い型システムを補完する
- 意図的な列挙型間変換が必要な場合は、プラグマで警告を抑制するか、明示的なキャストを使用する
- 関連する警告として`warnAnyEnumConv`（No.70）と`warnHoleEnumConv`（No.71）がある

---

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

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

### 推奨読解順序

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

まず、警告メッセージの種別と列挙型の型情報を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | lineinfos.nim | `compiler/lineinfos.nim` | TMsgKind列挙型でwarnSuspiciousEnumConvの定義（82行目）とメッセージテンプレート（191行目）を確認 |
| 1-2 | types.nim | `compiler/types.nim` | tyEnumの型分類を確認 |

**読解のコツ**: tyEnumは列挙型を表すTTypeKindの値。型変換時にはskipTypes関数で型のラッパーを剥がして基底型を取得する。

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

意味解析での型変換処理の起点を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | semexprs.nim | `compiler/semexprs.nim` | checkConvertible関数（275-315行目付近）での変換チェックを確認 |

**主要処理フロー**:
1. **286行目**: `if targetTyp.kind == tyEnum and srcBaseTyp.kind == tyEnum and` - 両方が列挙型かの判定
2. **287行目**: `not sameType(targetTyp, srcBaseTyp):` - 同一型でないことの確認
3. **288行目**: `message(c.config, src.info, warnSuspiciousEnumConv, "suspicious code: enum to enum conversion")` - 警告出力

#### Step 3: 型比較処理を理解する

型の同一性判定がどのように行われるかを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | types.nim | `compiler/types.nim` | sameType関数の実装を確認 |

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

```
semexprs.nim::semConv（型変換の意味解析）
    │
    ├─ semexprs.nim::checkConvertible（変換可能性チェック）
    │      │
    │      ├─ 型種別判定（tyEnum?）
    │      │
    │      ├─ types.nim::sameType（型の同一性判定）
    │      │
    │      └─ msgs.nim::message（警告出力 - warnSuspiciousEnumConv）
    │
    └─ 変換処理継続
```

### データフロー図

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

型変換AST ───▶ checkConvertible
                    │
                    ▼
            ┌─────────────────────┐
            │ targetTyp.kind検査   │
            │ tyEnum?              │
            └──────────┬──────────┘
                       │Yes
                       ▼
            ┌─────────────────────┐
            │ srcBaseTyp.kind検査  │
            │ tyEnum?              │
            └──────────┬──────────┘
                       │Yes
                       ▼
            ┌─────────────────────┐
            │ sameType検査         │
            │ 同一型?              │
            └──────────┬──────────┘
                       │No
                       ▼
                 message ───▶ stderr（警告出力）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lineinfos.nim | `compiler/lineinfos.nim` | ソース | TMsgKind定義とメッセージテンプレート |
| semexprs.nim | `compiler/semexprs.nim` | ソース | 式の意味解析、checkConvertible関数 |
| types.nim | `compiler/types.nim` | ソース | 型システム、sameType関数 |
| msgs.nim | `compiler/msgs.nim` | ソース | メッセージ出力関数 |
