Skip to main content

code_analyze_mcp/languages/
mod.rs

1//! Language-specific handlers and query definitions for tree-sitter parsing.
2//!
3//! Provides query strings and extraction handlers for supported languages.
4//! Language support is controlled by Cargo `lang-*` features (by default all
5//! available language handlers are enabled): Rust, Go, Java, Python,
6//! TypeScript, TSX, and Fortran.
7
8#[cfg(feature = "lang-fortran")]
9pub mod fortran;
10#[cfg(feature = "lang-go")]
11pub mod go;
12#[cfg(feature = "lang-java")]
13pub mod java;
14#[cfg(feature = "lang-python")]
15pub mod python;
16#[cfg(feature = "lang-rust")]
17pub mod rust;
18#[cfg(any(feature = "lang-typescript", feature = "lang-tsx"))]
19pub mod typescript;
20
21use tree_sitter::{Language, Node};
22
23/// Handler to extract function name from a node.
24pub type ExtractFunctionNameHandler = fn(&Node, &str, &str) -> Option<String>;
25
26/// Handler to find method name for a receiver type.
27pub type FindMethodForReceiverHandler = fn(&Node, &str, Option<usize>) -> Option<String>;
28
29/// Handler to find receiver type for a method.
30pub type FindReceiverTypeHandler = fn(&Node, &str) -> Option<String>;
31
32/// Handler to extract inheritance information from a class node.
33pub type ExtractInheritanceHandler = fn(&Node, &str) -> Vec<String>;
34
35/// Information about a supported language for code analysis.
36pub struct LanguageInfo {
37    pub name: &'static str,
38    pub language: Language,
39    pub element_query: &'static str,
40    pub call_query: &'static str,
41    pub reference_query: Option<&'static str>,
42    pub import_query: Option<&'static str>,
43    pub impl_query: Option<&'static str>,
44    pub impl_trait_query: Option<&'static str>,
45    pub extract_function_name: Option<ExtractFunctionNameHandler>,
46    pub find_method_for_receiver: Option<FindMethodForReceiverHandler>,
47    pub find_receiver_type: Option<FindReceiverTypeHandler>,
48    pub extract_inheritance: Option<ExtractInheritanceHandler>,
49}
50
51/// Get language information by language name.
52#[allow(clippy::too_many_lines)] // exhaustive match over all supported languages; splitting harms readability
53pub fn get_language_info(lang_name: &str) -> Option<LanguageInfo> {
54    match lang_name {
55        #[cfg(feature = "lang-rust")]
56        "rust" => Some(LanguageInfo {
57            name: "rust",
58            language: tree_sitter_rust::LANGUAGE.into(),
59            element_query: rust::ELEMENT_QUERY,
60            call_query: rust::CALL_QUERY,
61            reference_query: Some(rust::REFERENCE_QUERY),
62            import_query: Some(rust::IMPORT_QUERY),
63            impl_query: Some(rust::IMPL_QUERY),
64            impl_trait_query: Some(rust::IMPL_TRAIT_QUERY),
65            extract_function_name: Some(rust::extract_function_name),
66            find_method_for_receiver: Some(rust::find_method_for_receiver),
67            find_receiver_type: Some(rust::find_receiver_type),
68            extract_inheritance: Some(rust::extract_inheritance),
69        }),
70        #[cfg(feature = "lang-python")]
71        "python" => Some(LanguageInfo {
72            name: "python",
73            language: tree_sitter_python::LANGUAGE.into(),
74            element_query: python::ELEMENT_QUERY,
75            call_query: python::CALL_QUERY,
76            reference_query: Some(python::REFERENCE_QUERY),
77            import_query: Some(python::IMPORT_QUERY),
78            impl_query: None,
79            impl_trait_query: None,
80            extract_function_name: None,
81            find_method_for_receiver: None,
82            find_receiver_type: None,
83            extract_inheritance: Some(python::extract_inheritance),
84        }),
85        #[cfg(feature = "lang-typescript")]
86        "typescript" => Some(LanguageInfo {
87            name: "typescript",
88            language: tree_sitter_typescript::LANGUAGE_TYPESCRIPT.into(),
89            element_query: typescript::ELEMENT_QUERY,
90            call_query: typescript::CALL_QUERY,
91            reference_query: Some(typescript::REFERENCE_QUERY),
92            import_query: Some(typescript::IMPORT_QUERY),
93            impl_query: None,
94            impl_trait_query: None,
95            extract_function_name: None,
96            find_method_for_receiver: None,
97            find_receiver_type: None,
98            extract_inheritance: Some(typescript::extract_inheritance),
99        }),
100        #[cfg(feature = "lang-tsx")]
101        "tsx" => Some(LanguageInfo {
102            name: "tsx",
103            language: tree_sitter_typescript::LANGUAGE_TSX.into(),
104            element_query: typescript::ELEMENT_QUERY,
105            call_query: typescript::CALL_QUERY,
106            reference_query: Some(typescript::REFERENCE_QUERY),
107            import_query: Some(typescript::IMPORT_QUERY),
108            impl_query: None,
109            impl_trait_query: None,
110            extract_function_name: None,
111            find_method_for_receiver: None,
112            find_receiver_type: None,
113            extract_inheritance: Some(typescript::extract_inheritance),
114        }),
115        #[cfg(feature = "lang-go")]
116        "go" => Some(LanguageInfo {
117            name: "go",
118            language: tree_sitter_go::LANGUAGE.into(),
119            element_query: go::ELEMENT_QUERY,
120            call_query: go::CALL_QUERY,
121            reference_query: Some(go::REFERENCE_QUERY),
122            import_query: Some(go::IMPORT_QUERY),
123            impl_query: None,
124            impl_trait_query: None,
125            extract_function_name: None,
126            find_method_for_receiver: Some(go::find_method_for_receiver),
127            find_receiver_type: None,
128            extract_inheritance: Some(go::extract_inheritance),
129        }),
130        #[cfg(feature = "lang-java")]
131        "java" => Some(LanguageInfo {
132            name: "java",
133            language: tree_sitter_java::LANGUAGE.into(),
134            element_query: java::ELEMENT_QUERY,
135            call_query: java::CALL_QUERY,
136            reference_query: Some(java::REFERENCE_QUERY),
137            import_query: Some(java::IMPORT_QUERY),
138            impl_query: None,
139            impl_trait_query: None,
140            extract_function_name: None,
141            find_method_for_receiver: None,
142            find_receiver_type: None,
143            extract_inheritance: Some(java::extract_inheritance),
144        }),
145        #[cfg(feature = "lang-fortran")]
146        "fortran" => Some(LanguageInfo {
147            name: "fortran",
148            language: tree_sitter_fortran::LANGUAGE.into(),
149            element_query: fortran::ELEMENT_QUERY,
150            call_query: fortran::CALL_QUERY,
151            reference_query: Some(fortran::REFERENCE_QUERY),
152            import_query: Some(fortran::IMPORT_QUERY),
153            impl_query: None,
154            impl_trait_query: None,
155            extract_function_name: None,
156            find_method_for_receiver: None,
157            find_receiver_type: None,
158            extract_inheritance: Some(fortran::extract_inheritance),
159        }),
160        _ => None,
161    }
162}