---
generated_at: 2026-03-01 10:30:00
metrics:
  claims_total: 100
  claims_with_evidence: 100
  claims_without_evidence: 0
confidence_derived: 1.00
---

# 根拠レポート：babel-helper-create-class-features-plugin 単体テストケース一覧

## 本レポートについて

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

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

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

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

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

---

## 1) サマリー（まず見るところ）
- 総合信頼度（derived）：**1.00**
  - 根拠あり：100 / 100、根拠なし：0
- 優先レビュー（高）
  1. なし（すべてのテストケースに根拠あり）

## 2) 参照した情報（Evidence一覧）
> ここに「実在するもの」だけ列挙。

- E-01: `packages/babel-helper-create-class-features-plugin/src/index.ts`（メインエントリーポイント、createClassFeaturePlugin関数）
- E-02: `packages/babel-helper-create-class-features-plugin/src/features.ts`（機能フラグ管理、FEATURES定数、enableFeature、isLoose、shouldTransform関数）
- E-03: `packages/babel-helper-create-class-features-plugin/src/fields.ts`（プライベートフィールド/メソッド変換、buildPrivateNamesMap、buildPrivateNamesNodes、transformPrivateNamesUsage、buildFieldsInitNodes関数）
- E-04: `packages/babel-helper-create-class-features-plugin/src/decorators.ts`（デコレーター変換、hasOwnDecorators、hasDecorators、transformClass、buildNamedEvaluationVisitor関数）
- E-05: `packages/babel-helper-create-class-features-plugin/src/typescript.ts`（TypeScript検証、assertFieldTransformed関数）
- E-06: `packages/babel-helper-create-class-features-plugin/src/misc.ts`（ユーティリティ、injectInitialization、memoiseComputedKey、extractComputedKeys関数）

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

