mod extract;
use std::cell::RefCell;
use std::path::Path;
use sdivi_parsing::adapter::LanguageAdapter;
use sdivi_parsing::feature_record::FeatureRecord;
use extract::{collect_hints, extract_exports, extract_imports, extract_signatures};
thread_local! {
static PARSER: RefCell<tree_sitter::Parser> = RefCell::new({
let mut p = tree_sitter::Parser::new();
p.set_language(&tree_sitter_python::language())
.expect("tree-sitter-python grammar failed to load");
p
});
}
pub struct PythonAdapter;
impl LanguageAdapter for PythonAdapter {
fn language_name(&self) -> &'static str {
"python"
}
fn file_extensions(&self) -> &[&'static str] {
&[".py"]
}
fn parse_file(&self, path: &Path, content: String) -> FeatureRecord {
let source = content.as_bytes();
let (imports, exports, signatures, pattern_hints) = PARSER.with(|cell| {
let mut parser = cell.borrow_mut();
let tree = parser
.parse(source, None)
.expect("tree-sitter-python failed to parse");
let root = tree.root_node();
let imports = extract_imports(root, source);
let exports = extract_exports(root, source);
let signatures = extract_signatures(root, source);
let hints = collect_hints(root, source);
(imports, exports, signatures, hints)
});
FeatureRecord {
path: path.to_path_buf(),
language: "python".to_string(),
imports,
exports,
signatures,
pattern_hints,
}
}
}