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)
}