refactor(control_tree): modularize normalized_shadow dev pipeline

This commit is contained in:
nyash-codex
2025-12-18 08:14:49 +09:00
parent 36717cad4f
commit df23a52916
11 changed files with 1451 additions and 1868 deletions

View File

@ -176,91 +176,36 @@ impl MirBuilder {
fn lower_function_body(&mut self, body: Vec<ASTNode>) -> Result<(), String> {
let trace = crate::mir::builder::control_flow::joinir::trace::trace();
// Phase 112: StepTree capability guard (strict-only)
// Phase 112: StepTree capability guard (strict-only) + dev shadow lowering
let strict = crate::config::env::joinir_dev::strict_enabled();
let dev = crate::config::env::joinir_dev_enabled();
let func_name = self
.scope_ctx
.current_function
.as_ref()
.map(|f| f.signature.name.clone())
.unwrap_or_else(|| "<unknown>".to_string());
if strict || dev {
let tree = crate::mir::control_tree::StepTreeBuilderBox::build_from_block(&body);
if dev {
trace.dev("control_tree/step_tree", &tree.to_compact_string());
}
// Phase 112: Guard check (strict mode only)
let func_name = self
.scope_ctx
.current_function
.as_ref()
.map(|f| f.signature.name.clone())
.unwrap_or_else(|| "<unknown>".to_string());
crate::mir::builder::control_flow::joinir::control_tree_capability_guard::check(
&tree, &func_name, strict, dev,
)?;
// Phase 121/122: StepTree→Normalized shadow lowering (dev-only)
if dev {
use crate::mir::control_tree::normalized_shadow::StepTreeNormalizedShadowLowererBox;
use crate::mir::control_tree::normalized_shadow::parity;
use crate::mir::control_tree::normalized_shadow::available_inputs_collector::AvailableInputsCollectorBox;
// Phase 126: Collect available_inputs from SSOT sources
// Note: CapturedEnv is None for now (if-only patterns don't use CapturedEnv yet)
let available_inputs = AvailableInputsCollectorBox::collect(self, None);
// Try shadow lowering (if-only scope)
let shadow_result = StepTreeNormalizedShadowLowererBox::try_lower_if_only(&tree, &available_inputs);
match shadow_result {
Ok(Some((module, _meta))) => {
// Phase 122: Verify Normalized JoinModule structure
let expected_env_fields =
StepTreeNormalizedShadowLowererBox::expected_env_field_count(
&tree,
&available_inputs,
);
if let Err(err) =
parity::verify_normalized_structure(&module, expected_env_fields)
{
if strict {
return Err(err);
}
trace.dev("phase122/emit/error", &err);
} else {
// Shadow lowering succeeded + structure verified
let status = format!(
"module_emitted=true funcs={} env_fields={} step_tree_sig={}",
module.functions.len(),
expected_env_fields,
tree.signature_basis_string()
);
trace.dev("phase122/emit", &status);
}
}
Ok(None) => {
// Out of scope (e.g., contains loops)
let status = StepTreeNormalizedShadowLowererBox::get_status_string(&tree);
trace.dev("phase121/shadow", &status);
}
Err(err) => {
// Should be supported but failed (internal error)
let msg = format!(
"phase121/shadow: internal error for {}: {}",
func_name, err
);
if strict {
return Err(format!(
"Phase121 shadow lowering failed (strict mode): {}\nHint: if-only pattern should be supported but conversion failed",
err
));
}
trace.dev("phase121/shadow/error", &msg);
}
}
struct JoinLoopTraceDevAdapter<'a> {
trace: &'a crate::mir::builder::control_flow::joinir::trace::JoinLoopTrace,
}
impl crate::mir::control_tree::normalized_shadow::dev_pipeline::DevTrace
for JoinLoopTraceDevAdapter<'_>
{
fn dev(&self, tag: &str, msg: &str) {
self.trace.dev(tag, msg)
}
}
let trace_adapter = JoinLoopTraceDevAdapter { trace: &trace };
crate::mir::control_tree::normalized_shadow::dev_pipeline::StepTreeDevPipelineBox::run(
self,
&body,
&func_name,
strict,
dev,
&trace_adapter,
)?;
trace.emit_if(
"debug",