use crate::language::LangId;
use crate::model::{DataNode, DataNodeId, FlowEdge, IdGenerator};
pub fn extract_dataflow(
lang: LangId,
tree: &tree_sitter::Tree,
source: &[u8],
id_gen: &IdGenerator<DataNodeId>,
) -> (Vec<DataNode>, Vec<FlowEdge>) {
match lang {
LangId::Rust => crate::language::rust::extract_rust_dataflow(tree, source, id_gen),
LangId::Python => crate::language::python::extract_python_dataflow(tree, source, id_gen),
LangId::JavaScript => {
crate::language::javascript::extract_javascript_dataflow(tree, source, id_gen)
}
LangId::TypeScript => {
crate::language::typescript::extract_typescript_dataflow(tree, source, id_gen)
}
LangId::Tsx => crate::language::tsx::extract_tsx_dataflow(tree, source, id_gen),
LangId::Go => (Vec::new(), Vec::new()),
LangId::C | LangId::Cpp => (Vec::new(), Vec::new()),
LangId::Ruby => (Vec::new(), Vec::new()),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn unsupported_lang_returns_empty() {
let source = b"x = 1\n";
let lang = LangId::Ruby;
let tree = crate::parser::parse_tree(lang, source).unwrap();
let id_gen = IdGenerator::new();
let (nodes, edges) = extract_dataflow(lang, &tree, source, &id_gen);
assert!(nodes.is_empty());
assert!(edges.is_empty());
}
#[test]
fn javascript_dispatch_returns_dataflow() {
let source = b"function f() { let x = 1; return x; }\n";
let lang = LangId::JavaScript;
let tree = crate::parser::parse_tree(lang, source).unwrap();
let id_gen = IdGenerator::new();
let (nodes, edges) = extract_dataflow(lang, &tree, source, &id_gen);
assert!(!nodes.is_empty(), "JS dispatch should produce data nodes");
assert!(!edges.is_empty(), "JS dispatch should produce flow edges");
}
}