| Claim ID | 主張 | Evidence | 状態 |
|---|---|---|---|
| C-01 | createClassFeaturePluginがデコレーター機能でcreateDecoratorTransformを返す | E-01（L56-58: `if (feature & FEATURES.decorators) { return createDecoratorTransform(...) }`） | ○ |
| C-02 | privateFieldsAsPropertiesとprivateFieldsAsSymbolsの同時有効でエラー | E-01（L68-73: `throw new Error("Cannot enable both...")`） | ○ |
| C-03 | looseモードでassumption設定時に警告出力 | E-01（L77-103: `console.warn(...)`） | ○ |
| C-04 | PluginObjectにname、manipulateOptions、inheritsが含まれる | E-01（L106-110: `return { name, manipulateOptions, inherits, ... }`） | ○ |
| C-05 | preフックでenableFeatureが呼び出される | E-01（L111-120: `pre(file) { enableFeature(file, feature, loose ?? false); ... }`） | ○ |
| C-06 | バージョンキーがfile.setで設定される | E-01（L114-119: `file.set(versionKey, PACKAGE_JSON.version)`） | ○ |
| C-07 | shouldTransformがfalseで早期リターン | E-01（L125: `if (!shouldTransform(path, file)) return;`） | ○ |
| C-08 | propsが空で早期リターン | E-01（L197: `if (!props.length) return;`） | ○ |
| C-09 | 重複プライベートフィールドでエラー | E-01（L156-184: `throw path.buildCodeFrameError("Duplicate private field")`） | ○ |
| C-10 | getter/setterペアは重複エラーにならない | E-01（L154-171: getter/setter処理ロジック） | ○ |
| C-11 | enableFeatureで機能有効化 | E-02（L30-41: `enableFeature`関数定義） | ○ |
| C-12 | 既有効化機能は再有効化されない | E-02（L38: `if (!hasFeature(file, feature)) { ... }`） | ○ |
| C-13 | looseモード不整合でエラー | E-02（L43-60: `throw new Error("'loose' mode configuration must be the same...")`） | ○ |
| C-14 | isLooseがlooseモードでtrue | E-02（L81-83: `return !!(file.get(looseKey) & feature);`） | ○ |
| C-15 | isLooseが非looseでfalse | E-02（L81-83: 同上） | ○ |
| C-16 | shouldTransformがデコレーター有効でtrue | E-02（L171-175: `if (decoratorPath || privateMethodPath || staticBlockPath) { return true; }`） | ○ |
| C-17 | デコレーター機能無効でエラー | E-02（L129-139: `throw path.buildCodeFrameError("Decorators are not enabled...")`） | ○ |
| C-18 | プライベートメソッド機能無効でエラー | E-02（L141-146: `throw privateMethodPath.buildCodeFrameError(...)`） | ○ |
| C-19 | フィールド機能無効でエラー | E-02（L148-162: `throw path.buildCodeFrameError("Class fields are not enabled...")`） | ○ |
| C-20 | 静的ブロック機能無効でエラー | E-02（L164-169: `throw path.buildCodeFrameError("Static class blocks are not enabled...")`） | ○ |
| C-21 | 変換対象なしでfalse | E-02（L183: `return false;`） | ○ |
| C-22 | buildPrivateNamesMapでPrivateNameMetadata生成 | E-03（L32-116: `buildPrivateNamesMap`関数定義） | ○ |
| C-23 | 非静的プライベートメソッドでclassBrandId生成 | E-03（L48-53: `classBrandId ??= prop.scope.generateUidIdentifier(...)`） | ○ |
| C-24 | getterでgetId設定 | E-03（L66-84: `if (prop.node.kind === "get") { ... update.getId = ... }`） | ○ |
| C-25 | setterでsetId設定 | E-03（L85-107: `if (prop.node.kind === "set") { ... update.setId = ... }`） | ○ |
| C-26 | privateFieldsAsPropertiesでclassPrivateFieldLooseKey使用 | E-03（L144-147: `init = t.callExpression(state.addHelper("classPrivateFieldLooseKey"), ...)`） | ○ |
| C-27 | privateFieldsAsSymbolsでSymbol()使用 | E-03（L148-149: `init = t.callExpression(t.identifier("Symbol"), ...)`） | ○ |
| C-28 | specモードインスタンスフィールドでWeakMap使用 | E-03（L154-157: `init = t.newExpression(t.identifier(isMethod ? "WeakSet" : "WeakMap"), [])`） | ○ |
| C-29 | specモードインスタンスメソッドでWeakSet使用 | E-03（L154-157: 同上） | ○ |
| C-30 | ネストクラスでnestedVisitor使用 | E-03（L179-229: `privateNameVisitorFactory`関数定義） | ○ |
| C-31 | buildCheckInRHSでinRHSIsObject=trueで入力返却 | E-03（L281-288: `if (inRHSIsObject || ...) return rhs;`） | ○ |
| C-32 | buildCheckInRHSでcheckInRHSヘルパー呼び出し | E-03（L287: `return t.callExpression(file.addHelper("checkInRHS"), [rhs]);`） | ○ |
| C-33 | transformPrivateNamesUsageで空マップ早期リターン | E-03（L788: `if (!privateNamesMap.size) return;`） | ○ |
| C-34 | privateFieldsAsPropertiesでlooseハンドラー使用 | E-03（L791-793: `const handler = privateFieldsAsProperties ? privateNameHandlerLoose : privateNameHandlerSpec;`） | ○ |
| C-35 | privateFieldsAsProperties=falseでspecハンドラー使用 | E-03（L791-793: 同上） | ○ |
| C-36 | 静的プライベートフィールドlooseでbuildPrivateFieldInitLoose | E-03（L1372-1379: `case isStatic && isPrivate && isField && privateFieldsAsSymbolsOrProperties: staticNodes.push(buildPrivateFieldInitLoose(...))`） | ○ |
| C-37 | 静的プライベートフィールドspecでbuildPrivateStaticFieldInitSpec | E-03（L1380-1392: `case isStatic && isPrivate && isField && !privateFieldsAsSymbolsOrProperties: staticNodes.push(buildPrivateStaticFieldInitSpec(...))`） | ○ |
| C-38 | インスタンスプライベートフィールドlooseで初期化 | E-03（L1409-1416: `case isInstance && isPrivate && isField && privateFieldsAsSymbolsOrProperties: instanceNodes.push(buildPrivateFieldInitLoose(...))`） | ○ |
| C-39 | インスタンスプライベートフィールドspecでclassPrivateFieldInitSpec | E-03（L1417-1429: `case isInstance && isPrivate && isField && !privateFieldsAsSymbolsOrProperties: instanceNodes.push(buildPrivateInstanceFieldInitSpec(...))`） | ○ |
| C-40 | パブリックフィールドsetPublicClassFieldsで代入式 | E-03（L1500-1501: `case isInstance && isPublic && isField && setPublicClassFields: instanceNodes.push(buildPublicFieldInitLoose(...))`） | ○ |
| C-41 | パブリックフィールド非setPublicClassFieldsでdefineProperty | E-03（L1502-1508: `case isInstance && isPublic && isField && !setPublicClassFields: ... buildPublicFieldInitSpec(...))`） | ○ |
| C-42 | 静的ブロック単一式でそのまま挿入 | E-03（L1356-1361: `if (blockBody.length === 1 && t.isExpressionStatement(blockBody[0])) { staticNodes.push(inheritPropComments(blockBody[0], prop)); }`） | ○ |
| C-43 | 静的ブロック複数文でIIFEラップ | E-03（L1362-1369: `staticNodes.push(t.inheritsComments(template.statement.ast\`(() => { ${blockBody} })()\`, ...))`） | ○ |
| C-44 | wrapClassでクラス式にスコープpush | E-03（L1550-1554: `if (path.isClassExpression()) { path.scope.push({ id: ref! }); ... }`） | ○ |
| C-45 | 静的プライベートフィールドgetでassertClassBrand | E-03（L451-458: `return buildStaticPrivateFieldAccess(t.callExpression(file.addHelper("assertClassBrand"), ...))`） | ○ |
| C-46 | インスタンスプライベートフィールドgetでclassPrivateFieldGet2 | E-03（L515-518: `return t.callExpression(file.addHelper("classPrivateFieldGet2"), [cloneId(id), this.receiver(member)])`） | ○ |
| C-47 | プライベートメソッドgetでassertClassBrand | E-03（L508-512: `return t.callExpression(file.addHelper("assertClassBrand"), [t.cloneNode(id), this.receiver(member), cloneId(methodId!)])`） | ○ |
| C-48 | プライベートgetterでclassPrivateGetter | E-03（L501-505: `return t.callExpression(file.addHelper("classPrivateGetter"), [t.cloneNode(id), this.receiver(member), cloneId(getId)])`） | ○ |
| C-49 | setterのみgetでwriteOnlyError | E-03（L494-499: `if (!getId) { return t.sequenceExpression([this.receiver(member), writeOnlyError(file, name)]); }`） | ○ |
| C-50 | プライベートフィールドsetでclassPrivateFieldSet2 | E-03（L611-615: `return t.callExpression(file.addHelper("classPrivateFieldSet2"), [cloneId(id), this.receiver(member), value])`） | ○ |
| C-51 | プライベートsetterでclassPrivateSetter | E-03（L595-601: `return t.callExpression(file.addHelper("classPrivateSetter"), [t.cloneNode(id), cloneId(setId), this.receiver(member), value])`） | ○ |
| C-52 | getterのみsetでreadOnlyError | E-03（L604-608: `return t.sequenceExpression([this.receiver(member), value, readOnlyError(file, name)])`） | ○ |
| C-53 | プライベート要素deleteでエラー | E-03（L716-720: `delete() { throw new Error("Internal Babel error: deleting private elements is a parsing error."); }`） | ○ |
| C-54 | looseモードgetでclassPrivateFieldLooseBase | E-03（L723-733: `get(member) { ... return template.expression\`BASE(REF, PROP)[PROP]\`({ BASE: file.addHelper("classPrivateFieldLooseBase"), ... })`） | ○ |
| C-55 | looseモードsetでエラー | E-03（L736-739: `set() { throw new Error("private name handler with loose = true don't need set()"); }`） | ○ |
| C-56 | hasOwnDecoratorsでデコレーター存在true | E-04（L12-15: `return !!node.decorators?.length;`） | ○ |
| C-57 | hasOwnDecoratorsでデコレーター不存在false | E-04（L12-15: 同上） | ○ |
| C-58 | hasDecoratorsでクラス内デコレーター確認 | E-04（L17-19: `return hasOwnDecorators(node) || node.body.body.some(hasOwnDecorators);`） | ○ |
| C-59 | incrementIdでA-Zインクリメント | E-04（L49-69: `incrementId`関数定義） | ○ |
| C-60 | incrementIdでZ->a遷移 | E-04（L58-60: `if (current === charCodes.uppercaseZ) { id[idx] = charCodes.lowercaseA; }`） | ○ |
| C-61 | incrementIdでz桁上げ | E-04（L61-64: `else if (current === charCodes.lowercaseZ) { id[idx] = charCodes.uppercaseA; incrementId(id, idx - 1); }`） | ○ |
| C-62 | createPrivateUidGeneratorForClassで一意名生成 | E-04（L78-99: `createPrivateUidGeneratorForClass`関数定義） | ○ |
| C-63 | createLazyPrivateUidGeneratorForClassで遅延生成 | E-04（L107-119: `if (!generator) { generator = createPrivateUidGeneratorForClass(classPath); }`） | ○ |
| C-64 | replaceClassWithVarでClassDeclarationリネーム | E-04（L129-177: `replaceClassWithVar`関数定義、L138-147: ClassDeclaration分岐） | ○ |
| C-65 | replaceClassWithVarでClassExpressionシーケンス置換 | E-04（L148-176: ClassExpression分岐） | ○ |
| C-66 | generateClassPropertyでPrivateNameからClassPrivateProperty | E-04（L179-189: `if (key.type === "PrivateName") { return t.classPrivateProperty(...); }`） | ○ |
| C-67 | generateClassPropertyでIdentifierからClassProperty | E-04（L179-189: `else { return t.classProperty(...); }`） | ○ |
| C-68 | addProxyAccessorsForでgetter/setter挿入 | E-04（L203-263: `addProxyAccessorsFor`関数定義） | ○ |
| C-69 | extractProxyAccessorsForでArrowFunction配列返却 | E-04（L265-276: `extractProxyAccessorsFor`関数定義） | ○ |
| C-70 | getComputedKeyLastElementでシーケンス最後取得 | E-04（L287-296: `if (path.isSequenceExpression()) { ... return getComputedKeyLastElement(expressions[expressions.length - 1]); }`） | ○ |
| C-71 | getComputedKeyMemoiserで定数式クローン返却 | E-04（L308-324: `if (element.isConstantExpression()) { return t.cloneNode(path.node); }`） | ○ |
| C-72 | getComputedKeyMemoiserで未メモ化エラー | E-04（L320-323: `throw new Error("Internal Error: the computed key ... has not yet been memoised.")`） | ○ |
| C-73 | maybeSequenceExpressionで空配列void 0 | E-04（L833-837: `if (exprs.length === 0) return t.unaryExpression("void", t.numericLiteral(0));`） | ○ |
| C-74 | maybeSequenceExpressionで1要素返却 | E-04（L835: `if (exprs.length === 1) return exprs[0];`） | ○ |
| C-75 | maybeSequenceExpressionで複数要素シーケンス | E-04（L836: `return t.sequenceExpression(exprs);`） | ○ |
| C-76 | toSortedDecoratorInfoで正しい順序ソート | E-04（L639-650: `toSortedDecoratorInfo`関数定義） | ○ |
| C-77 | generateDecorationListでzip化 | E-04（L665-682: `generateDecorationList`関数定義） | ○ |
| C-78 | checkPrivateMethodUpdateErrorで更新エラー | E-04（L928-973: `checkPrivateMethodUpdateError`関数定義） | ○ |
| C-79 | transformClassでデコレーターなしundefined | E-04（L1142-1155: `if (!classDecorators && !hasElementDecorators) { ... return; }`） | ○ |
| C-80 | transformClassでクラスデコレーターclassInitLocal生成 | E-04（L1210-1214: `classInitLocal = generateLetUidIdentifier(scopeParent, "initClass");`） | ○ |
| C-81 | transformClassで要素デコレーターelementDecoratorInfo生成 | E-04（L1157-1583: 要素デコレーター処理ロジック） | ○ |
| C-82 | buildNamedEvaluationVisitorでVariableDeclarator処理 | E-04（L2132-2143: `VariableDeclarator(path, state) { ... }`） | ○ |
| C-83 | buildNamedEvaluationVisitorでAssignmentExpression処理 | E-04（L2144-2158: `AssignmentExpression(path, state) { ... }`） | ○ |
| C-84 | buildNamedEvaluationVisitorでObjectExpression処理 | E-04（L2171-2204: `ObjectExpression(path, state) { ... }`） | ○ |
| C-85 | defaultでExportDefaultDeclaration分割 | E-04（L2331-2351: `ExportDefaultDeclaration(path, state) { ... path.splitExportDeclaration() ... }`） | ○ |
| C-86 | assertFieldTransformedでdeclareエラー | E-05（L5-16: `if (path.node.declare || ...) { throw path.buildCodeFrameError(...); }`） | ○ |
| C-87 | assertFieldTransformedでdefiniteエラー | E-05（L5-16: 同上） | ○ |
| C-88 | assertFieldTransformedで通常フィールド正常 | E-05（L5-16: 条件に該当しなければエラーなし） | ○ |
| C-89 | injectInitializationでコンストラクタ生成 | E-06（L65-122: `injectInitialization`関数定義、L76-92: 新規コンストラクタ生成） | ○ |
| C-90 | injectInitializationで派生クラスsuper含む | E-06（L84-86: `newConstructor.body.body.push(template.statement.ast\`super(...args)\`)`） | ○ |
| C-91 | injectInitializationで派生クラスsuper後挿入 | E-06（L98-118: bareSuper処理ロジック） | ○ |
| C-92 | injectInitializationで基底クラス先頭挿入 | E-06（L119-121: `constructor.get("body").unshiftContainer("body", nodes);`） | ○ |
| C-93 | injectInitializationで空nodes早期リターン | E-06（L72: `if (!nodes.length) return;`） | ○ |
| C-94 | memoiseComputedKeyでUID参照undefined | E-06（L138-166: `const isUidReference = t.isIdentifier(keyNode) && scope.hasUid(keyNode.name); if (isUidReference) { return; }`） | ○ |
| C-95 | memoiseComputedKeyでメモ化済みクローン返却 | E-06（L147-152: `if (isMemoiseAssignment) { return t.cloneNode(keyNode ...); }`） | ○ |
| C-96 | memoiseComputedKeyで新規メモ化 | E-06（L153-166: 代入式生成ロジック） | ○ |
| C-97 | extractComputedKeysでメモ化 | E-06（L169-205: `extractComputedKeys`関数定義） | ○ |
| C-98 | extractComputedKeysで定数キー非メモ化 | E-06（L191-200: `if (!computedKey.isConstantExpression()) { ... }`） | ○ |
| C-99 | extractComputedKeysでTDZエラー処理 | E-06（L182-186: `handleClassTDZ`呼び出し、L34-49: `handleClassTDZ`定義） | ○ |
| C-100 | buildFieldsInitNodesでname/length特殊処理 | E-03（L1393-1402: `if (!isNameOrLength(prop.node)) { ... } // falls through`） | ○ |

## 4) 不足情報（Unknown / Missing）
- なし（すべてのテストケースに対応するソースコード根拠が存在）

## 5) リスクフラグ（レビュー観点）
- 0（低リスク）：すべてのテストケースがソースコードから直接導出されている

## 6) レビュアーチェックリスト（最小）
- [ ] テストケース番号に重複がないか確認
- [ ] 各テスト観点（正常系/異常系/境界値）のバランスが適切か確認
- [ ] 優先度の設定が妥当か確認（高：セキュリティ・データ整合性関連、中：通常機能、低：ユーティリティ）
- [ ] 期待結果が具体的かつ検証可能か確認
- [ ] 既存テストファイル（test/index.js）との重複・整合性確認
