use crate::{
query::{adj_ast, label_text, match_ast_d, pred_ast},
syntax::{
builders::{
member_access::build_member_access_node, symbol_lookup::build_symbol_lookup_node,
},
fields::Field,
SyntaxGraphArgs, SyntaxGraphError,
},
utilities::text_nodes::node_to_str,
CodeGraph, NodeId,
};
use alloc::borrow::ToOwned;
const NAME: Field<false> = Field::new("name_id");
pub fn reader(
args: &mut SyntaxGraphArgs<'_>,
n_id: NodeId,
) -> Result<Option<NodeId>, SyntaxGraphError> {
let graph = args.ast_graph;
let member_n_id = pred_ast(graph, n_id, Some(1))
.first()
.copied()
.filter(|&p_id| graph.label_type(p_id) == Some("member_call_expression"))
.and_then(|p_id| args.optional_field_alt(p_id, NAME));
if let Some(member_n_id) = member_n_id {
let member = label_text(graph, member_n_id).unwrap_or("").to_owned();
let expr_n_id = adj_ast(graph, n_id, Some(1), &[])
.get(1)
.copied()
.unwrap_or(n_id);
let expression = label_text(graph, expr_n_id).unwrap_or("").to_owned();
return build_member_access_node(args, n_id, member, expression, expr_n_id).map(Some);
}
let symbol = match_ast_d(graph, n_id, "name", None).map_or_else(
|| node_to_str(graph, n_id),
|name_n_id| label_text(graph, name_n_id).unwrap_or("").to_owned(),
);
Ok(Some(build_symbol_lookup_node(args, n_id, symbol)))
}