---
generated_at: 2026-03-01 06:15:00
metrics:
  claims_total: 90
  claims_with_evidence: 88
  claims_without_evidence: 2
confidence_derived: 0.98
---

# 根拠レポート：babel-plugin-transform-block-scoping 単体テストケース一覧

## 本レポートについて

### 目的
本レポートは、生成された単体テストケース一覧の信頼性を検証し、人間レビュアーが効率的にレビューできるようにすることを目的としています。

### チェック方法
以下の観点でドキュメントの内容（Claim：主張）を検証しています：

1. **根拠の有無確認**：各主張に対して、ソースコード・既存設計書・要件定義書などの根拠（Evidence）が存在するか
2. **根拠との整合性**：主張の内容が根拠と矛盾していないか
3. **網羅性**：参照すべき情報源を適切にカバーしているか

### 信頼度スコアの算出
- **confidence_derived** = 根拠あり件数 / 総主張件数
- 状態「○」：根拠あり、「△」：根拠不足または要確認

### 本レポートの使い方
1. まず「サマリー」で全体の信頼度と優先レビュー項目を確認
2. 「Claims と根拠の対応」で △ の項目を重点的にレビュー
3. 「不足情報」で補完が必要な情報源を確認

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**0.98**
  - 根拠あり：88 / 90、根拠なし：2
- 優先レビュー（高）
  1. **C-69 validateUsage null binding**：nullバインディング時の挙動はコメントからの推測
  2. **C-83 skipTDZChecks WeakSet**：内部実装詳細のため外部テストでの検証困難

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。抽出フェーズで付けたIDをそのまま出す。

- E-01: `packages/babel-plugin-transform-block-scoping/src/index.ts` - メインプラグインファイル（274行）
- E-02: `packages/babel-plugin-transform-block-scoping/src/loop.ts` - ループ処理ユーティリティ（390行）
- E-03: `packages/babel-plugin-transform-block-scoping/src/validation.ts` - バリデーション処理（208行）
- E-04: `packages/babel-plugin-transform-block-scoping/package.json` - パッケージ定義
- E-05: Babel Plugin Documentation（外部参照）
- E-06: ECMAScript Block Scoping仕様

## 3) Claims と根拠の対応（レビューの主戦場）

### index.ts - プラグイン定義・オプション

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | プラグインが正常に初期化されること | E-01:18-29 declare関数定義 | ○ |
| C-02 | throwIfClosureRequired=true設定 | E-01:21 opts destructuring | ○ |
| C-03 | tdz=true設定 | E-01:21 tdzEnabled定義 | ○ |
| C-04 | throwIfClosureRequired非boolean時エラー | E-01:22-24 型チェック | ○ |
| C-05 | tdz非boolean時エラー | E-01:25-27 型チェック | ○ |

### index.ts - Loop Visitor

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-06 | forループ内letのvar変換 | E-01:33-35 Loop visitor | ○ |
| C-07 | for-ofループ対応 | E-01:37-38 isForXStatement | ○ |
| C-08 | for-inループ対応 | E-01:37-38 isForXStatement | ○ |
| C-09 | クロージャキャプチャ時ラップ | E-01:59-60 capturedInClosure | ○ |
| C-10 | throwIfClosureRequired時エラー | E-01:43-47 markNeedsBodyWrap | ○ |
| C-11 | 外部スコープ同名変数リネーム | E-01:84-95 hasBinding/rename | ○ |
| C-12 | グローバル変数同名リネーム | E-01:86 hasGlobal | ○ |

### index.ts - VariableDeclaration/ClassDeclaration Visitor

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-13 | ブロック内letのvar変換 | E-01:137-139 VariableDeclaration visitor | ○ |
| C-14 | constのvar変換 | E-01:137-139 + isBlockScoped | ○ |
| C-15 | varは変換されない | E-01:180 isBlockScoped戻り | ○ |
| C-16 | クラス宣言リネーム | E-01:145-156 ClassDeclaration visitor | ○ |
| C-17 | 無名クラスはスキップ | E-01:147 !id早期リターン | ○ |

