# 通知設計書 23-JSX closing bracket error

## 概要

本ドキュメントは、CoffeeScriptコンパイラにおけるJSX閉じ括弧の欠落エラー（JSX closing bracket error）の通知仕様を記述する。

### 本通知の処理概要

本通知は、JSX構文を使用したCoffeeScriptソースコードにおいて、閉じタグの`>`が欠落している場合に発生するエラーメッセージである。

**業務上の目的・背景**：JSX構文では、タグは必ず`<`で開始し`>`で終了する必要がある。閉じタグ（`</tagName>`）において、タグ名の後に`>`が存在しない場合、構文として不完全である。この検証により、不正なJSX構文を早期に検出し、開発者に明確なエラーメッセージを提供することで、デバッグ時間を短縮する。

**通知の送信タイミング**：コンパイル時、Lexerが JSX閉じタグをトークン化する際に、タグ名の後の文字を検証するタイミングで発生する。

**通知の受信者**：CoffeeScriptコンパイラを実行している開発者。コンソール出力またはエラーオブジェクトとして通知される。

**通知内容の概要**：エラーメッセージ「missing closing > after tag name」とともに、`>`が期待される位置情報が提供される。

**期待されるアクション**：開発者は、閉じタグの末尾に`>`を追加して、正しいJSX構文にする必要がある。

## 通知種別

コンソールエラー出力 / SyntaxError例外

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（コンパイル処理中に即時発生） |
| 優先度 | 高（コンパイルエラー） |
| リトライ | なし（即時エラー終了） |

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

コンパイラを実行しているプロセスの標準エラー出力、またはAPIとして呼び出された場合はSyntaxError例外として呼び出し元に返される。

## 通知テンプレート

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

| 項目 | 内容 |
|-----|------|
| 出力先 | stderr |
| 形式 | テキスト |

### 本文テンプレート

```
[ファイル名]:[行番号]:[列番号]: error: missing closing > after tag name
[該当行のソースコード]
[エラー位置を示すキャレット]
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| filename | ソースファイル名 | コンパイルオプション | Yes |
| line | エラー発生行番号 | Lexer位置情報 | Yes |
| column | エラー発生列番号 | afterTag計算結果 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| コンパイル処理 | JSX閉じタグの解析 | @chunk[afterTag] !== '>' | タグ名の直後の文字が`>`でない場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| 正常な閉じタグ | `</tagName>`形式で正しく記述されている場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[JSX閉じタグ検出] --> B[タグ名をマッチング]
    B --> C[afterTag位置を計算]
    C --> D{afterTagの文字チェック}
    D -->|!== '>'| E[error関数呼び出し]
    D -->|=== '>'| F[正常処理継続]
    E --> G[SyntaxError生成]
    G --> H[エラーメッセージ出力]
    H --> I[コンパイル中断]
    F --> J[endToken生成]
    J --> K[処理完了]
```

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

### 参照テーブル一覧

該当なし（ファイルベースのコンパイル処理）

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| SyntaxError | 閉じタグ末尾に`>`がない | タグ末尾に`>`を追加 |

### リトライ仕様

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

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 制限 | なし（コンパイル時エラー） |

### 配信時間帯

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

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

- エラーメッセージには特に機密情報は含まれない
- タグ名自体は含まれないため、情報漏洩リスクは低い

## 備考

- このエラーは、JSX閉じタグの構文検証の一部として実行される
- タグ名の一致チェック（No.22）の後に実行される
- 開きタグの`>`欠落は別のエラーハンドリングで処理される

---

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

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

### 推奨読解順序

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

JSX閉じタグ処理時の位置計算ロジックを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | lexer.coffee | `src/lexer.coffee` | afterTag変数の計算（end + fullTagName.length） |

**読解のコツ**: `end`は閉じタグの開始位置（`</`の後）、`fullTagName`はタグ名の文字列長を示す。

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

JSX閉じタグ検出処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | lexer.coffee | `src/lexer.coffee` | 703-710行目 - 閉じタグ処理とエラーチェック |

**主要処理フロー**:
1. **703行目**: JSX_IDENTIFIERで閉じタグ名をマッチング
2. **707行目**: fullTagNameを取得
3. **708行目**: afterTag位置を計算（end + fullTagName.length）
4. **709行目**: chunk[afterTag]が`>`かどうかをチェック
5. **710行目**: `>`でなければerror関数を呼び出し

#### Step 3: エラー生成処理を理解する

error関数の動作を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | lexer.coffee | `src/lexer.coffee` | 1178行目以降 - errorメソッド定義 |

**主要処理フロー**:
- **710行目**: `offset: afterTag, length: 1`でエラー位置を指定
- エラー位置は`>`が期待される位置を正確に示す

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

```
CoffeeScript.compile()
    │
    ├─ Lexer.tokenize()
    │      └─ jsxToken()
    │             ├─ 閉じタグ検出（</）
    │             ├─ JSX_IDENTIFIER.exec() - タグ名取得
    │             ├─ afterTag = end + fullTagName.length
    │             │
    │             └─ @chunk[afterTag] !== '>'
    │                    └─ @error("missing closing > after tag name")
    │                           └─ throwSyntaxError()
    │
    └─ エラー時: SyntaxError例外をスロー
```

### データフロー図

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

</div                 afterTag位置計算               エラーメッセージ
    │                      │                        "missing closing >
    ▼                      ▼                         after tag name"
end = 2              afterTag = 2 + 3 = 5
fullTagName = "div"        │
                           ▼
                   @chunk[5] = undefined
                   !== '>'
                           │
                           ▼
                     @error()呼び出し
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lexer.coffee | `src/lexer.coffee` | ソース | JSXトークン化、閉じ括弧検証 |
| helpers.coffee | `src/helpers.coffee` | ソース | throwSyntaxError関数 |
| lexer.js | `lib/coffeescript/lexer.js` | 生成JS | コンパイル後のJavaScript（1033行目） |
