# 機能設計書 78-@babel/helper-validator-identifier

## 概要

本ドキュメントは、@babel/helper-validator-identifierの機能設計について記載する。このパッケージは、JavaScript識別子の検証を行うためのヘルパー関数を提供するモジュールである。

### 本機能の処理概要

**業務上の目的・背景**：JavaScriptの識別子（変数名、関数名、プロパティ名など）には、使用可能な文字に関する厳密なルールがある。Unicode仕様に基づき、識別子の先頭文字と継続文字には異なる文字クラスが許可される。本パッケージは、文字列や文字コードがJavaScriptの有効な識別子として使用可能かどうかを検証する高性能な関数を提供する。@babel/parser、@babel/generator、@babel/typesなどBabel全体で広く使用される基盤パッケージ。

**機能の利用シーン**：コード生成時の識別子有効性チェック、パーサーでの識別子トークン認識、AST構築時の識別子検証など、Babelのあらゆる場面で使用される。特に、Unicodeを含む識別子の処理、予約語チェック、strictモードでの追加制約チェックに活用される。

**主要な処理内容**：
1. isIdentifierStart: 識別子先頭文字の判定（$、_、Unicode文字等）
2. isIdentifierChar: 識別子継続文字の判定（数字も含む）
3. isIdentifierName: 文字列全体が識別子として有効か判定
4. isKeyword: JavaScript予約語の判定
5. isReservedWord: 予約語（enum、await等）の判定
6. isStrictReservedWord: strictモード予約語の判定
7. isStrictBindReservedWord: バインディングコンテキスト予約語の判定

**関連システム・外部連携**：charcodesパッケージを使用。

**権限による制御**：権限による実行制御は行わない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | パーサー、ジェネレータ等から内部利用 |

## 機能種別

文字検証 / 識別子判定 / ユーティリティ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| code | number | Yes（isIdentifierStart/Char） | Unicode コードポイント | - |
| name | string | Yes（isIdentifierName） | 検証対象の文字列 | - |
| word | string | Yes（isKeyword等） | 検証対象の単語 | - |
| inModule | boolean | Yes（isReservedWord等） | ESモジュールコンテキストか | - |

### 入力データソース

@babel/parser、@babel/generator等のBabel内部モジュールから呼び出し

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| isIdentifierStart | boolean | 識別子先頭として有効か |
| isIdentifierChar | boolean | 識別子文字として有効か |
| isIdentifierName | boolean | 有効な識別子名か |
| isKeyword | boolean | 予約語か |
| isReservedWord | boolean | 予約語（将来含む）か |

### 出力先

呼び出し元に対してboolean値を返却

## 処理フロー

### 処理シーケンス

```
1. isIdentifierStart(code)
   ├─ code < 'A' → '$'と一致するか
   ├─ code <= 'Z' → true
   ├─ code < 'a' → '_'と一致するか
   ├─ code <= 'z' → true
   ├─ code <= 0xffff → 非ASCII正規表現でチェック
   └─ code > 0xffff → アストラル面コードセットでチェック

2. isIdentifierChar(code)
   ├─ code < '0' → '$'と一致するか
   ├─ code < ':' → true（数字）
   ├─ 以降はisIdentifierStartと同様
   └─ アストラル面の場合は両セットをチェック

3. isIdentifierName(name)
   └─ 各文字をループ
       ├─ サロゲートペア処理
       ├─ 最初の文字 → isIdentifierStartで判定
       └─ 2文字目以降 → isIdentifierCharで判定
```

### フローチャート

