1use tree_sitter_language::LanguageFn;
21
22unsafe extern "C" {
23 fn tree_sitter_cpp() -> *const ();
24}
25
26pub const LANGUAGE: LanguageFn = unsafe { LanguageFn::from_raw(tree_sitter_cpp) };
28
29pub const NODE_TYPES: &str = include_str!("../../src/node-types.json");
33
34pub const TAGS_QUERY: &str = include_str!("../../queries/tags.scm");
36
37#[cfg(test)]
38mod tests {
39 use tree_sitter::StreamingIterator;
40
41 #[test]
42 fn test_can_load_grammar() {
43 let mut parser = tree_sitter::Parser::new();
44 parser
45 .set_language(&super::LANGUAGE.into())
46 .expect("Error loading C++ parser");
47 }
48
49 #[test]
50 fn extracts_symbol_definitions() {
51 let source = "struct Example { void method() {} };\nvoid function() {}\n";
52 let language = super::LANGUAGE.into();
53 let mut parser = tree_sitter::Parser::new();
54 parser.set_language(&language).unwrap();
55 let tree = parser.parse(source, None).unwrap();
56 assert!(!tree.root_node().has_error());
57
58 let query = tree_sitter::Query::new(&language, super::TAGS_QUERY).unwrap();
59 let name_index = query.capture_index_for_name("name").unwrap();
60 let mut cursor = tree_sitter::QueryCursor::new();
61 let mut captures = cursor.captures(&query, tree.root_node(), source.as_bytes());
62 let mut names = Vec::new();
63 while let Some((query_match, capture_index)) = captures.next() {
64 let capture = query_match.captures()[*capture_index];
65 if capture.index == name_index {
66 names.push(capture.node.utf8_text(source.as_bytes()).unwrap());
67 }
68 }
69 assert_eq!(names, ["Example", "method", "function"]);
70 }
71}