sdivi_lang_typescript/
lib.rs1mod extract;
13
14use std::cell::RefCell;
15use std::path::Path;
16
17use sdivi_parsing::adapter::LanguageAdapter;
18use sdivi_parsing::feature_record::FeatureRecord;
19
20use extract::{collect_hints, extract_exports, extract_imports, extract_signatures};
21
22thread_local! {
23 static TS_PARSER: RefCell<tree_sitter::Parser> = RefCell::new({
24 let mut p = tree_sitter::Parser::new();
25 p.set_language(&tree_sitter_typescript::language_typescript())
26 .expect("tree-sitter-typescript grammar failed to load");
27 p
28 });
29
30 static TSX_PARSER: RefCell<tree_sitter::Parser> = RefCell::new({
31 let mut p = tree_sitter::Parser::new();
32 p.set_language(&tree_sitter_typescript::language_tsx())
33 .expect("tree-sitter-typescript (TSX) grammar failed to load");
34 p
35 });
36}
37
38pub struct TypeScriptAdapter;
59
60impl LanguageAdapter for TypeScriptAdapter {
61 fn language_name(&self) -> &'static str {
62 "typescript"
63 }
64
65 fn file_extensions(&self) -> &[&'static str] {
66 &[".ts", ".tsx"]
67 }
68
69 fn parse_file(&self, path: &Path, content: String) -> FeatureRecord {
74 let source = content.as_bytes();
75 let is_tsx = path.extension().is_some_and(|e| e == "tsx");
76
77 let (imports, exports, signatures, pattern_hints) = if is_tsx {
78 TSX_PARSER.with(|cell| {
79 let mut parser = cell.borrow_mut();
80 let tree = parser
81 .parse(source, None)
82 .expect("tree-sitter-typescript (TSX) failed to parse");
83 let root = tree.root_node();
84 let imports = extract_imports(root, source);
85 let exports = extract_exports(root, source);
86 let signatures = extract_signatures(root, source);
87 let hints = collect_hints(root, source);
88 (imports, exports, signatures, hints)
89 })
90 } else {
91 TS_PARSER.with(|cell| {
92 let mut parser = cell.borrow_mut();
93 let tree = parser
94 .parse(source, None)
95 .expect("tree-sitter-typescript failed to parse");
96 let root = tree.root_node();
97 let imports = extract_imports(root, source);
98 let exports = extract_exports(root, source);
99 let signatures = extract_signatures(root, source);
100 let hints = collect_hints(root, source);
101 (imports, exports, signatures, hints)
102 })
103 };
104
105 FeatureRecord {
106 path: path.to_path_buf(),
107 language: "typescript".to_string(),
108 imports,
109 exports,
110 signatures,
111 pattern_hints,
112 }
113 }
114}