1use crate::language_adapter::LanguageAdapter;
2
3macro_rules! language_adapter {
4 (
5 $name:expr,
6 $grammar_package:expr,
7 [$($extension:expr),* $(,)?],
8 [$($function_node_type:expr),* $(,)?],
9 [$($excluded_parent_type:expr),* $(,)?],
10 $name_field:expr,
11 $params_field:expr,
12 [$($param_node_type:expr),* $(,)?],
13 [$($nesting_node_type:expr),* $(,)?],
14 $export_detection:expr,
15 [$($generic_name:expr),* $(,)?],
16 [$($allowed_name:expr),* $(,)?]
17 ) => {
18 LanguageAdapter {
19 name: $name.into(),
20 grammar_package: $grammar_package.into(),
21 extensions: vec![$($extension.into()),*],
22 function_node_types: vec![$($function_node_type.into()),*],
23 excluded_parent_types: vec![$($excluded_parent_type.into()),*],
24 name_field: $name_field.into(),
25 params_field: $params_field.into(),
26 param_node_types: vec![$($param_node_type.into()),*],
27 nesting_node_types: vec![$($nesting_node_type.into()),*],
28 export_detection: $export_detection,
29 generic_names: vec![$($generic_name.into()),*],
30 allowed_names: vec![$($allowed_name.into()),*],
31 }
32 };
33}
34
35mod go;
36mod javascript;
37mod kotlin;
38mod python;
39mod rust;
40mod typescript;
41
42pub fn get_adapter(extension: &str) -> Option<LanguageAdapter> {
43 let ext = extension
44 .strip_prefix('.')
45 .unwrap_or(extension)
46 .to_ascii_lowercase();
47 match ext.as_str() {
48 "js" | "jsx" => Some(javascript::adapter()),
49 "ts" | "tsx" => Some(typescript::adapter()),
50 "kt" | "kts" => Some(kotlin::adapter()),
51 "py" => Some(python::adapter()),
52 "go" => Some(go::adapter()),
53 "rs" => Some(rust::adapter()),
54 _ => None,
55 }
56}