### index.ts - transformBlockScopedVariable関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-18 | kindがvarに変更 | E-01:184 node.kind = "var" | ○ |
| C-19 | ループ内未初期化letにvoid 0 | E-01:193-204 decl.init ??= | ○ |
| C-20 | バインディングのスコープ移動 | E-01:206-227 moveBindingTo | ○ |
| C-21 | hoisted関数競合時リネーム | E-01:229-231 conflictingFunctionsVisitor | ○ |

### index.ts - ユーティリティ関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-22 | isLetOrConst let判定 | E-01:241-245 kind比較 | ○ |
| C-23 | isLetOrConst const判定 | E-01:241-245 kind比較 | ○ |
| C-24 | isLetOrConst var判定 | E-01:241-245 kind比較 | ○ |
| C-25 | isInLoop ループ内true | E-01:247-252 parentPath.isLoop | ○ |
| C-26 | isInLoop ループ外false | E-01:247-252 再帰終了条件 | ○ |
| C-27 | isInLoop 関数境界 | E-01:250 isFunctionParent | ○ |
| C-28 | isBlockScoped let判定 | E-01:254-269 isVariableDeclaration+kind | ○ |
| C-29 | isBlockScoped const判定 | E-01:254-269 isLetOrConst呼び出し | ○ |
| C-30 | isBlockScoped var判定 | E-01:264 !isLetOrConst戻り | ○ |
| C-31 | using宣言エラー | E-01:260-263 kind === "using" | ○ |
| C-32 | await using宣言エラー | E-01:260-263 kind === "await using" | ○ |
| C-33 | isVarScope 関数スコープ | E-01:271-273 isFunctionParent | ○ |
| C-34 | isVarScope プログラムスコープ | E-01:271-273 isProgram | ○ |
| C-35 | isVarScope ブロックスコープ | E-01:271-273 両方false時 | ○ |

### loop.ts - getLoopBodyBindings関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-36 | let/constバインディング取得 | E-02:29-33 traverse+state | ○ |
| C-37 | hoisted関数も取得 | E-02:19-21 kind === "hoisted" | ○ |
| C-38 | 空ループ時空配列 | E-02:30 初期state | ○ |
| C-39 | ネスト関数内スキップ | E-02:13 isFunctionParent skip | ○ |

### loop.ts - getUsageInBody関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-40 | ループ本体参照検出 | E-02:59-67 referencePaths処理 | ○ |
| C-41 | クロージャキャプチャ検出 | E-02:43,64 capturedInClosure | ○ |
| C-42 | const違反検出 | E-02:45-57 constantViolations | ○ |
| C-43 | UpdateExpression重複排除 | E-02:41,55,60 WeakSet seen | ○ |
| C-44 | ヘッダ参照除外 | E-02:47,63 !inBody | ○ |

### loop.ts - relativeLoopLocation関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-45 | 本体内判定 | E-02:84 currPath === bodyPath | ○ |
| C-46 | 本体外判定 | E-02:86-87 currPath === loopPath | ○ |
| C-47 | クロージャ判定 | E-02:81-83 isFunction/isClass | ○ |
| C-48 | クラス内クロージャ | E-02:81 isClass | ○ |
| C-49 | 不正パス検出 | E-02:91-93 throw Error | ○ |

### loop.ts - wrapLoopBody関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-50 | 基本ラップ | E-02:165-234 関数生成ロジック | ○ |
| C-51 | 更新変数の引数化 | E-02:185-194 updatedBindingsUsages | ○ |
| C-52 | break処理 | E-02:277-297 breaksContinues処理 | ○ |
| C-53 | continue処理 | E-02:277-297 breaksContinues処理 | ○ |
| C-54 | ラベル付き制御 | E-02:281,323 label処理 | ○ |
| C-55 | return処理 | E-02:351-368 returns処理 | ○ |
| C-56 | var巻き上げ | E-02:238-270 vars処理 | ○ |
| C-57 | async対応 | E-02:210-215 fn.async設定 | ○ |
| C-58 | generator対応 | E-02:213-214 fn.generator+yield | ○ |
| C-59 | 単純ケース | E-02:274-275 labelNum+returnNum===0 | ○ |
| C-60 | 単一制御最適化 | E-02:276-297 labelNum===1 | ○ |

