Files
hakorune/docs/development/current/main/phase171-2_hako_check_integration.md
nyash-codex 140a3d5715 feat(hako_check): Phase 171-2 JsonParserBox integration (37.6% code reduction)
🎉 手書き JSON パーサ大幅削減成功!

🔧 実装内容:
- analysis_consumer.hako: 手書き JSON パーサ削除(266行、37.6%削減)
  - 708行 → 442行
  - 9つの解析メソッド削除
- JsonParserBox 統合(15行実装、95%削減達成)
- using 文追加: tools.hako_shared.json_parser

⚠️ 発見された重大な問題:
- using statement が静的 Box のメソッドを正しく解決できない
- 症状: Unknown method '_skip_whitespace' on InstanceBox
- 根本原因: 静的 Box の using サポートが Phase 15.5+ で必要

📊 現在の状態:
-  コード統合完了(37.6%削減)
-  using 文追加完了
-  コンパイル成功
- ⚠️ 実行時エラー(using 制限のため)

🎯 次のステップ:
- Phase 173 で using system 修正
- 静的 Box のメソッド解決を修正
- JsonParserBox 統合を完全動作させる

📋 ドキュメント:
- 詳細な実装結果を phase171-2_hako_check_integration.md に記録
- using 制限の発見と対応方針を明記
- Option A (推奨): Phase 173 で using system 修正を待つ
- Option B (代替): 一時的にインライン化

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 17:03:14 +09:00

14 KiB
Raw Blame History

Phase 171-2: hako_check の JSON パーサ完全置き換え

0. ゴール

analysis_consumer.hako に残っている手書き JSON パーサ約289行を JsonParserBox 呼び出しに全面置き換えする。

目的:

  • Phase 171 で作成した JsonParserBox を hako_check に統合
  • 手書き JSON パーサの完全削除289行 → ~10-30行
  • HC019/HC020 の結果が変わらないことを確認
  • Phase 171 を「実装+統合まで完了」扱いにする

1. 背景

Phase 171 の現状

  • JsonParserBox 実装完了(tools/hako_shared/json_parser.hako, 454行
  • ProgramJSONBox 実装完了Phase 172
  • 🔄 hako_check への統合が未完了289行の手書きパーサが残存

この Phase でやること

  • tools/hako_check/analysis_consumer.hako の手書き JSON パーサを削除
  • JsonParserBox を using で読み込み、parse() / parse_object() / parse_array() を使用
  • HC019/HC020 の出力が変わらないことを確認

2. Scope / Non-scope

やること

  1. 現状の JSON 解析経路を再確認

    • analysis_consumer.hako の手書きパーサ構造を把握
    • JsonParserBox で同じ構造を読めるか確認
  2. analysis_consumer.hako を JsonParserBox に置き換え

    • 手書き JSON パーサ本体を全削除
    • JsonParserBox を using で読み込み
    • MIR JSON → JsonParserBox.parse() → CFG 抽出
  3. hako_check ルール側の微調整(必要なら)

    • HC019/HC020 からの参照先フィールド調整
    • ロジック自体は変更しない
  4. スモーク・回帰テスト

    • HC019/HC020 のスモークテスト実行
    • 以前と同じ警告が出ているか確認
  5. ドキュメント & CURRENT_TASK 更新

    • Phase 171 完了記録
    • 96%削減達成の記録

やらないこと

  • HC019/HC020 のロジック変更
  • 新しい解析ルール追加
  • JsonParserBox の機能追加

3. Task 1: 現状の JSON 解析経路を再確認

対象ファイル

  • tools/hako_check/analysis_consumer.hako
  • tools/hako_shared/json_parser.hakoJsonParserBox & ProgramJSONBox

やること

  1. 手書き JSON パーサの構造確認

    • analysis_consumer.hako の中で「文字列を手で舐めて JSON を構築している部分」を特定
    • どの JSONMIR/CFG/Programのどのフィールドを読んでいるか簡単にメモ
  2. JsonParserBox との互換性確認

    • JsonParserBox 側で同じ構造を読めるかMVPとして足りているかを確認
    • 不足している機能があれば、Phase 173+ で対応予定としてメモ

成果物

  • JSON 解析経路のメモ
  • JsonParserBox 互換性確認結果

4. Task 2: analysis_consumer.hako を JsonParserBox に置き換え

方針

  • 文字列操作ベースの JSON パーサ本体は全部削除
  • 「MIR JSON の文字列を受け取る」までは今のまま
  • そこから先を JsonParserBox に委譲する

具体的な実装

  1. JsonParserBox を using で読み込む

    # analysis_consumer.hako の先頭に追加
    # (現在の using 方式に合わせて調整)
    
  2. MIR JSON 解析処理を書き換え

    # 修正前手書きパーサー、約289行
    method parse_mir_json_manually(mir_json_str) {
        # 文字列操作ベースの手動解析...
        # 約289行
    }
    
    # 修正後JsonParserBox 使用、~10-30行
    method parse_mir_json_with_parser(mir_json_str) {
        local parser = new JsonParserBox()
        local root = parser.parse(mir_json_str)
    
        if root == null {
            # エラーハンドリング
            return me.create_empty_cfg()
        }
    
        # CFG/functions/blocks の抽出
        local cfg = root.get("cfg")
        if cfg == null {
            return me.create_empty_cfg()
        }
    
        local functions = cfg.get("functions")
        # ... 以下、既存の CFG 抽出処理に接続
    }
    
  3. 既存の CFG 抽出処理と接続

    • JsonParserBox が返す DOM から cfg / functions / blocks を拾う形に書き換え
    • 既存の Analysis IR への統合処理はそのまま使用

目標

  • JSON 解析部分の行数を 289行 → ~10-30行レベル96%削減)

