# 通知設計書 67-warnCannotOpen

## 概要

本ドキュメントは、Nimコンパイラの警告メッセージ `warnCannotOpen` の設計仕様を定義する。この警告は、ファイルを開けない場合に出力される。

### 本通知の処理概要

この警告は、コンパイラがファイルを開こうとして失敗した場合に、開発者に通知する機能を提供する。現在のソースコードでは、この警告を直接使用している箇所は確認されていないが、`lineinfos.nim`に定義が存在する。

**業務上の目的・背景**：コンパイル中にソースファイル、設定ファイル、インクルードファイルなどを開けない状況が発生することがある。`warnCannotOpen`は、このような状況を警告として通知するために定義されている。類似の警告として`warnCannotOpenFile`（No.21）が存在し、実際のファイルオープン失敗時にはそちらが使用される場合が多い。

**通知の送信タイミング**：ファイルを開こうとして失敗した際に警告が発生する可能性がある。ただし、現在のNimコンパイラ実装では、この警告の具体的な使用箇所は確認されていない。

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

**通知内容の概要**：「cannot open: {対象}」（{対象}を開けません）というメッセージが出力される。

**期待されるアクション**：開発者は、開けないファイルのパスを確認し、ファイルが存在すること、読み取り権限があることを確認する。

## 通知種別

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

## 送信仕様

### 基本情報

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

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

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

## 通知テンプレート

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

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

### 本文テンプレート

```
{ファイルパス}({行番号}, {カラム番号}) Warning: cannot open: {対象} [CannotOpen]
```

### 添付ファイル

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

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| $1 | 開けないファイルやリソースの識別子 | 呼び出し元から渡される | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| コンパイル処理 | ファイルオープン失敗 | 将来の実装で使用予定 | ファイルを開けない場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| --warning:CannotOpen:off | コマンドラインオプションで明示的に無効化 |
| {.warning[CannotOpen]:off.} | プラグマで無効化 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ファイルオープン試行] --> B{オープン成功?}
    B -->|Yes| C[処理継続]
    B -->|No| D{警告として処理?}
    D -->|Yes| E[message - warnCannotOpen]
    D -->|No| F[エラーとして処理]
    E --> G[処理継続/中断]
    F --> G
```

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

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

### 参照テーブル一覧

なし

### 更新テーブル一覧

なし

## エラー処理

### エラーケース一覧

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

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

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

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

ファイルパス情報が警告メッセージに含まれるため、機密性の高いファイルパスが外部に漏洩しないよう注意が必要な場合がある。

## 備考

- この警告は`lineinfos.nim`に定義されているが、現在のソースコードでは直接的な使用箇所は確認されていない
- 類似の警告として`warnCannotOpenFile`（No.21）が存在し、ファイルオープン失敗時の主要な警告として使用されている
- 将来的な拡張や特定のコンテキストでの使用を想定して定義されている可能性がある

---

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

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

### 推奨読解順序

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

まず、警告メッセージの種別定義を理解する。

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

**読解のコツ**: warnCannotOpenとwarnCannotOpenFileは別の警告であることに注意。後者（No.21）はより広く使用されている。

#### Step 2: 関連する警告を理解する

類似の警告との関係を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | lineinfos.nim | `compiler/lineinfos.nim` | warnCannotOpenFile（51行目）との違いを確認 |
| 2-2 | docgen.nim | `compiler/docgen.nim` | warnCannotOpenFileの使用例（1802行目付近）を参照 |

**主要処理フロー**:
- lineinfos.nim 51行目: `warnCannotOpenFile = "CannotOpenFile"` - ファイルオープン失敗警告（主に使用される）
- lineinfos.nim 80行目: `warnCannotOpen = "CannotOpen"` - 一般的なオープン失敗警告

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

```
（現在のソースコードでは使用箇所なし）

将来の想定:
ファイル処理モジュール
    │
    └─ msgs.nim::message（警告出力 - warnCannotOpen）
```

### データフロー図

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

ファイルパス ───▶ ファイルオープン試行
                          │
                          ▼
                 ┌─────────────────┐
                 │ オープン失敗検出  │
                 └────────┬────────┘
                          │
                          ▼
                    message ───▶ stderr（警告出力）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lineinfos.nim | `compiler/lineinfos.nim` | ソース | TMsgKind定義とメッセージテンプレート |
| msgs.nim | `compiler/msgs.nim` | ソース | メッセージ出力関数 |
