use crate::{
query::adj_ast,
syntax::{
builders::method_declaration::{
build_method_declaration_node, MethodDirectChildren, MethodListChildren,
},
fields::Field,
SyntaxGraphArgs, SyntaxGraphError,
},
utilities::text_nodes::node_to_str,
CodeGraph, NodeId,
};
use alloc::format;
const NAME: Field<true> = Field::new("name_id");
const OBJECT: Field<false> = Field::new("object_id");
const BODY: Field<false> = Field::new("body_id");
const PARAMETERS: Field<false> = Field::new("parameters_id");
pub fn reader(
args: &mut SyntaxGraphArgs<'_>,
n_id: NodeId,
) -> Result<Option<NodeId>, SyntaxGraphError> {
let graph = args.ast_graph;
let name_id = args.required_field_alt(n_id, NAME)?;
let mut name = node_to_str(graph, name_id);
if let Some(object_id) = args.optional_field_alt(n_id, OBJECT) {
let object_name = node_to_str(graph, object_id);
name = format!("{object_name}.{name}");
}
let block_id = args.optional_field_alt(n_id, BODY);
let parameters_id = args.optional_field_alt(n_id, PARAMETERS).filter(|&p_id| {
adj_ast(graph, p_id, Some(1), &[])
.into_iter()
.any(|c_id| !matches!(graph.label_type(c_id), Some("(" | ")")))
});
let direct = MethodDirectChildren {
block_id,
parameters_id,
..Default::default()
};
build_method_declaration_node(
args,
n_id,
Some(name),
&direct,
&MethodListChildren::default(),
None,
)
.map(Some)
}