```mermaid
flowchart TD
    A[isIdentifierStart] --> B{code < 65?}
    B -->|Yes| C{code == 36?}
    C -->|Yes| D[return true]
    C -->|No| E[return false]
    B -->|No| F{code <= 90?}
    F -->|Yes| D
    F -->|No| G{code < 97?}
    G -->|Yes| H{code == 95?}
    H -->|Yes| D
    H -->|No| E
    G -->|No| I{code <= 122?}
    I -->|Yes| D
    I -->|No| J{code <= 0xffff?}
    J -->|Yes| K[非ASCII正規表現チェック]
    J -->|No| L[アストラル面チェック]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-78-01 | 識別子先頭文字 | $、_、Unicode Letter（Lu、Ll、Lt、Lm、Lo、Nl） | 識別子の1文字目 |
| BR-78-02 | 識別子継続文字 | 先頭文字 + 数字 + Unicode Mark/Connector | 識別子の2文字目以降 |
| BR-78-03 | 予約語判定 | break、caseなど37個のキーワード | 常時 |
| BR-78-04 | strict予約語 | implements、interface等9個追加 | strictモード時 |
| BR-78-05 | strictBindのみ | eval、arguments | strictバインディング時 |
| BR-78-06 | モジュール予約語 | await | ESモジュール時 |

### 計算ロジック

**アストラル面判定（isInAstralSet）**：
```
ランレングス符号化されたコードポイント範囲を線形走査
開始オフセット: 0x10000
各エントリ: [オフセット加算, 範囲サイズ]
```

## データベース操作仕様

### 操作別データベース影響一覧

データベース操作なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | - | エラーは発生しない | - |

### リトライ仕様

リトライ対象外

## トランザクション仕様

トランザクション処理なし

## パフォーマンス要件

- ASCII文字の高速パス（条件分岐のみ）
- 非ASCII文字は正規表現でチェック
- charCodeAtをインライン使用（V8 TurboFan最適化対応）

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

特になし

## 備考

- scripts/generate-identifier-regex.jsで正規表現を生成
- Unicode仕様の更新に応じて正規表現を再生成必要
- アストラル面のコードはランレングス符号化で効率化

---

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

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

### 推奨読解順序

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

まず、識別子文字セットの定義を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | identifier.ts | `packages/babel-helper-validator-identifier/src/identifier.ts` | 非ASCII識別子文字の正規表現（23-26行目） |
| 1-2 | identifier.ts | `packages/babel-helper-validator-identifier/src/identifier.ts` | アストラル面コードセット（40-43行目） |

**読解のコツ**: nonASCIIidentifierStartCharsとnonASCIIidentifierCharsは、Unicode文字クラスに基づいて生成された正規表現パターン。アストラル面（U+10000以上）はランレングス符号化されたコードポイント配列で表現。

#### Step 2: 識別子判定関数を理解する

コア関数の実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | identifier.ts | `packages/babel-helper-validator-identifier/src/identifier.ts` | isIdentifierStart関数（62-73行目） |
| 2-2 | identifier.ts | `packages/babel-helper-validator-identifier/src/identifier.ts` | isIdentifierChar関数（77-91行目） |
| 2-3 | identifier.ts | `packages/babel-helper-validator-identifier/src/identifier.ts` | isIdentifierName関数（95-119行目） |

**主要処理フロー**:
1. **62-73行目**: isIdentifierStart - ASCII範囲の高速パス + 非ASCII/アストラル面処理
2. **77-91行目**: isIdentifierChar - 数字の追加判定 + アストラル面は両セットをチェック
3. **95-119行目**: isIdentifierName - サロゲートペア処理 + 各文字を順次チェック

#### Step 3: 予約語判定関数を理解する

キーワードと予約語の判定ロジックを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | keyword.ts | `packages/babel-helper-validator-identifier/src/keyword.ts` | reservedWords定義（1-51行目） |
| 3-2 | keyword.ts | `packages/babel-helper-validator-identifier/src/keyword.ts` | 各isXxx関数（56-96行目） |

**主要処理フロー**:
- **1-51行目**: keyword、strict、strictBindの3カテゴリで予約語を定義
- **52-54行目**: SetでO(1)検索を実現
- **59-61行目**: isReservedWord - awaitとenumの判定
- **68-70行目**: isStrictReservedWord - strict追加分を含む
- **94-96行目**: isKeyword - 予約語のみ判定

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

```
@babel/helper-validator-identifier/src/index.ts
    │
    ├─ identifier.ts
    │      ├─ isIdentifierStart()
    │      │      └─ isInAstralSet()
    │      ├─ isIdentifierChar()
    │      │      └─ isInAstralSet()
    │      └─ isIdentifierName()
    │             ├─ isIdentifierStart()
    │             └─ isIdentifierChar()
    │
    └─ keyword.ts
           ├─ isReservedWord()
           ├─ isStrictReservedWord()
           │      └─ isReservedWord()
           ├─ isStrictBindOnlyReservedWord()
           ├─ isStrictBindReservedWord()
           │      ├─ isStrictReservedWord()
           │      └─ isStrictBindOnlyReservedWord()
           └─ isKeyword()
```

### データフロー図

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

Unicode code point ───▶ isIdentifierStart() ───▶ boolean
                               │
                               ├─ ASCII高速パス
                               ├─ 非ASCII正規表現
                               └─ アストラル面セット


文字列 ───▶ isIdentifierName() ───▶ boolean
                    │
                    ├─ サロゲートペア処理
                    ├─ isIdentifierStart(first)
                    └─ isIdentifierChar(rest)


単語 ───▶ isKeyword() ───▶ boolean
              │
              └─ Setルックアップ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.ts | `packages/babel-helper-validator-identifier/src/index.ts` | ソース | エントリーポイント（re-export） |
| identifier.ts | `packages/babel-helper-validator-identifier/src/identifier.ts` | ソース | 識別子文字判定関数 |
| keyword.ts | `packages/babel-helper-validator-identifier/src/keyword.ts` | ソース | 予約語判定関数 |
