fluidattacks-blends-domain 0.3.0

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use crate::syntax::builders::utils::{bound_identifier_symbol, register_symbol_in_scope};
use crate::syntax::{SyntaxGraphArgs, SyntaxGraphError, SyntaxNode};
use crate::NodeId;

pub fn build_for_each_statement_node(
    args: &mut SyntaxGraphArgs<'_>,
    n_id: NodeId,
    var_node: NodeId,
    iterable_item: NodeId,
    block_id: Option<NodeId>,
) -> Result<NodeId, SyntaxGraphError> {
    args.syntax_graph.add_node(
        n_id,
        SyntaxNode::ForEachStatement {
            variable_id: var_node,
            iterable_item_id: iterable_item,
            block_id,
        },
    );

    let built_var = args.generic(var_node)?;
    args.syntax_graph.add_ast_edge(n_id, built_var);

    let built_iterable = args.generic(iterable_item)?;
    args.syntax_graph.add_ast_edge(n_id, built_iterable);

    if let Some(block_id) = block_id {
        args.metadata.control_flow_stack.push(n_id);
        let built = args.generic(block_id)?;
        args.syntax_graph.add_ast_edge(n_id, built);
        args.metadata.control_flow_stack.pop();
    }

    if let Some(symbol) = bound_identifier_symbol(args.ast_graph, var_node) {
        register_symbol_in_scope(args.syntax_graph, args.metadata, symbol, n_id);
    }

    Ok(n_id)
}