---
generated_at: 2026-03-01 06:00:00
metrics:
  claims_total: 70
  claims_with_evidence: 70
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：babel-plugin-bugfix-v8-static-class-fields-redefine-readonly 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：70 / 70、根拠なし：0
- 優先レビュー（高）
  - なし（全テストケースにソースコードまたは既存テストによる根拠あり）

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

- E-01: `packages/babel-plugin-bugfix-v8-static-class-fields-redefine-readonly/src/index.ts`（メインプラグインエントリポイント、71行）
- E-02: `packages/babel-plugin-bugfix-v8-static-class-fields-redefine-readonly/src/util.ts`（ユーティリティ関数群、226行）
- E-03: `packages/babel-plugin-bugfix-v8-static-class-fields-redefine-readonly/test/util.skip-bundled.js`（既存ユニットテスト、298行）
- E-04: `packages/babel-plugin-bugfix-v8-static-class-fields-redefine-readonly/test/index.js`（テストランナー設定）
- E-05: `packages/babel-plugin-bugfix-v8-static-class-fields-redefine-readonly/package.json`（パッケージ設定）

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

### isNameOrLength 関数（UT-V8S-001 〜 UT-V8S-007）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | isNameOrLength が Identifier 'name' に対して true を返す | E-02 (4-6行目: `if (t.isIdentifier(key)) { return key.name === "name" || key.name === "length"; }`) | ○ |
| C-02 | isNameOrLength が Identifier 'length' に対して true を返す | E-02 (4-6行目) | ○ |
| C-03 | isNameOrLength が StringLiteral 'name' に対して true を返す | E-02 (7-9行目: `if (t.isStringLiteral(key)) { return key.value === "name" || key.value === "length"; }`) | ○ |
| C-04 | isNameOrLength が StringLiteral 'length' に対して true を返す | E-02 (7-9行目) | ○ |
| C-05 | isNameOrLength がその他の Identifier に対して false を返す | E-02 (4-6行目の条件分岐) | ○ |
| C-06 | isNameOrLength がその他の StringLiteral に対して false を返す | E-02 (7-9行目の条件分岐) | ○ |
| C-07 | isNameOrLength が非対応ノード型に対して false を返す | E-02 (10行目: `return false;`) | ○ |

### isStaticFieldWithValue 関数（UT-V8S-008 〜 UT-V8S-012）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-08 | isStaticFieldWithValue が static+value を持つ ClassProperty に true を返す | E-02 (13-21行目) | ○ |
| C-09 | isStaticFieldWithValue が static+value を持つ ClassPrivateProperty に true を返す | E-02 (17行目: `t.isClassPrivateProperty(node)`) | ○ |
| C-10 | isStaticFieldWithValue が非 static ClassProperty に false を返す | E-02 (18行目: `node.static`) | ○ |
| C-11 | isStaticFieldWithValue が value なし static ClassProperty に false を返す | E-02 (19行目: `!!node.value`) | ○ |
| C-12 | isStaticFieldWithValue が ClassMethod に false を返す | E-02 (17行目の型チェック) | ○ |

### isReferenceOrThis 関数（UT-V8S-013 〜 UT-V8S-017）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-13 | isReferenceOrThis が ThisExpression に true を返す | E-02 (37-38行目: `t.isThisExpression(node)`) | ○ |
| C-14 | isReferenceOrThis が指定した name と一致する Identifier に true を返す | E-02 (38行目: `name && t.isIdentifier(node, { name })`) | ○ |
| C-15 | isReferenceOrThis が一致しない Identifier に false を返す | E-02 (38行目の条件) | ○ |
| C-16 | isReferenceOrThis が name undefined の場合 Identifier に false を返す | E-02 (38行目: `name &&` の short-circuit) | ○ |
| C-17 | isReferenceOrThis がその他のノードに false を返す | E-02 (37-38行目の条件) | ○ |

### toRanges 関数（UT-V8S-018 〜 UT-V8S-024）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-18 | toRanges が空配列に空の範囲配列を返す | E-02 (206行目: `if (nums.length === 0) return ranges;`), E-03 (282行目テスト) | ○ |
| C-19 | toRanges が単一要素に単一の範囲を返す | E-02 (208-222行目), E-03 (283-284行目テスト) | ○ |
| C-20 | toRanges が連続する数値を単一の範囲に統合する | E-02 (213-215行目), E-03 (285行目テスト) | ○ |
| C-21 | toRanges が不連続な数値を複数の範囲に分割する | E-02 (216-220行目), E-03 (286-293行目テスト) | ○ |
| C-22 | toRanges が大きな数値に対しても正しく範囲を返す | E-02 (208-222行目), E-03 (284行目テスト: `[10]`) | ○ |
| C-23 | toRanges が昇順でない配列に Error をスローする | E-02 (211-212行目: `if (nums[i] <= nums[i - 1]) { throw new Error(...) }`) | ○ |
| C-24 | toRanges が重複要素を含む配列に Error をスローする | E-02 (211行目: `nums[i] <= nums[i - 1]` により等号で検出) | ○ |

