diff --git a/src/mir/control_tree/step_tree.rs b/src/mir/control_tree/step_tree.rs index 996665db..ead355d4 100644 --- a/src/mir/control_tree/step_tree.rs +++ b/src/mir/control_tree/step_tree.rs @@ -55,7 +55,11 @@ pub struct AstNodeHandle(pub Box); #[derive(Debug, Clone, PartialEq)] pub enum StepStmtKind { LocalDecl { vars: Vec }, - Assign { target: Option }, + Assign { + target: Option, + /// Phase 128: assignment value AST (for Normalized lowering) + value_ast: Option, + }, Print, Return { /// Phase 123: return value AST (for Normalized lowering) @@ -188,7 +192,7 @@ impl StepStmtKind { fn to_compact_string(&self) -> String { match self { StepStmtKind::LocalDecl { vars } => format!("local({})", vars.join(",")), - StepStmtKind::Assign { target } => match target { + StepStmtKind::Assign { target, .. } => match target { Some(name) => format!("assign({name})"), None => "assign(?)".to_string(), }, @@ -374,7 +378,7 @@ impl StepTreeBuilderBox { }, StepTreeFeatures::default(), ), - ASTNode::Assignment { span, .. } => ( + ASTNode::Assignment { span, value, .. } => ( StepNode::Stmt { kind: StepStmtKind::Assign { target: match ast { @@ -384,6 +388,8 @@ impl StepTreeBuilderBox { }, _ => None, }, + /// Phase 128: Store value AST for Normalized lowering + value_ast: Some(AstNodeHandle(value.clone())), }, span: span.clone(), }, @@ -507,12 +513,14 @@ fn walk_for_facts(node: &StepNode, facts: &mut StepTreeFacts) { facts.add_write(v.clone()); } } - StepStmtKind::Assign { target } => { + StepStmtKind::Assign { target, value_ast } => { if let Some(name) = target.as_ref() { facts.add_write(name.clone()); } - // Note: Assign RHS is not in StepStmtKind - // We rely on If/Loop condition AST for reads extraction + // Phase 128: Extract reads from assignment value AST + if let Some(ast) = value_ast { + extract_variables_from_ast(&ast.0, facts); + } } StepStmtKind::Print => {} StepStmtKind::Return { value_ast } => {