# 通知設計書 66-warnResultUsed

## 概要

本ドキュメントは、Nimコンパイラの警告メッセージ `warnResultUsed` の設計仕様を定義する。この警告は、関数内で暗黙の`result`変数が使用されていることを検出した場合に出力される。

### 本通知の処理概要

この警告は、意味解析フェーズにおいて、プロシージャや関数内で暗黙的に定義される`result`変数への参照を検出し、開発者に通知する機能を提供する。

**業務上の目的・背景**：Nimでは、戻り値を持つプロシージャや関数に`result`という暗黙の変数が自動的に定義され、この変数に値を代入することで戻り値を設定できる。しかし、一部のコーディングスタイルでは、`return`文を使用した明示的な戻り値の指定を好む場合がある。この警告により、開発者はコード内で`result`変数が使用されている箇所を把握し、コーディングスタイルの一貫性を確認できる。

**通知の送信タイミング**：コンパイラの意味解析フェーズ（`semexprs.nim`）で、シンボル解決時に`skVar`、`skLet`、`skResult`、`skForVar`のいずれかのシンボル種別を持つ変数への参照が検出され、かつ`warnResultUsed`警告が有効な場合に出力される。

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

**通知内容の概要**：「used 'result' variable」（'result'変数が使用されました）というメッセージが出力される。

**期待されるアクション**：開発者は、プロジェクトのコーディングスタイルに応じて、`result`変数の使用を維持するか、明示的な`return`文に置き換えるかを判断する。この警告は主にコーディングスタイルの統一を目的としており、コードの正確性には影響しない。

## 通知種別

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

## 送信仕様

### 基本情報

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

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

警告は、コンパイラオプションで `warnResultUsed`（短縮形: `ResultUsed`）が有効になっている場合に出力される。ただし、**デフォルトでは無効**であり、明示的に有効化する必要がある（NotesVerbosityから除外されている）。

## 通知テンプレート

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

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

### 本文テンプレート

```
{ファイルパス}({行番号}, {カラム番号}) Warning: used 'result' variable [ResultUsed]
```

### 添付ファイル

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

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | 固定メッセージ | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| コンパイル処理 | シンボル参照 | s.kind in {skVar, skLet, skResult, skForVar}かつhasWarn有効 | result変数への参照を検出 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| --warning:ResultUsed:off | コマンドラインオプションで無効化（デフォルト状態） |
| {.warning[ResultUsed]:off.} | プラグマで無効化 |
| hasWarn(c.config, warnResultUsed) == false | 警告が有効でない（デフォルト） |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[シンボル解決] --> B{s.kind in skVar/skLet/skResult/skForVar?}
    B -->|No| C[処理継続]
    B -->|Yes| D{hasWarn - warnResultUsed?}
    D -->|No| C
    D -->|Yes| E[message - warnResultUsed]
    E --> C
```

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

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

### 参照テーブル一覧

なし

### 更新テーブル一覧

なし

## エラー処理

### エラーケース一覧

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

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

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

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

特になし。コーディングスタイルに関する警告であり、セキュリティには直接関係しない。

## 備考

- この警告はデフォルトで無効であり、`--warning:ResultUsed:on`で明示的に有効化が必要
- verbosity level 3（最大詳細度）でも自動的には有効化されない
- `result`変数の使用は完全に有効なNimの構文であり、警告はスタイルガイドラインの遵守を支援するもの
- 一部のプロジェクトでは`result`変数の使用を推奨しており、この警告は適用しない場合がある

---

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

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

### 推奨読解順序

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

まず、警告メッセージの種別とシンボルの種類を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | lineinfos.nim | `compiler/lineinfos.nim` | TMsgKind列挙型でwarnResultUsedの定義（79行目）とメッセージテンプレート（188行目）を確認 |
| 1-2 | lineinfos.nim | `compiler/lineinfos.nim` | NotesVerbosity定義（265行目）でデフォルト無効であることを確認 |
| 1-3 | ast.nim | `compiler/ast.nim` | TSymKind列挙型でskResult、skVar、skLet、skForVarの定義を確認 |

**読解のコツ**: TSymKindはシンボルの種類を表す。skResultは関数の戻り値用の暗黙変数を示す。

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

意味解析でのシンボル参照処理の起点を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | semexprs.nim | `compiler/semexprs.nim` | semSymChoice関数内でのシンボル解決処理（1388-1401行目付近）を確認 |

**主要処理フロー**:
1. **1388行目**: `of skVar, skLet, skResult, skForVar:` - シンボル種別の判定
2. **1400行目**: `if hasWarn(c.config, warnResultUsed):` - 警告が有効かどうかの確認
3. **1401行目**: `message(c.config, n.info, warnResultUsed)` - 警告出力

#### Step 3: 警告有効性チェックを理解する

警告がどのように有効化されるかを確認する。

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

**主要処理フロー**:
- hasWarn関数は、指定された警告がコンパイラオプションで有効かどうかを返す

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

```
semexprs.nim::semExpr（式の意味解析）
    │
    ├─ semexprs.nim::semSymChoice（シンボル選択処理）
    │      │
    │      ├─ シンボル種別判定（skResult等）
    │      │
    │      ├─ msgs.nim::hasWarn（警告有効性チェック）
    │      │
    │      └─ msgs.nim::message（警告出力 - warnResultUsed）
    │
    └─ 他の式処理
```

### データフロー図

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

シンボル参照AST ───▶ semSymChoice
                          │
                          ▼
                 ┌─────────────────────┐
                 │ シンボル種別判定     │
                 │ skResult/skVar等?   │
                 └──────────┬──────────┘
                            │Yes
                            ▼
                 ┌─────────────────────┐
                 │ hasWarn検査          │
                 │ warnResultUsed有効?  │
                 └──────────┬──────────┘
                            │Yes
                            ▼
                      message ───▶ stderr（警告出力）
```

### 関連ファイル一覧

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