agentroot_core/index/ast_chunker/
parser.rs1use super::language::Language;
4use crate::error::{Error, Result};
5use tree_sitter::{Language as TsLanguage, Parser, Tree};
6
7pub fn parse(source: &str, language: Language) -> Result<Tree> {
9 let mut parser = Parser::new();
10 let ts_language = get_tree_sitter_language(language);
11 parser
12 .set_language(&ts_language)
13 .map_err(|e| Error::Parse(e.to_string()))?;
14 parser
15 .parse(source, None)
16 .ok_or_else(|| Error::Parse("Failed to parse source".to_string()))
17}
18
19fn get_tree_sitter_language(language: Language) -> TsLanguage {
22 match language {
23 Language::Rust => tree_sitter_rust::LANGUAGE.into(),
24 Language::Python => tree_sitter_python::LANGUAGE.into(),
25 Language::JavaScript => tree_sitter_javascript::LANGUAGE.into(),
26 Language::TypeScript => tree_sitter_typescript::LANGUAGE_TYPESCRIPT.into(),
27 Language::TypeScriptTsx => tree_sitter_typescript::LANGUAGE_TSX.into(),
28 Language::Go => tree_sitter_go::LANGUAGE.into(),
29 }
30}
31
32#[cfg(test)]
33mod tests {
34 use super::*;
35
36 #[test]
37 fn test_parse_rust() {
38 let source = "fn main() { println!(\"Hello\"); }";
39 let tree = parse(source, Language::Rust).unwrap();
40 assert_eq!(tree.root_node().kind(), "source_file");
41 }
42
43 #[test]
44 fn test_parse_python() {
45 let source = "def main():\n print('Hello')";
46 let tree = parse(source, Language::Python).unwrap();
47 assert_eq!(tree.root_node().kind(), "module");
48 }
49
50 #[test]
51 fn test_parse_javascript() {
52 let source = "function main() { console.log('Hello'); }";
53 let tree = parse(source, Language::JavaScript).unwrap();
54 assert_eq!(tree.root_node().kind(), "program");
55 }
56
57 #[test]
58 fn test_parse_typescript() {
59 let source = "function main(): void { console.log('Hello'); }";
60 let tree = parse(source, Language::TypeScript).unwrap();
61 assert_eq!(tree.root_node().kind(), "program");
62 }
63
64 #[test]
65 fn test_parse_go() {
66 let source = "package main\n\nfunc main() { fmt.Println(\"Hello\") }";
67 let tree = parse(source, Language::Go).unwrap();
68 assert_eq!(tree.root_node().kind(), "source_file");
69 }
70}