### getPotentiallyBuggyFieldsIndexes 関数（UT-V8S-025 〜 UT-V8S-041）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-25 | 'name' static field のインデックスを返す | E-02 (167-172行目), E-03 (22-25行目テスト) | ○ |
| C-26 | 'length' static field のインデックスを返す | E-02 (167-172行目), E-03 (26-29行目テスト) | ○ |
| C-27 | インスタンス 'name' フィールドは除外される | E-02 (168行目: `static: true`), E-03 (30-33行目テスト) | ○ |
| C-28 | インスタンス 'length' フィールドは除外される | E-02 (168行目), E-03 (34-37行目テスト) | ○ |
| C-29 | プライベート '#name' static field は除外される | E-02 (168行目: `t.isClassProperty`), E-03 (38-41行目テスト) | ○ |
| C-30 | プライベート '#length' static field は除外される | E-02 (168行目), E-03 (42-45行目テスト) | ○ |
| C-31 | 他の要素の後の 'name' static field の正しいインデックス | E-02 (142-173行目のループ処理), E-03 (46-54行目テスト) | ○ |
| C-32 | computed static field のインデックスを返す | E-02 (169行目: `node.computed`), E-03 (64-69行目テスト) | ○ |
| C-33 | static block 後の全 static field のインデックスを返す | E-02 (147-149行目), E-03 (70-78行目テスト) | ○ |
| C-34 | private static field での参照+副作用後の検出 | E-02 (150-163行目), E-03 (79-89行目テスト) | ○ |
| C-35 | public static field での参照+副作用時、そのフィールド自体も含めて検出 | E-02 (167-172行目), E-03 (90-100行目テスト) | ○ |
| C-36 | this 参照+副作用後の public static field を検出 | E-02 (152行目: `isReferenceOrThis`), E-03 (101-111行目テスト) | ○ |
| C-37 | 参照なしの副作用後は安全と判定される | E-02 (161-163行目の条件), E-03 (123-132行目テスト) | ○ |
| C-38 | 副作用なしの参照後は安全と判定される | E-02 (162行目: `path.scope.isPure`), E-03 (143-152行目テスト) | ○ |
| C-39 | 副作用後に参照がある場合の検出 | E-02 (146-172行目), E-03 (162-171行目テスト) | ○ |
| C-40 | computed key での参照による副作用の検出 | E-02 (124-138行目), E-03 (172-180行目テスト) | ○ |
| C-41 | 複合的なクラス構造での正しいインデックス検出 | E-02 (113-176行目), E-03 (181-202行目テスト) | ○ |

### getNameOrLengthStaticFieldsIndexes 関数（UT-V8S-042 〜 UT-V8S-050）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-42 | 'name' static field のインデックスを返す | E-02 (178-193行目), E-03 (215-218行目テスト) | ○ |
| C-43 | 'length' static field のインデックスを返す | E-02 (178-193行目), E-03 (219-222行目テスト) | ○ |
| C-44 | インスタンス 'name' フィールドは除外される | E-02 (185行目: `static: true`), E-03 (223-226行目テスト) | ○ |
| C-45 | インスタンス 'length' フィールドは除外される | E-02 (185行目), E-03 (227-230行目テスト) | ○ |
| C-46 | プライベート '#name' static field は除外される | E-02 (185行目: `t.isClassProperty`), E-03 (231-234行目テスト) | ○ |
| C-47 | プライベート '#length' static field は除外される | E-02 (185行目), E-03 (235-238行目テスト) | ○ |
| C-48 | 他の要素の後の 'name' static field の正しいインデックス | E-02 (182-191行目), E-03 (239-247行目テスト) | ○ |
| C-49 | computed static field は除外される | E-02 (185行目: `computed: false`), E-03 (257-262行目テスト) | ○ |
| C-50 | name と length の両方を持つクラスで両方のインデックスを返す | E-02 (182-191行目), E-03 (263-269行目テスト) | ○ |

