@@ -0,0 +1,87 @@
1+use enum_iterator::IntoEnumIterator;
2+use tree_sitter::Language;
3+
4+#[macro_export]
5+macro_rules! mk_extern {
6+ ( $( $name:ident ),* ) => {
7+ $(
8+ extern "C" { pub fn $name() -> Language; }
9+ )*
10+ };
11+}
12+
13+#[macro_export]
14+macro_rules! mk_enum {
15+ ( $( $camel:ident ),* ) => {
16+ #[derive(Clone, Debug, IntoEnumIterator, PartialEq)]
17+ pub enum LANG {
18+ $(
19+ $camel,
20+ )*
21+ }
22+ };
23+}
24+
25+#[macro_export]
26+macro_rules! mk_get_language {
27+ ( $( ($camel:ident, $name:ident) ),* ) => {
28+ pub fn get_language(lang: &LANG) -> Language {
29+ unsafe {
30+ match lang {
31+ $(
32+ LANG::$camel => $name(),
33+ )*
34+ }
35+ }
36+ }
37+ };
38+}
39+
40+#[macro_export]
41+macro_rules! mk_get_language_name {
42+ ( $( $camel:ident ),* ) => {
43+ pub fn get_language_name(lang: &LANG) -> &'static str {
44+ match lang {
45+ $(
46+ LANG::$camel => stringify!($camel),
47+ )*
48+ }
49+ }
50+ };
51+}
52+
53+#[macro_export]
54+macro_rules! mk_langs {
55+ ( $( ($camel:ident, $name:ident) ),* ) => {
56+ mk_extern!($( $name ),*);
57+ mk_enum!($( $camel ),*);
58+ mk_get_language!($( ($camel, $name) ),*);
59+ mk_get_language_name!($( $camel ),*);
60+ };
61+}
62+
63+mk_langs!(
64+ // 1) Name for enum
65+ // 2) tree-sitter function to call to get a Language
66+ (Agda, tree_sitter_agda),
67+ (Bash, tree_sitter_bash),
68+ (C, tree_sitter_c),
69+ (CSharp, tree_sitter_c_sharp),
70+ // (Cpp, tree_sitter_cpp),
71+ (Css, tree_sitter_css),
72+ (Go, tree_sitter_go),
73+ (Haskell, tree_sitter_haskell),
74+ (Html, tree_sitter_html),
75+ (Java, tree_sitter_java),
76+ (Javascript, tree_sitter_javascript),
77+ (Json, tree_sitter_json),
78+ (Julia, tree_sitter_julia),
79+ (Php, tree_sitter_php),
80+ (Python, tree_sitter_python),
81+ (Ruby, tree_sitter_ruby),
82+ (Rust, tree_sitter_rust),
83+ (Scala, tree_sitter_scala),
84+ (Swift, tree_sitter_swift),
85+ (Tsx, tree_sitter_tsx),
86+ (Typescript, tree_sitter_typescript)
87+);