use crate::syntax::builders::utils::setup_scope_index_binding;
use crate::syntax::{SyntaxGraphArgs, SyntaxGraphError, SyntaxNode};
use crate::NodeId;
#[allow(
clippy::too_many_arguments,
reason = "mirrors the Python builder: body plus three optional clauses"
)]
pub fn build_for_statement_node(
args: &mut SyntaxGraphArgs<'_>,
n_id: NodeId,
initializer_node: Option<NodeId>,
condition_node: Option<NodeId>,
update_node: Option<NodeId>,
body_node: NodeId,
) -> Result<NodeId, SyntaxGraphError> {
args.syntax_graph.add_node(
n_id,
SyntaxNode::ForStatement {
block_id: body_node,
initializer_id: initializer_node,
condition_id: condition_node,
update_id: update_node,
},
);
args.metadata.control_flow_stack.push(n_id);
let built_body = args.generic(body_node)?;
args.syntax_graph.add_ast_edge(n_id, built_body);
args.metadata.control_flow_stack.pop();
if let Some(initializer_node) = initializer_node {
let built = args.generic(initializer_node)?;
args.syntax_graph.add_ast_edge(n_id, built);
}
if let Some(condition_node) = condition_node {
let built = args.generic(condition_node)?;
args.syntax_graph.add_ast_edge(n_id, built);
}
if let Some(update_node) = update_node {
let built = args.generic(update_node)?;
args.syntax_graph.add_ast_edge(n_id, built);
}
if let Some(initializer_node) = initializer_node {
setup_scope_index_binding(
args.ast_graph,
args.syntax_graph,
args.metadata,
initializer_node,
n_id,
);
}
Ok(n_id)
}