Files
hakorune/CURRENT_TASK.md
nyash-codex d4597dacfa feat(joinir): Phase 245C - Function parameter capture + test fix
Extend CapturedEnv to include function parameters used in loop conditions,
enabling ExprLowerer to resolve variables like `s` in `loop(p < s.length())`.

Phase 245C changes:
- function_scope_capture.rs: Add collect_names_in_loop_parts() helper
- function_scope_capture.rs: Extend analyze_captured_vars_v2() with param capture logic
- function_scope_capture.rs: Add 4 new comprehensive tests

Test fix:
- expr_lowerer/ast_support.rs: Accept all MethodCall nodes for syntax support
  (validation happens during lowering in MethodCallLowerer)

Problem solved: "Variable not found: s" errors in loop conditions

Test results: 924/924 PASS (+13 from baseline 911)

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 13:13:08 +09:00

7.8 KiB
Raw Blame History

Current Task

このファイルは「いま何に集中しているか」と「次にやり得る候補」だけを書く軽量ビューだよ。
詳細なログや過去フェーズの記録は docs/development/current/main/ 以下の各 phase-*.md
docs/development/current/main/joinir-architecture-overview.md を真実のソースとして扱うよ。


🎯 今フォーカスしているテーマ2025-12-10 時点のスナップショット)

0. JoinIR / ExprLowerer / Pattern24 ラインPhase 230244 完了)

  • Pattern14while / break / ifPHI / continue P5(Trim) でループ lowering を JoinIR 経路に一本化。
  • Phase 231/236/240-EX:
    • Pattern2 の header / break 条件を ExprLowerer/ScopeManager 経由(対応パターンのみ)で本番導線化。
    • ConditionEnv ベースの意味論と RC/JoinIR 構造が一致することをテストとカタログで確認済み。
  • Phase 237238-EX:
    • JsonParser/selfhost の条件パターンをカタログ化し、ExprLowerer/ScopeManager/ConditionEnv の責務境界を docs/README で固定。
  • Phase 241242-EX:
    • array_filter 系 3 FAIL を「構造で」解消hardcode "sum" チェック削除、CarrierInfo/ExitMeta 経由に統一)。
    • Pattern3 ifsum / Pattern4 continue から legacy lowerer と by-name "sum"/"count" を完全削除。
    • 複雑条件(i % 2 == 1)を ConditionPattern/if-sum lowerer で安全に扱えるよう整理Fail-Fast + テスト付き)。
  • Phase 243244-EX:
    • Pattern3/4 の公開 API を can_lower + lower の最小セットに整理し、内部 helper を箱の中に閉じた。
    • loop_pattern_detection の classify() が代表ループを P1〜P4 に分類することをユニットテストで固定。
  • 現在: cargo test --release --lib で 909/909 テスト PASS既知 FAIL なし)。

1. いまコード側で意識しておきたいフォーカス

  • JoinIR ループ基盤Pattern14 + ExprLowerer + ScopeManagerは一応の完成状態に入ったので、当面は:
    • 既存パターン/箱の範囲内での バグ修正・FailFast/invariant 追加・テスト強化 を優先する。
    • JsonParser/selfhost への新しい適用や大きな仕様拡張は、docs 側で Phase 設計が固まってからコード側に持ち込む。
  • コード側の短期フォーカス例:
    • Pattern14 / ExprLowerer / ScopeManager まわりで、by-name ハードコードやサイレントフォールバックが見つかった場合は、 CarrierInfo / ConditionEnv / Scope 情報を使って「構造で」直す。
    • Router / lowerer の要所(あり得ない PatternKind の組み合わせなど)に debug_assert! を追加し、 挙動を変えない安全側の強化を段階的に進める。

2. 直近で意識しておきたい設計の芯

  • Loop パターン空間は有限で整理済み:
    • P1: Simple While
    • P2: Break
    • P3: IfPHI単一/複数キャリア)
    • P4: Continuethen/elsecontinue 正規化込み)
    • P5: LoopBodyLocal 昇格Trim/JsonParser 用の部分適用)
  • 「増やすべき」は新しい Pattern ではなく、既存 Pattern の前処理箱:
    • BoolExprLowerer / ConditionEnv / LoopConditionScopeBox / LoopBodyCarrierPromoter / TrimLoopHelper / ComplexAddendNormalizer / LoopBodyLocalEnv / UpdateEnv などで
      条件式とキャリア更新を吸収し、Pattern14 は「ループ骨格」に専念させる方針。
  • FailFast 原則:
    • JoinIR 以外のループ lowering パスは存在しないLoopBuilder は削除済み)。
    • 「わからないパターン」は必ず [joinir/freeze] 系の明示エラーにして、サイレントフォールバックはしない。