### loop.ts - isVarInLoopHead関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-61 | for init判定 | E-02:377 isForStatement+key==="init" | ○ |
| C-62 | for-x left判定 | E-02:378 isForXStatement+key==="left" | ○ |
| C-63 | 本体内判定 | E-02:379 return false | ○ |

### loop.ts - filterMap関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-64 | nullでない結果のみ | E-02:382-389 if (mapped) push | ○ |
| C-65 | 空配列対応 | E-02:383 result初期化 | ○ |

### validation.ts - validateUsage関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-66 | const違反チェック | E-03:18-20 kind==="const" | ○ |
| C-67 | TDZチェック注入 | E-03:15-17 tdzEnabled | ○ |
| C-68 | 動的TDZ名返却 | E-03:16 dynamicTDZNames.push | ○ |
| C-69 | nullバインディングスキップ | E-03:13-14 コメント参照 | △ |

### validation.ts - disallowConstantViolations関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-70 | 単純代入違反 | E-03:35-40 operator === "=" | ○ |
| C-71 | 複合代入違反 | E-03:50-62 else分岐 | ○ |
| C-72 | 論理代入違反 | E-03:41-49 &&=/||= | ○ |
| C-73 | ??=違反 | E-03:41 ??=含む | ○ |
| C-74 | インクリメント違反 | E-03:63-69 isUpdateExpression | ○ |
| C-75 | for-x違反 | E-03:70-82 isForXStatement | ○ |

### validation.ts - getTDZStatus関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-76 | inside判定 | E-03:91-92 executionStatus==="after" | ○ |
| C-77 | outside判定 | E-03:89-90 executionStatus==="before" | ○ |
| C-78 | maybe判定 | E-03:93-94 else | ○ |

### validation.ts - buildTDZAssert関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-79 | maybe時temporalRef | E-03:105-112 status==="maybe" | ○ |
| C-80 | inside時tdz | E-03:113-117 else | ○ |

### validation.ts - getTDZReplacement関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-81 | TDZ内置換ノード | E-03:142-151 status判定 | ○ |
| C-82 | TDZ外undefined | E-03:143 outside早期リターン | ○ |
| C-83 | skipTDZChecksスキップ | E-03:135-136 WeakSet確認 | △ |
| C-84 | 関数宣言スキップ | E-03:140 isFunctionDeclaration | ○ |

### validation.ts - injectTDZChecks関数

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-85 | 参照へのチェック注入 | E-03:194-204 referencePaths | ○ |
| C-86 | UpdateExpressionチェック | E-03:165-177 isUpdateExpression | ○ |
| C-87 | AssignmentExpressionチェック | E-03:178-191 isAssignmentExpression | ○ |
| C-88 | ForXStatement除外 | E-03:197 isForXStatement | ○ |
| C-89 | 動的TDZ戻り値 | E-03:158,173,186,201 dynamicTdz | ○ |
| C-90 | 即時置換 | E-03:176,203 replaceWith | ○ |

## 4) 不足情報（Unknown / Missing）
- **C-69**: nullバインディングの発生条件は外部イシュー（#15300）に依存。テストでの再現が困難。
  - 候補：GitHub Issue #15300の確認 / 特殊なパース状態の再現
- **C-83**: WeakSetによる内部状態管理は外部からのテストが困難。単体テストではモック必要。
  - 候補：内部状態を露出するテスト用API / インテグレーションテストで確認

## 5) リスクフラグ（レビュー観点）
- **リスク0（低）**: 90テストケース中88件は直接コード参照可能
- **リスク1（中）**: 2件（C-69, C-83）は内部実装詳細に依存
- **リスク0（低）**: 全テストケースはソースコードの関数・ロジックに対応

## 6) レビュアーチェックリスト（最小）
- [ ] C-69（nullバインディング）の再現条件を確認し、必要に応じてテストケースを調整
- [ ] C-83（skipTDZChecks WeakSet）のテスト方法を検討（モック使用可否）
- [ ] ループ処理（C-50〜C-60）のテストケースが実際のトランスフォーム出力と一致するか確認
- [ ] TDZチェック（C-76〜C-90）が実行時エラー検出の期待動作と一致するか確認
- [ ] 優先度「高」のテストケースが重要なビジネスロジックを網羅しているか確認
