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//! Rust, Go, Java, Python, and TypeScript.
5
6pub mod go;
7pub mod java;
8pub mod python;
9pub mod rust;
10pub mod typescript;
11
12use tree_sitter::{Language, Node};
13
14/// Handler to extract function name from a node.
15pub type ExtractFunctionNameHandler = fn(&Node, &str, &str) -> Option<String>;
16
17/// Handler to find method name for a receiver type.
18pub type FindMethodForReceiverHandler = fn(&Node, &str, Option<usize>) -> Option<String>;
19
20/// Handler to find receiver type for a method.
21pub type FindReceiverTypeHandler = fn(&Node, &str) -> Option<String>;
22
23/// Handler to extract inheritance information from a class node.
24pub type ExtractInheritanceHandler = fn(&Node, &str) -> Vec<String>;
25
26/// Information about a supported language for code analysis.
27pub struct LanguageInfo {
28    pub name: &'static str,
29    pub language: Language,
30    pub element_query: &'static str,
31    pub call_query: &'static str,
32    pub reference_query: Option<&'static str>,
33    pub import_query: Option<&'static str>,
34    pub impl_query: Option<&'static str>,
35    pub assignment_query: Option<&'static str>,
36    pub field_query: Option<&'static str>,
37    pub extract_function_name: Option<ExtractFunctionNameHandler>,
38    pub find_method_for_receiver: Option<FindMethodForReceiverHandler>,
39    pub find_receiver_type: Option<FindReceiverTypeHandler>,
40    pub extract_inheritance: Option<ExtractInheritanceHandler>,
41}
42
43/// Get language information by language name.
44pub fn get_language_info(lang_name: &str) -> Option<LanguageInfo> {
45    match lang_name {
46        "rust" => Some(LanguageInfo {
47            name: "rust",
48            language: tree_sitter_rust::LANGUAGE.into(),
49            element_query: rust::ELEMENT_QUERY,
50            call_query: rust::CALL_QUERY,
51            reference_query: Some(rust::REFERENCE_QUERY),
52            import_query: Some(rust::IMPORT_QUERY),
53            impl_query: Some(rust::IMPL_QUERY),
54            assignment_query: Some(rust::ASSIGNMENT_QUERY),
55            field_query: Some(rust::FIELD_QUERY),
56            extract_function_name: Some(rust::extract_function_name),
57            find_method_for_receiver: Some(rust::find_method_for_receiver),
58            find_receiver_type: Some(rust::find_receiver_type),
59            extract_inheritance: Some(rust::extract_inheritance),
60        }),
61        "python" => Some(LanguageInfo {
62            name: "python",
63            language: tree_sitter_python::LANGUAGE.into(),
64            element_query: python::ELEMENT_QUERY,
65            call_query: python::CALL_QUERY,
66            reference_query: Some(python::REFERENCE_QUERY),
67            import_query: Some(python::IMPORT_QUERY),
68            impl_query: None,
69            assignment_query: None,
70            field_query: None,
71            extract_function_name: None,
72            find_method_for_receiver: None,
73            find_receiver_type: None,
74            extract_inheritance: Some(python::extract_inheritance),
75        }),
76        "typescript" => Some(LanguageInfo {
77            name: "typescript",
78            language: tree_sitter_typescript::LANGUAGE_TYPESCRIPT.into(),
79            element_query: typescript::ELEMENT_QUERY,
80            call_query: typescript::CALL_QUERY,
81            reference_query: Some(typescript::REFERENCE_QUERY),
82            import_query: Some(typescript::IMPORT_QUERY),
83            impl_query: None,
84            assignment_query: None,
85            field_query: None,
86            extract_function_name: None,
87            find_method_for_receiver: None,
88            find_receiver_type: None,
89            extract_inheritance: Some(typescript::extract_inheritance),
90        }),
91        "tsx" => Some(LanguageInfo {
92            name: "tsx",
93            language: tree_sitter_typescript::LANGUAGE_TSX.into(),
94            element_query: typescript::ELEMENT_QUERY,
95            call_query: typescript::CALL_QUERY,
96            reference_query: Some(typescript::REFERENCE_QUERY),
97            import_query: Some(typescript::IMPORT_QUERY),
98            impl_query: None,
99            assignment_query: None,
100            field_query: None,
101            extract_function_name: None,
102            find_method_for_receiver: None,
103            find_receiver_type: None,
104            extract_inheritance: Some(typescript::extract_inheritance),
105        }),
106        "go" => Some(LanguageInfo {
107            name: "go",
108            language: tree_sitter_go::LANGUAGE.into(),
109            element_query: go::ELEMENT_QUERY,
110            call_query: go::CALL_QUERY,
111            reference_query: Some(go::REFERENCE_QUERY),
112            import_query: Some(go::IMPORT_QUERY),
113            impl_query: None,
114            assignment_query: None,
115            field_query: None,
116            extract_function_name: None,
117            find_method_for_receiver: Some(go::find_method_for_receiver),
118            find_receiver_type: None,
119            extract_inheritance: Some(go::extract_inheritance),
120        }),
121        "java" => Some(LanguageInfo {
122            name: "java",
123            language: tree_sitter_java::LANGUAGE.into(),
124            element_query: java::ELEMENT_QUERY,
125            call_query: java::CALL_QUERY,
126            reference_query: Some(java::REFERENCE_QUERY),
127            import_query: Some(java::IMPORT_QUERY),
128            impl_query: None,
129            assignment_query: None,
130            field_query: None,
131            extract_function_name: None,
132            find_method_for_receiver: None,
133            find_receiver_type: None,
134            extract_inheritance: Some(java::extract_inheritance),
135        }),
136        _ => None,
137    }
138}