最近まとまった大きな塊(超要約)

ここ半年くらいで終わっている主な塊だけをざっくり書くね。
細かいタスク・バグ票・議論は docs/development/current/main/phase-*.md
docs/development/current/main/joinir-architecture-overview.md に全部残っているので、必要になったときだけそちらを読む想定。

  • LoopBuilder 削除ラインPhase 180 前後)
    • LoopBuilder を devonly → hard freeze → 物理削除まで完了。
    • Loop lowering の SSOT を JoinIR に一本化。
  • LoopPattern / Router ラインPhase 170179, 244-EX
    • LoopFeatures / LoopPatternKind / PatternRouter / PatternPipelineContext を整備。
    • Pattern14 の検出・ルーティングを「構造ベースAST features」で統一関数名ベタ書き依存を除去
    • Phase 244-EX で代表ループP1〜P4の classify() 結果をユニットテストで固定。
  • Exit / Boundary / ValueId ラインPhase 172205
    • ExitMeta / ExitLineReconnector / JoinInlineBoundary(+Builder) / LoopHeaderPhiBuilder を箱化。
    • JoinValueSpaceParam/Local 領域)+ PHI 契約 Verifier で ValueId 衝突と PHI 破損を根治。
  • P5(Trim/JsonParser) ラインPhase 171176, 173175, 190193
    • LoopBodyLocal 昇格パイプラインTrim, _skip_whitespace, _parse_string 簡易版)を構築。
    • StringAppend / NumberAccumulation / Complex addend 正規化など、更新式まわりの箱を揃えた。
  • P3/P4 (IfPHI / Continue) 汎用化ラインPhase 195196, 212215, 220242-EX
    • multicarrier P3 の JoinIR 生成を整理し、ifsum 最小パターンを AST ベースで一般化sum+count まで無改造対応)。
    • Pattern3/4 ifsum/continue lowerer を分離箱にして、legacy PoC lowerer と by-name ハードコード("sum", "count")を削除。
    • Pattern4CarrierAnalyzer を純粋な「キャリア解析箱」として仕上げ、continue 正規化・更新式解析をユニットテストで固定。

このあたりが「JoinIR ループ基盤の芯」で、以降の Phase は JsonParser/selfhost の各ループへの適用フェーズ、という位置づけだよ。


🧭 これからの候補(まだ「やる」とは決めていないメモ)

ここは「やることリスト」ではなく「今後やるとしたらこの辺」というメモだよ。
実際に着手するタイミングで、別途 Phase/タスクを切る想定。

  1. JsonParser 残りループへの JoinIR 展開(設計フェーズ優先)
    • _parse_array / _parse_object / _unescape_string / 本体 _parse_string など。
    • 既存の P2/P3/P4P5 パイプラインをどこまで延ばせるかを docs 側で設計 → コード側はその設計に沿って小さく実装。
  2. selfhost depth2 ラインの再開
    • .hako 側で Program/MIR JSON を読んで JoinIR/MIR/VM/LLVM に流すライン。
    • JsonParser 側のカバレッジが上がったあとに、小さいループから順に移植する。
  3. JoinIR Verify / 最適化まわり
    • すでに PHI/ValueId 契約は debug ビルドで検証しているので、 必要なら SSADFA や軽い最適化Loop invariant / Strength reductionを検討。

📎 このファイルの運用ルール(自分向けメモ)

  • 過去フェーズの詳細な ToDo/Done リストは CURRENT_TASK には書かない
    代わりに docs/development/current/main/phase-*.mdjoinir-architecture-overview.md を SSOT として維持する。
  • CURRENT_TASK は「あくまで最新のフォーカスと次の候補だけ」に絞る。
    目安として このファイル自体は 2〜3画面程度〜300行以内 に収める。
  • 新しい大フェーズを始めたら:
    1. まず docs 配下に phase-XXX-*.md を書く。
    2. CURRENT_TASK には「そのフェーズの一行要約」と「今のフォーカスかどうか」だけを書く。