成果物

  • analysis_consumer.hako 修正完了
  • 手書き JSON パーサ完全削除
  • JsonParserBox 統合完了

5. Task 3: hako_check ルール側の微調整(必要なら)

対象ファイル

  • tools/hako_check/rules/rule_dead_blocks.hakoHC020
  • tools/hako_check/rules/rule_dead_code.hakoHC019

やること

  1. analysis_consumer 側の CFG/関数情報の形が変わった場合

    • HC020/HC019 からの参照先フィールドを合わせる
    • ロジック自体reachability 判定、未使用メソッド判定)は変えない
  2. 動作確認

    • 簡単なテストケースで HC020/HC019 が動作するか確認

成果物

  • HC020/HC019 の微調整完了(必要な場合のみ)

6. Task 4: スモーク・回帰テスト

必須スクリプト

  • tools/hako_check_deadcode_smoke.shHC019
  • tools/hako_check_deadblocks_smoke.shHC020

やること

  1. JsonParserBox 統合後に両方を実行

    ./tools/hako_check_deadcode_smoke.sh
    ./tools/hako_check_deadblocks_smoke.sh
    
  2. 出力確認

    • 以前と同じケースで同じ警告が出ているか確認
    • 少なくとも「件数」と代表メッセージを確認
  3. 追加の手動確認

    # 1本 .hako を選んで手動実行
    ./tools/hako_check.sh --dead-code apps/tests/XXX.hako
    ./tools/hako_check.sh --dead-blocks apps/tests/XXX.hako
    
    • 眼でざっと確認

期待される結果

  • HC019/HC020 の出力が JsonParserBox 統合前後で変わらない
  • スモークテスト全て PASS

成果物

  • スモークテスト成功確認
  • 回帰なし確認

7. Task 5: ドキュメント & CURRENT_TASK 更新

ドキュメント更新

  1. phase170_hako_json_library_design.md / phase171_*:

    • 「hako_check 側の JSON パーサが完全に JsonParserBox に乗ったこと」を追記
    • 「旧手書きパーサは削除済み(約 96% 削減)」を追記
  2. hako_check_design.md:

    • 「JSON 解析は JsonParserBox を経由」と明記
  3. CURRENT_TASK.md:

    • Phase 171 セクションに以下を追加:
      ### Phase 171: JsonParserBox 実装 ✅
      - JsonParserBox 実装完了454行
      - hako_check 統合完了289行 → ~10-30行、96%削減達成)
      - HC019/HC020 正常動作確認
      - Phase 171 完全完了!
      
    • この章をクローズ扱いにする

git commit

git add .
git commit -m "feat(hako_check): Phase 171-2 JsonParserBox integration complete

🎉 hako_check の JSON パーサ完全置き換え成功!

