Skip to main content

sniff/languages/
mod.rs

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}