# 通知設計書 77-warnImplicitTemplateRedefinition

## 概要

本ドキュメントは、Nimコンパイラの警告メッセージ「warnImplicitTemplateRedefinition」（テンプレートの暗黙的な再定義警告）に関する通知設計書である。テンプレートが暗黙的に再定義された場合に、開発者に非推奨警告を発する機能について記載する。

### 本通知の処理概要

この通知は、Nimコンパイラがテンプレート定義の解析時に、既存のテンプレートと同名のテンプレートが暗黙的に再定義されることを検出した際に発行される警告メッセージである。

**業務上の目的・背景**：Nimでは同じ名前のテンプレートを複数回定義することが可能だが、これは意図しない再定義によるバグの原因となり得る。この暗黙的な再定義パターンは非推奨とされており、意図的な再定義の場合は`.redefine`プラグマを明示的に付与することが推奨される。本警告は、開発者に明示的な意図の表明を促すことを目的とする。

**通知の送信タイミング**：コンパイル時、テンプレートのセマンティック解析フェーズ（semtempl）において、同名のテンプレートが既に存在し、かつ`sfTemplateRedefinition`や`sfGenSym`フラグが設定されていない場合に発行される。

**通知の受信者**：Nimコンパイラを使用してコードをコンパイルしている開発者。警告メッセージは標準エラー出力またはコンパイラの設定に応じた出力先に送信される。

**通知内容の概要**：警告メッセージには「template 'テンプレート名' is implicitly redefined; this is deprecated, add an explicit .redefine pragma」という形式で、問題のあるテンプレート名と対処方法が含まれる。

**期待されるアクション**：開発者は警告を確認し、意図的な再定義の場合は`.redefine`プラグマを追加し、意図しない再定義の場合はテンプレート名を変更することが期待される。

## 通知種別

コンパイラ警告メッセージ（標準エラー出力/構造化出力）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（コンパイル時） |
| 優先度 | 中（Warning） |
| リトライ | なし |

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

コンパイラの標準エラー出力、または`--stdout`オプション指定時は標準出力に送信。`structuredErrorHook`が設定されている場合はフック関数を通じて送信される。

## 通知テンプレート

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

| 項目 | 内容 |
|-----|------|
| 送信元 | Nimコンパイラ |
| 形式 | テキスト |
| 重大度 | Warning |

### 本文テンプレート

```
{ファイルパス}({行番号}, {列番号}) Warning: template '{テンプレート名}' is implicitly redefined; this is deprecated, add an explicit .redefine pragma [ImplicitTemplateRedefinition]
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| $1 | テンプレート名 | s.name.sから取得 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| コンパイル時 | テンプレート定義解析 | 同名テンプレート存在かつsfTemplateRedefinitionなし | semtempl.nimで検出 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| --warning:ImplicitTemplateRedefinition:off | コマンドラインで明示的に無効化された場合 |
| {.warning[ImplicitTemplateRedefinition]:off.} | プラグマで無効化された場合 |
| {.redefine.}プラグマ | 明示的な再定義プラグマがある場合 |
| sfGenSymフラグ | ジェネリックシンボルの場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[テンプレート定義解析] --> B[searchForProc呼び出し]
    B --> C{protoが存在?}
    C -->|No| D[新規テンプレートとして登録]
    C -->|Yes| E{comesFromShadowscope?}
    E -->|Yes| D
    E -->|No| F{sfTemplateRedefinition or sfGenSym?}
    F -->|Yes| G[symTabReplace]
    F -->|No| H[warnImplicitTemplateRedefinition発行]
    H --> G
    G --> I[終了]
    D --> I
```

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

### 参照テーブル一覧

コンパイラはデータベースを使用せず、メモリ上のAST（抽象構文木）とシンボルテーブルを参照する。

### 内部データ構造

| 構造体 | 用途 | 備考 |
|--------|------|------|
| PSym | シンボル情報 | sfTemplateRedefinition, sfGenSymフラグを保持 |
| TLineInfo | 位置情報 | ファイル/行/列を保持 |
| TScope | スコープ情報 | シンボルテーブルを保持 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 警告の昇格 | --warningAsError:ImplicitTemplateRedefinition指定時 | エラーとして扱いコンパイル中断 |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

コンパイル実行時に即時発行

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

- ファイルパスが出力に含まれるため、センシティブなパス情報が漏洩する可能性がある
- テンプレートの意図しない再定義はセキュリティ上の脆弱性につながる可能性がある

## 備考

- 非推奨パターンであり、将来的にエラーに昇格する可能性がある
- `.redefine`プラグマを使用して明示的に再定義を宣言可能
- `sfGenSym`フラグを持つテンプレートは警告対象外

---

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

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

### 推奨読解順序

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

警告の定義とテンプレート再定義フラグを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | lineinfos.nim | `compiler/lineinfos.nim` | 90行目: warnImplicitTemplateRedefinitionの定義を確認 |
| 1-2 | lineinfos.nim | `compiler/lineinfos.nim` | 199行目: メッセージテンプレートを確認 |

**読解のコツ**: メッセージには「add an explicit .redefine pragma」という対処法が含まれている。

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

警告発行の起点となるテンプレート解析処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | semtempl.nim | `compiler/semtempl.nim` | 783-790行目: テンプレート再定義検出と警告発行部分 |

**主要処理フロー**:
1. **783行目**: searchForProc関数でprotoとcomesFromShadowscopeを取得
2. **784行目**: protoがnilかチェック
3. **786行目**: comesFromShadowscopeでないことを確認
4. **787行目**: sfTemplateRedefinitionとsfGenSymフラグのチェック
5. **789行目**: 条件を満たさない場合warnImplicitTemplateRedefinition発行

#### Step 3: シンボルフラグを理解する

テンプレート再定義に関連するフラグを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | ast.nim | `compiler/ast.nim` | sfTemplateRedefinitionフラグの定義 |

**読解のコツ**: sfTemplateRedefinitionは`.redefine`プラグマによって設定される。

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

```
semTemplateExpr/semTemplateDef (semtempl.nim)
    │
    ├─ searchForProc
    │      └─ 既存テンプレートの検索
    │
    ├─ フラグチェック
    │      ├─ sfTemplateRedefinition
    │      └─ sfGenSym
    │
    ├─ message (msgs.nim:641)
    │      └─ warnImplicitTemplateRedefinition
    │
    └─ symTabReplace
           └─ シンボルテーブル更新
```

### データフロー図

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

テンプレートAST ───▶ semtempl関数 ───▶ 警告メッセージ
   │                   │                    │
   │                   ├─ シンボル検索       ├─ 標準エラー出力
   │                   │                    │
   └─ テンプレート名    └─ フラグチェック     └─ シンボルテーブル更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lineinfos.nim | `compiler/lineinfos.nim` | ソース | メッセージ種別とテンプレートの定義 |
| semtempl.nim | `compiler/semtempl.nim` | ソース | テンプレートのセマンティック解析、警告発行 |
| msgs.nim | `compiler/msgs.nim` | ソース | メッセージ出力の実装 |
| ast.nim | `compiler/ast.nim` | ソース | sfTemplateRedefinitionフラグ定義 |
| pragmas.nim | `compiler/pragmas.nim` | ソース | .redefineプラグマの処理 |