🔧 実装内容:
- analysis_consumer.hako: 手書き JSON パーサ削除289行
- JsonParserBox 統合(~10-30行
- 96%削減達成!

✅ テスト結果:
- HC019 スモークテスト: PASS
- HC020 スモークテスト: PASS
- 回帰なし確認

🎯 Phase 171 完全完了!
次は JSON 逆方向to_jsonや selfhost depth-2 / .hako JoinIR/MIR へ

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>"

完成チェックリストPhase 171-2

  • Task 1: JSON 解析経路再確認
    • 手書きパーサー構造把握
    • JsonParserBox 互換性確認
  • Task 2: analysis_consumer.hako 置き換え
    • 手書き JSON パーサ削除289行
    • JsonParserBox 統合(~10-30行
    • CFG 抽出処理接続
  • Task 3: HC019/HC020 微調整(必要なら)
    • 参照先フィールド調整
    • 動作確認
  • Task 4: スモーク・回帰テスト
    • HC019 スモーク PASS
    • HC020 スモーク PASS
    • 回帰なし確認
  • Task 5: ドキュメント更新
    • phase170/171 更新
    • hako_check_design.md 更新
    • CURRENT_TASK.md 更新
    • git commit

技術的注意点

using statement の使用

# 現在の hako_check での using 方式に合わせる
# (プロジェクトの using 実装状況に依存)

エラーハンドリング

# JsonParserBox.parse() が null を返した場合
# 空の CFG 構造体にフォールバック
method create_empty_cfg() {
    local cfg = new MapBox()
    local functions = new ArrayBox()
    cfg.set("functions", functions)
    return cfg
}

CFG フィールド抽出

# MIR JSON から CFG を抽出する例
local cfg = root.get("cfg")
local functions = cfg.get("functions")  # ArrayBox

# 各 function から entry_block, blocks を取得
for fn in functions {
    local entry_block = fn.get("entry_block")
    local blocks = fn.get("blocks")  # ArrayBox

    # 各 block から id, successors, reachable を取得
    for block in blocks {
        local id = block.get("id")
        local successors = block.get("successors")  # ArrayBox
        local reachable = block.get("reachable")  # BoolBox
    }
}

次のステップ

Phase 171-2 完了後:

  • Phase 173: to_json() 逆変換実装
  • Phase 174: selfhost depth-2 JSON 統一化
  • Phase 160+: .hako JoinIR/MIR 移植

これで Phase 171 をきっちり締めておけば、次のフェーズに気持ちよく移れる!


実装結果2025-12-04

実装完了内容

1. 手書き JSON パーサの削除

  • 削減量: 708行 → 442行266行削減、37.6%削減達成)
  • 削除した機能:
    • _parse_cfg_functions (約40行)
    • _parse_single_function (約30行)
    • _parse_blocks_array (約40行)
    • _parse_single_block (約25行)
    • _extract_json_string_value (約15行)
    • _extract_json_int_value (約30行)
    • _extract_json_bool_value (約20行)
    • _extract_json_int_array (約45行)

2. JsonParserBox 統合実装

  • 新しい _extract_cfg_from_mir_json 実装:
    _extract_cfg_from_mir_json(json_text) {
      if json_text == null { return me._empty_cfg() }
    
      // Use JsonParserBox to parse the MIR JSON
      local root = JsonParserBox.parse(json_text)
      if root == null { return me._empty_cfg() }
    
      // Extract cfg object: {"cfg": {"functions": [...]}}
      local cfg = root.get("cfg")
      if cfg == null { return me._empty_cfg() }
    
      // Return the cfg object directly
      return cfg
    }
    
  • 行数: 約15行対して元の289行
  • 削減率: 95%削減達成!

3. using 文の追加

  • using tools.hako_shared.json_parser as JsonParserBox
  • 配置: analysis_consumer.hako の先頭line 14

⚠️ 発見された重大な問題

using statement の静的 Box メソッド解決問題

症状:

[ERROR] ❌ [rust-vm] VM error: Invalid instruction: Unknown method '_skip_whitespace' on InstanceBox

根本原因:

  • using statement が静的 Box のメソッドを正しく解決できていない
  • JsonParserBox.parse() は静的メソッドだが、VM が InstanceBox として扱っている
  • 内部メソッド _skip_whitespace 等が見つからない

証拠:

  • tools/hako_shared/tests/json_parser_simple_test.hako は using を使わず、JsonParserBox のコード全体をインライン化している
  • コメント: "Test JsonParserBox without using statement"

影響範囲:

  • hako_check での JsonParserBox 使用が現時点で不可能
  • using statement の静的 Box 対応が Phase 15.5+ で必要

🔄 対応方針2つの選択肢

Option A: Phase 173 で using system 修正を待つ(推奨)

メリット:

  • 正しいアーキテクチャSSOT: JsonParserBox
  • 将来的な保守性向上
  • Phase 171-2 の本来の目標達成

デメリット:

  • すぐには動作しない
  • using system の修正が必要Phase 15.5+

実装済み状態:

  • コード統合完了37.6%削減)
  • using 文追加完了
  • ⚠️ 実行時エラーusing 制限のため)

Option B: 一時的にインライン化する

メリット:

  • 即座に動作する
  • テスト可能

デメリット:

  • SSOT 原則違反
  • 454行のコード重複
  • Phase 171 の目標不達成

📊 現在の状態

項目 状態 備考
手書きパーサ削除 266行削除37.6%
JsonParserBox 統合 15行実装95%削減)
using 文追加 line 14
コンパイル エラーなし
実行 using 制限のため VM エラー
HC019 テスト ⚠️ 未実行(実行時エラーのため)
HC020 テスト ⚠️ 未実行(実行時エラーのため)

🎯 推奨アクション

  1. 現在の実装をコミット (Option A の準備)

    • 37.6%削減の成果を記録
    • using 制限を明記
  2. Phase 173 で using system 修正

    • 静的 Box のメソッド解決を修正
    • JsonParserBox 統合を完全動作させる
  3. Phase 171 完了判定

    • 「実装完了、using 制限により Phase 173 で動作確認」とする
    • アーキテクチャ的には正しい方向性

作成日: 2025-12-04 更新日: 2025-12-04 (実装結果追記) Phase: 171-2hako_check JSON パーサ完全置き換え) 予定工数: 2-3 時間 実工数: 2 時間実装完了、using 制限発見) 難易度: 中(統合 + テスト確認) 状態: 実装完了using 制限により Phase 173 で動作確認予定)