fluidattacks-blends-domain 0.6.1

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use crate::query::{match_ast, match_ast_group_d};
use crate::syntax::builders::class_declaration::build_class_node;
use crate::syntax::builders::method_declaration::{
    build_method_declaration_node, MethodDirectChildren, MethodListChildren,
};
use crate::syntax::fields::python::{class_definition, decorated_definition, function_definition};
use crate::syntax::{SyntaxGraphArgs, SyntaxGraphError};
use crate::utilities::text_nodes::node_to_str;
use crate::{CodeGraph, NodeId};

pub fn reader(
    args: &mut SyntaxGraphArgs<'_>,
    n_id: NodeId,
) -> Result<Option<NodeId>, SyntaxGraphError> {
    let graph = args.ast_graph;
    let def_id = args.required_field_alt(n_id, decorated_definition::DEFINITION)?;
    let modifiers = match_ast_group_d(graph, n_id, "decorator", None);

    if graph.label_type(def_id) == Some("function_definition") {
        let name = node_to_str(
            graph,
            args.required_field_alt(def_id, function_definition::NAME)?,
        );
        let block_id = args.required_field_alt(def_id, function_definition::BODY)?;
        let parameters_id = args.required_field_alt(def_id, function_definition::PARAMETERS)?;
        let include_params =
            match_ast(graph, parameters_id, &["(", ")"], None).contains_key("__0__");

        let direct = MethodDirectChildren {
            parameters_id: include_params.then_some(parameters_id),
            block_id: Some(block_id),
            ..MethodDirectChildren::default()
        };
        let list_children = MethodListChildren {
            modifiers_ids: modifiers,
            ..MethodListChildren::default()
        };
        return build_method_declaration_node(
            args,
            n_id,
            Some(name),
            &direct,
            &list_children,
            None,
        )
        .map(Some);
    }

    let name = node_to_str(
        graph,
        args.required_field_alt(def_id, class_definition::NAME)?,
    );
    let block_id = args.required_field_alt(def_id, class_definition::BODY)?;
    build_class_node(
        args,
        n_id,
        name,
        Some(block_id),
        &modifiers,
        None,
        None,
        None,
    )
    .map(Some)
}