use alloc::string::String;
use crate::syntax::{SyntaxGraphArgs, SyntaxGraphError, SyntaxNode};
use crate::NodeId;
pub fn build_unary_expression_node(
args: &mut SyntaxGraphArgs<'_>,
n_id: NodeId,
operator: String,
operand_id: NodeId,
) -> Result<NodeId, SyntaxGraphError> {
let is_sanitizing = operator.as_str() == "!";
args.syntax_graph.add_node(
n_id,
SyntaxNode::UnaryExpression {
operator,
operand_id,
},
);
let condition_parent = if is_sanitizing {
args.metadata
.sanitization_stack
.last()
.filter(|(kind, _)| kind == "condition_pending")
.map(|(_, parent_id)| *parent_id)
} else {
None
};
if let Some(parent_id) = condition_parent {
args.metadata
.sanitization_stack
.push((String::from("condition"), parent_id));
}
let built_operand = args.generic(operand_id)?;
args.syntax_graph.add_ast_edge(n_id, built_operand);
if condition_parent.is_some() {
args.metadata.sanitization_stack.pop();
}
Ok(n_id)
}