use alloc::string::String;
use crate::syntax::{SyntaxGraphArgs, SyntaxGraphError, SyntaxNode};
use crate::NodeId;
pub fn build_binary_operation_node(
args: &mut SyntaxGraphArgs<'_>,
n_id: NodeId,
operator: String,
left_id: Option<NodeId>,
right_id: Option<NodeId>,
) -> Result<NodeId, SyntaxGraphError> {
let is_logical = matches!(operator.as_str(), "and" | "&&" | "or" | "||");
args.syntax_graph.add_node(
n_id,
SyntaxNode::BinaryOperation {
operator,
left_id,
right_id,
},
);
let condition_parent = if is_logical {
None
} else {
args.metadata
.sanitization_stack
.last()
.filter(|(kind, _)| kind == "condition_pending")
.map(|(_, parent_id)| *parent_id)
};
if let Some(parent_id) = condition_parent {
args.metadata
.sanitization_stack
.push((String::from("condition"), parent_id));
}
if let Some(left_id) = left_id {
let built_left = args.generic(left_id)?;
args.syntax_graph.add_ast_edge(n_id, built_left);
}
if let Some(right_id) = right_id {
let built_right = args.generic(right_id)?;
args.syntax_graph.add_ast_edge(n_id, built_right);
}
if condition_parent.is_some() {
args.metadata.sanitization_stack.pop();
}
Ok(n_id)
}