code_analyze_mcp/languages/
mod.rs1#[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
23pub type ExtractFunctionNameHandler = fn(&Node, &str, &str) -> Option<String>;
25
26pub type FindMethodForReceiverHandler = fn(&Node, &str, Option<usize>) -> Option<String>;
28
29pub type FindReceiverTypeHandler = fn(&Node, &str) -> Option<String>;
31
32pub type ExtractInheritanceHandler = fn(&Node, &str) -> Vec<String>;
34
35pub 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#[allow(clippy::too_many_lines)] pub 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}