use cha_core::TypeOrigin;
use tree_sitter::Node;
use crate::type_ref::ImportsMap;
pub fn build(root: Node, src: &[u8]) -> ImportsMap {
let mut map = ImportsMap::new();
for prim in PRIMITIVES {
map.insert((*prim).to_string(), TypeOrigin::Primitive);
}
walk(root, src, &mut map);
map
}
fn walk(node: Node, src: &[u8], _map: &mut ImportsMap) {
if node.kind() == "preproc_include" {
let _ = node.utf8_text(src);
}
let mut cursor = node.walk();
for child in node.children(&mut cursor) {
walk(child, src, _map);
}
}
const PRIMITIVES: &[&str] = &[
"bool",
"char",
"double",
"float",
"int",
"long",
"short",
"signed",
"unsigned",
"void",
"wchar_t",
"int8_t",
"int16_t",
"int32_t",
"int64_t",
"uint8_t",
"uint16_t",
"uint32_t",
"uint64_t",
"intptr_t",
"uintptr_t",
"size_t",
"ssize_t",
"ptrdiff_t",
"string",
"nullptr_t",
];
#[cfg(test)]
mod tests {
use super::*;
fn parse(src: &str) -> ImportsMap {
let mut parser = tree_sitter::Parser::new();
parser
.set_language(&tree_sitter_c::LANGUAGE.into())
.unwrap();
let tree = parser.parse(src, None).unwrap();
build(tree.root_node(), src.as_bytes())
}
#[test]
fn primitives_seeded() {
let m = parse("#include <stdint.h>\n");
assert_eq!(m.get("int"), Some(&TypeOrigin::Primitive));
assert_eq!(m.get("size_t"), Some(&TypeOrigin::Primitive));
assert_eq!(m.get("uint32_t"), Some(&TypeOrigin::Primitive));
}
#[test]
fn non_primitive_absent() {
let m = parse("#include <cmark.h>\n");
assert!(m.get("cmark_node_t").is_none());
}
}