### buildFieldsReplacement 関数（UT-V8S-051 〜 UT-V8S-055）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-51 | 単一フィールドに対して正しい StaticBlock を生成する | E-01 (11-32行目) | ○ |
| C-52 | 複数フィールドに対して複数の expressionStatement を含む StaticBlock を生成する | E-01 (17行目: `fields.map`) | ○ |
| C-53 | computed key の場合は key をそのまま使用する | E-01 (19行目: `field.computed ... ? field.key`) | ○ |
| C-54 | 非 computed Identifier key は StringLiteral に変換される | E-01 (21行目: `t.stringLiteral(field.key.name)`) | ○ |
| C-55 | value がない場合は undefined ノードが使用される | E-01 (27行目: `field.value || scope.buildUndefinedNode()`) | ○ |

### プラグイン visitor（UT-V8S-056 〜 UT-V8S-065）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-56 | setPublicClassFields が false の場合、getPotentiallyBuggyFieldsIndexes を使用する | E-01 (44-48行目: 条件分岐) | ○ |
| C-57 | setPublicClassFields が true の場合、getNameOrLengthStaticFieldsIndexes を使用する | E-01 (44-48行目: `setPublicClassFields ? getNameOrLengthStaticFieldsIndexes`) | ○ |
| C-58 | バグ対象フィールドがない場合は変換が行われない | E-01 (50行目: `for` ループが ranges.length 分回る) | ○ |
| C-59 | 連続するバグ対象フィールドが単一の StaticBlock にマージされる | E-01 (50-66行目), E-02 (toRanges による統合) | ○ |
| C-60 | 不連続のバグ対象フィールドは別々の StaticBlock に変換される | E-01 (50-66行目), E-02 (toRanges による分割) | ○ |
| C-61 | 変換後に元のフィールドが削除される | E-01 (63-65行目: `path.get("body.body")[j].remove()`) | ○ |
| C-62 | 範囲を逆順で処理することでインデックスずれを防ぐ | E-01 (50行目: `for (let i = ranges.length - 1; i >= 0; i--)`) | ○ |
| C-63 | プラグイン名が正しく設定される | E-01 (40行目: `name: "bugfix-v8-static-class-fields-redefine-readonly"`) | ○ |
| C-64 | Babel 7.0.0 以上で動作する | E-01 (35行目: `api.assertVersion(REQUIRED_VERSION("^7.0.0-0 || ^8.0.0"))`) | ○ |
| C-65 | Babel 8.0.0 以上で動作する | E-01 (35行目) | ○ |

### Visitor ヘルパー（UT-V8S-066 〜 UT-V8S-070）
| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-66 | hasReferenceVisitor が指定した名前と一致する参照を検出する | E-02 (23-29行目) | ○ |
| C-67 | hasReferenceVisitor が独自バインディングを持つスコープをスキップする | E-02 (30-34行目: `if (path.scope.hasOwnBinding(name)) { path.skip(); }`) | ○ |
| C-68 | hasReferenceOrThisVisitor が this 参照を検出する | E-02 (41-47行目) | ○ |
| C-69 | ArrowFunction は this をスキップしない | E-02 (49行目: `if (path.isArrowFunctionExpression()) return;`) | ○ |
| C-70 | 通常の関数は this をスキップする | E-02 (53行目: `path.skip()`) | ○ |

## 4) 不足情報（Unknown / Missing）
- なし（全テストケースにソースコードまたは既存テストによる根拠あり）

## 5) リスクフラグ（レビュー観点）
- 0: 低リスク - 全テストケースが既存のソースコードおよび既存テストと整合性が取れている
- このプラグインは V8 エンジンの特定のバグ（crbug.com/v8/12421）に対応するためのものであり、テストケースはそのバグに関連するエッジケースを網羅している

## 6) レビュアーチェックリスト（最小）
- [ ] isNameOrLength 関数のテストケースが 'name' と 'length' の両方のケースを網羅しているか確認
- [ ] toRanges 関数のエラーハンドリング（昇順でない配列）のテストが適切か確認
- [ ] getPotentiallyBuggyFieldsIndexes のテストが、既存テストファイル（E-03）のケースと整合しているか確認
- [ ] setPublicClassFields assumption による分岐のテストが両方のパスをカバーしているか確認
- [ ] buildFieldsReplacement 関数が defineProperty ヘルパーを正しく使用しているかの確認
- [ ] 連続フィールドのマージと不連続フィールドの分離が正しく動作するかの確認
