use alloc::borrow::ToOwned;
use crate::query::{label_text, match_ast};
use crate::syntax::builders::binary_operation::build_binary_operation_node;
use crate::syntax::fields::java::binary_expression;
use crate::syntax::{SyntaxGraphArgs, SyntaxGraphError};
use crate::{CodeGraph, NodeId};
fn unwrap_parenthesized(args: &SyntaxGraphArgs<'_>, n_id: NodeId) -> NodeId {
if args.ast_graph.label_type(n_id) == Some("parenthesized_expression") {
if let Some(inner) = match_ast(args.ast_graph, n_id, &[], None)
.get("__1__")
.copied()
.flatten()
{
return inner;
}
}
n_id
}
pub fn reader(
args: &mut SyntaxGraphArgs<'_>,
n_id: NodeId,
) -> Result<Option<NodeId>, SyntaxGraphError> {
let left_id = unwrap_parenthesized(
args,
args.required_field_alt(n_id, binary_expression::LEFT)?,
);
let right_id = unwrap_parenthesized(
args,
args.required_field_alt(n_id, binary_expression::RIGHT)?,
);
let operator_id = args.required_field_alt(n_id, binary_expression::OPERATOR)?;
let operator = label_text(args.ast_graph, operator_id)
.ok_or(SyntaxGraphError::UnexpectedAstShape)?
.to_owned();
build_binary_operation_node(args, n_id, operator, Some(left_id), Some(right_id)).map(Some)
}