fluidattacks-blends-domain 0.6.1

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
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)
}