use crate::syntax::{SyntaxGraphArgs, SyntaxGraphError, SyntaxNode};
use crate::NodeId;
#[allow(
clippy::too_many_arguments,
reason = "mirrors the Python builder: block plus three optional child groups"
)]
pub fn build_try_statement_node(
args: &mut SyntaxGraphArgs<'_>,
n_id: NodeId,
block_node: NodeId,
catch_blocks: &[NodeId],
try_block: Option<NodeId>,
resources_spec: Option<NodeId>,
) -> Result<NodeId, SyntaxGraphError> {
args.syntax_graph.add_node(
n_id,
SyntaxNode::TryStatement {
block_id: block_node,
resources_id: resources_spec,
},
);
args.metadata.control_flow_stack.push(n_id);
let built_block = args.generic(block_node)?;
args.syntax_graph.add_ast_edge(n_id, built_block);
args.metadata.control_flow_stack.pop();
if let Some(resources_spec) = resources_spec {
let built = args.generic(resources_spec)?;
args.syntax_graph.add_ast_edge(n_id, built);
}
for c_id in catch_blocks {
let built = args.generic(*c_id)?;
args.syntax_graph.add_ast_edge(n_id, built);
}
if let Some(try_block) = try_block {
let built = args.generic(try_block)?;
args.syntax_graph.add_ast_edge(n_id, built);
}
Ok(n_id)
}