fluidattacks-blends-domain 0.2.0

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
//! Cfg builder that links a node to the next statement, rewiring
//! deterministic multifile assignments first.

use crate::syntax::cfg::dispatchers::multifile::adjust_assignment_ast_edges;
use crate::syntax::cfg::{SyntaxCfgArgs, SyntaxCfgError};
use crate::syntax::{SyntaxGraph, SyntaxNode};
use crate::{CodeGraph, NodeId};

fn assignment_value_holding_body(graph: &SyntaxGraph, n_id: NodeId) -> Option<NodeId> {
    let Some(&SyntaxNode::Assignment {
        value_id: Some(value_id),
        ..
    }) = graph.nodes.get(&n_id)
    else {
        return None;
    };
    matches!(
        graph.label_type(value_id),
        Some("MethodDeclaration" | "Object")
    )
    .then_some(value_id)
}

pub fn build(
    args: &mut SyntaxCfgArgs<'_>,
    n_id: NodeId,
    nxt_id: Option<NodeId>,
) -> Result<NodeId, SyntaxCfgError> {
    if args.is_multifile && args.graph.label_type(n_id) == Some("Assignment") {
        adjust_assignment_ast_edges(args.graph, n_id);
    }

    if let Some(nxt_id) = nxt_id {
        args.graph.add_cfg_edge(n_id, nxt_id);
    } else if let Some(value_id) = assignment_value_holding_body(args.graph, n_id) {
        let built = args.generic(value_id, nxt_id)?;
        args.graph.add_cfg_edge(n_id, built);
    }
    Ok(n_id)
}