fluidattacks-blends-domain 0.17.1

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
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)))
}