refactor(joinir): Phase 85 - Quick wins: loop_patterns removal, DebugOutputBox, dead_code audit
Quick Win 1: Remove loop_patterns_old.rs (COMPLETED) - Deleted obsolete legacy loop pattern dispatcher (914 lines) - All patterns (Break/Continue/Simple) now in modular loop_patterns/ system - Moved helper functions (has_break_in_loop_body, has_continue_in_loop_body) to analysis.rs - Updated loop_frontend_binding.rs to remove fallback - Verified zero regressions: 974/974 lib tests PASS Quick Win 2: DebugOutputBox consolidation (COMPLETED) - New module: src/mir/join_ir/lowering/debug_output_box.rs (170 lines) - Centralized debug output management with automatic HAKO_JOINIR_DEBUG checking - Refactored 4 files to use DebugOutputBox: - condition_env.rs: 3 scattered checks → 3 Box calls - carrier_binding_assigner.rs: 1 check → 1 Box call - scope_manager.rs: 3 checks → 3 Box calls - analysis.rs: Updated lower_loop_with_if_meta to use new pattern system - Benefits: Consistent formatting, centralized control, zero runtime cost when disabled - Added 4 unit tests for DebugOutputBox Quick Win 3: Dead code directive audit (COMPLETED) - Audited all 40 #[allow(dead_code)] directives in lowering/ - Findings: All legitimate (Phase utilities, future placeholders, API completeness) - No unsafe removals needed - Categories: - Phase 192 utilities (whitespace_check, entry_builder): Public API with tests - Phase 231 placeholders (expr_lowerer): Explicitly marked future use - Const helpers (value_id_ranges): API completeness - Loop metadata (loop_update_summary): Future phase fields Result: Net -858 lines, improved code clarity, zero regressions Tests: 974/974 PASS (gained 4 from DebugOutputBox tests) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@ -251,7 +251,7 @@ impl AstToJoinIrLowerer {
|
||||
|
||||
/// Phase 40-1実験用: array_ext.filter パターン専用lowering
|
||||
///
|
||||
/// 通常の lower_loop_case_a_simple() に加えて、
|
||||
/// 通常の Simple パターンループ lowering に加えて、
|
||||
/// if-in-loop modified varsをJoinFuncMetaMapとして返す。
|
||||
///
|
||||
/// # Returns
|
||||
@ -260,14 +260,19 @@ impl AstToJoinIrLowerer {
|
||||
///
|
||||
/// # Phase 40-1専用
|
||||
/// この関数はPhase 40-1 A/Bテスト専用。
|
||||
/// 本番パスでは使わない(従来のlower_loop_case_a_simple()を使う)。
|
||||
/// 本番パスでは使わない(新しいloop_patterns::simple::lower()を使う)。
|
||||
///
|
||||
/// # Phase 85 Note
|
||||
/// loop_patterns_old.rs削除に伴い、loop_patterns::simple::lower()に委譲
|
||||
#[allow(dead_code)]
|
||||
pub fn lower_loop_with_if_meta(
|
||||
&mut self,
|
||||
program_json: &serde_json::Value,
|
||||
) -> (JoinModule, JoinFuncMetaMap) {
|
||||
// 1. 通常のJoinModule生成(既存ロジック流用)
|
||||
let module = self.lower_loop_case_a_simple(program_json);
|
||||
// 1. 通常のJoinModule生成(新パターンシステムに委譲)
|
||||
use super::loop_patterns;
|
||||
let module = loop_patterns::simple::lower(self, program_json)
|
||||
.expect("Simple pattern lowering failed in lower_loop_with_if_meta");
|
||||
|
||||
// 2. loop body ASTからif-in-loop modified varsを抽出
|
||||
let loop_body = self.extract_loop_body_from_program(program_json);
|
||||
@ -339,4 +344,72 @@ impl AstToJoinIrLowerer {
|
||||
}
|
||||
vars
|
||||
}
|
||||
|
||||
/// Phase 85: Loop body に Break があるかチェック
|
||||
///
|
||||
/// ループパターン検出(loop_frontend_binding)で使用される。
|
||||
/// If文内のBreakステートメントを検出する。
|
||||
///
|
||||
/// # Arguments
|
||||
/// * `loop_body` - ループ本体のステートメント配列
|
||||
///
|
||||
/// # Returns
|
||||
/// ループ内にBreakがあればtrue
|
||||
pub(crate) fn has_break_in_loop_body(loop_body: &[serde_json::Value]) -> bool {
|
||||
loop_body.iter().any(|stmt| {
|
||||
if stmt["type"].as_str() == Some("If") {
|
||||
let then_has = stmt["then"]
|
||||
.as_array()
|
||||
.map(|body| {
|
||||
body.iter()
|
||||
.any(|s| s["type"].as_str() == Some("Break"))
|
||||
})
|
||||
.unwrap_or(false);
|
||||
let else_has = stmt["else"]
|
||||
.as_array()
|
||||
.map(|body| {
|
||||
body.iter()
|
||||
.any(|s| s["type"].as_str() == Some("Break"))
|
||||
})
|
||||
.unwrap_or(false);
|
||||
then_has || else_has
|
||||
} else {
|
||||
false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/// Phase 85: Loop body に Continue があるかチェック
|
||||
///
|
||||
/// ループパターン検出(loop_frontend_binding)で使用される。
|
||||
/// If文内のContinueステートメントを検出する。
|
||||
///
|
||||
/// # Arguments
|
||||
/// * `loop_body` - ループ本体のステートメント配列
|
||||
///
|
||||
/// # Returns
|
||||
/// ループ内にContinueがあればtrue
|
||||
pub(crate) fn has_continue_in_loop_body(loop_body: &[serde_json::Value]) -> bool {
|
||||
loop_body.iter().any(|stmt| {
|
||||
if stmt["type"].as_str() == Some("If") {
|
||||
let then_has = stmt["then"]
|
||||
.as_array()
|
||||
.map(|body| {
|
||||
body.iter()
|
||||
.any(|s| s["type"].as_str() == Some("Continue"))
|
||||
})
|
||||
.unwrap_or(false);
|
||||
let else_has = stmt["else"]
|
||||
.as_array()
|
||||
.map(|body| {
|
||||
body.iter()
|
||||
.any(|s| s["type"].as_str() == Some("Continue"))
|
||||
})
|
||||
.unwrap_or(false);
|
||||
then_has || else_has
|
||||
} else {
|
||||
false
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user