code-split-syn 0.1.1

Syntactic-stage analyzer for Code Split: cargo_metadata + syn.
Documentation
use crate::ids::crate_node_id;
use cargo_metadata::Metadata;
use code_split_core::{Edge, EdgeKind, GraphBuilder, Node, NodeKind};
use std::collections::HashSet;

pub(crate) fn contribute(metadata: &Metadata, builder: &mut GraphBuilder) {
    let local: HashSet<_> = metadata.workspace_members.iter().collect();

    for pkg in &metadata.packages {
        let is_local = local.contains(&pkg.id);
        builder.add_node(Node {
            id: crate_node_id(&pkg.id.repr),
            kind: NodeKind::Crate,
            name: pkg.name.to_string(),
            path: pkg.manifest_path.to_string(),
            parent: None,
            external: (!is_local).then_some(true),
            visibility: None,
            loc: None,
            line: None,
            item_count: None,
            method_count: None,
            complexity: None,
            cycle_kind: None,
        });
    }

    let Some(resolve) = metadata.resolve.as_ref() else {
        return;
    };

    for node in &resolve.nodes {
        if !local.contains(&node.id) {
            continue;
        }
        let from = crate_node_id(&node.id.repr);
        for dep in &node.deps {
            builder.add_edge(Edge {
                from: from.clone(),
                to: crate_node_id(&dep.pkg.repr),
                kind: EdgeKind::Uses,
                unresolved: None,
                external: None,
                visibility: None,
            });
        }
    }
}