Skip to main content

infiniloom_engine/parser/
queries.rs

1//! Tree-sitter query strings for symbol extraction
2//!
3//! This module contains the tree-sitter queries used to extract symbols
4//! from source code in various programming languages.
5
6/// Python symbol extraction query
7pub const PYTHON: &str = r#"
8    (function_definition
9      name: (identifier) @name) @function
10
11    (class_definition
12      name: (identifier) @name) @class
13
14    (class_definition
15      body: (block
16        (function_definition
17          name: (identifier) @name))) @method
18"#;
19
20/// JavaScript/JSX symbol extraction query
21pub const JAVASCRIPT: &str = r#"
22    (function_declaration
23      name: (_) @name) @function
24
25    (class_declaration
26      name: (identifier) @name) @class
27
28    (method_definition
29      name: (property_identifier) @name) @method
30
31    (arrow_function) @function
32
33    (variable_declarator
34      name: (identifier) @name
35      value: (arrow_function)) @function
36
37    (export_statement
38      (function_declaration
39        name: (identifier) @name)) @function
40"#;
41
42/// TypeScript symbol extraction query
43pub const TYPESCRIPT: &str = r#"
44    (function_declaration
45      name: (identifier) @name) @function
46
47    (class_declaration
48      name: (type_identifier) @name) @class
49
50    (method_definition
51      name: (property_identifier) @name) @method
52
53    (interface_declaration
54      name: (type_identifier) @name) @interface
55
56    (type_alias_declaration
57      name: (type_identifier) @name) @type
58
59    (arrow_function) @function
60
61    (variable_declarator
62      name: (identifier) @name
63      value: (arrow_function)) @function
64"#;
65
66/// Rust symbol extraction query
67pub const RUST: &str = r#"
68    (function_item
69      name: (identifier) @name) @function
70
71    (struct_item
72      name: (type_identifier) @name) @struct
73
74    (enum_item
75      name: (type_identifier) @name) @enum
76
77    (impl_item
78      type: (type_identifier) @name) @impl
79
80    (trait_item
81      name: (type_identifier) @name) @trait
82
83    (mod_item
84      name: (identifier) @name) @module
85
86    (macro_definition
87      name: (identifier) @name) @macro
88"#;
89
90/// Go symbol extraction query
91pub const GO: &str = r#"
92    (function_declaration
93      name: (identifier) @name) @function
94
95    (method_declaration
96      name: (field_identifier) @name) @method
97
98    (type_declaration
99      (type_spec
100        name: (type_identifier) @name)) @type
101
102    (type_declaration
103      (type_spec
104        name: (type_identifier) @name
105        type: (struct_type))) @struct
106
107    (type_declaration
108      (type_spec
109        name: (type_identifier) @name
110        type: (interface_type))) @interface
111"#;
112
113/// Java symbol extraction query
114pub const JAVA: &str = r#"
115    (method_declaration
116      name: (identifier) @name) @method
117
118    (class_declaration
119      name: (identifier) @name) @class
120
121    (interface_declaration
122      name: (identifier) @name) @interface
123
124    (enum_declaration
125      name: (identifier) @name) @enum
126
127    (constructor_declaration
128      name: (identifier) @name) @constructor
129"#;
130
131/// C symbol extraction query
132pub const C: &str = r#"
133    (function_definition
134      declarator: (function_declarator
135        declarator: (identifier) @name)) @function
136
137    (declaration
138      declarator: (function_declarator
139        declarator: (identifier) @name)) @function
140
141    (struct_specifier
142      name: (type_identifier) @name) @struct
143
144    (enum_specifier
145      name: (type_identifier) @name) @enum
146
147    (type_definition
148      declarator: (type_identifier) @name) @type
149"#;
150
151/// C++ symbol extraction query
152pub const CPP: &str = r#"
153    (function_definition
154      declarator: (function_declarator
155        declarator: (identifier) @name)) @function
156
157    (function_definition
158      declarator: (function_declarator
159        declarator: (qualified_identifier
160          name: (identifier) @name))) @function
161
162    (class_specifier
163      name: (type_identifier) @name) @class
164
165    (struct_specifier
166      name: (type_identifier) @name) @struct
167
168    (enum_specifier
169      name: (type_identifier) @name) @enum
170
171    (namespace_definition
172      name: (identifier) @name) @namespace
173
174    (template_declaration
175      (function_definition
176        declarator: (function_declarator
177          declarator: (identifier) @name))) @function
178"#;
179
180/// C# symbol extraction query
181pub const CSHARP: &str = r#"
182    (method_declaration
183      name: (identifier) @name) @method
184
185    (class_declaration
186      name: (identifier) @name) @class
187
188    (interface_declaration
189      name: (identifier) @name) @interface
190
191    (struct_declaration
192      name: (identifier) @name) @struct
193
194    (enum_declaration
195      name: (identifier) @name) @enum
196
197    (property_declaration
198      name: (identifier) @name) @property
199
200    (namespace_declaration
201      name: (identifier) @name) @namespace
202"#;
203
204/// Ruby symbol extraction query
205pub const RUBY: &str = r#"
206    (method
207      name: (identifier) @name) @method
208
209    (singleton_method
210      name: (identifier) @name) @method
211
212    (class
213      name: (constant) @name) @class
214
215    (module
216      name: (constant) @name) @module
217
218    (alias
219      name: (identifier) @name) @alias
220"#;
221
222/// Bash/Shell symbol extraction query
223pub const BASH: &str = r#"
224    (function_definition
225      name: (word) @name) @function
226"#;
227
228/// PHP symbol extraction query
229pub const PHP: &str = r#"
230    (function_definition
231      name: (name) @name) @function
232
233    (method_declaration
234      name: (name) @name) @method
235
236    (class_declaration
237      name: (name) @name) @class
238
239    (interface_declaration
240      name: (name) @name) @interface
241
242    (trait_declaration
243      name: (name) @name) @trait
244"#;
245
246/// Kotlin symbol extraction query
247pub const KOTLIN: &str = r#"
248    (function_declaration
249      (simple_identifier) @name) @function
250
251    (class_declaration
252      (type_identifier) @name) @class
253
254    (object_declaration
255      (type_identifier) @name) @class
256
257    (interface_declaration
258      (type_identifier) @name) @interface
259"#;
260
261/// Swift symbol extraction query
262pub const SWIFT: &str = r#"
263    (function_declaration
264      name: (simple_identifier) @name) @function
265
266    (class_declaration
267      name: (type_identifier) @name) @class
268
269    (struct_declaration
270      name: (type_identifier) @name) @struct
271
272    (enum_declaration
273      name: (type_identifier) @name) @enum
274
275    (protocol_declaration
276      name: (type_identifier) @name) @protocol
277"#;
278
279/// Scala symbol extraction query
280pub const SCALA: &str = r#"
281    (function_definition
282      name: (identifier) @name) @function
283
284    (class_definition
285      name: (identifier) @name) @class
286
287    (object_definition
288      name: (identifier) @name) @object
289
290    (trait_definition
291      name: (identifier) @name) @trait
292"#;
293
294/// Haskell symbol extraction query
295pub const HASKELL: &str = r#"
296    (function
297      name: (variable) @name) @function
298
299    (signature
300      name: (variable) @name) @signature
301
302    (type_synomym
303      name: (type) @name) @type
304
305    (newtype
306      name: (type) @name) @newtype
307
308    (adt
309      name: (type) @name) @data
310
311    (class
312      name: (type) @name) @class
313"#;
314
315/// Elixir symbol extraction query
316pub const ELIXIR: &str = r#"
317    (call
318      target: (identifier) @keyword
319      (arguments
320        (call
321          target: (identifier) @name)))
322
323    (call
324      target: (identifier) @keyword
325      (arguments
326        (identifier) @name))
327
328    (call
329      target: (identifier) @keyword
330      (arguments
331        (alias) @name))
332"#;
333
334/// Clojure symbol extraction query
335pub const CLOJURE: &str = r#"
336    (list_lit
337      (sym_lit) @keyword
338      (sym_lit) @name)
339"#;
340
341/// OCaml symbol extraction query
342pub const OCAML: &str = r#"
343    (value_definition
344      (let_binding
345        pattern: (value_name) @name)) @function
346
347    (type_definition
348      (type_binding
349        name: (type_constructor) @name)) @type
350
351    (module_definition
352      (module_binding
353        name: (module_name) @name)) @module
354"#;
355
356/// Lua symbol extraction query
357pub const LUA: &str = r#"
358    (function_declaration
359      name: (identifier) @name) @function
360
361    (function_declaration
362      name: (dot_index_expression
363        field: (identifier) @name)) @function
364
365    (local_function_declaration
366      name: (identifier) @name) @function
367
368    (function_definition_statement
369      name: (identifier) @name) @function
370"#;
371
372/// R symbol extraction query
373pub const R: &str = r#"
374    (left_assignment
375      name: (identifier) @name
376      value: (function_definition)) @function
377
378    (equals_assignment
379      name: (identifier) @name
380      value: (function_definition)) @function
381"#;
382
383/// HCL/Terraform symbol extraction query
384pub const HCL: &str = r#"
385    ; locals blocks (no label, identifier-only)
386    (block
387      (identifier) @name
388      (body)
389      (#eq? @name "locals")) @constant
390
391    ; module blocks
392    (block
393      (identifier) @_type
394      (string_lit
395        (template_literal) @name)
396      (#eq? @_type "module")) @module
397
398    ; dynamic blocks
399    (block
400      (identifier) @_type
401      (string_lit
402        (template_literal) @name)
403      (#eq? @_type "dynamic")) @function
404
405    ; Single-label blocks (variable, output, etc.)
406    (block
407      (identifier) @_type
408      (string_lit
409        (template_literal) @name)) @function
410
411    ; Double-label blocks (resource, data, etc.)
412    (block
413      (identifier) @_type
414      (string_lit
415        (template_literal) @_subtype)
416      (string_lit
417        (template_literal) @name)) @function
418"#;
419
420/// Zig symbol extraction query
421pub const ZIG: &str = r#"
422    (function_declaration
423      name: (identifier) @name) @function
424
425    (test_declaration
426      (string) @name) @function
427"#;
428
429/// Dart symbol extraction query
430pub const DART: &str = r#"
431    (function_signature
432      name: (identifier) @name) @function
433
434    (class_definition
435      name: (identifier) @name) @class
436
437    (method_signature
438      (function_signature
439        name: (identifier) @name)) @method
440
441    (enum_declaration
442      name: (identifier) @name) @enum
443
444    (mixin_declaration
445      (identifier) @name) @class
446"#;
447
448#[cfg(test)]
449mod tests {
450    use super::*;
451
452    // These are compile-time constant strings; verifying they're non-empty
453    // documents the expectation even if clippy optimizes it away.
454    #[allow(clippy::const_is_empty)]
455    #[test]
456    fn test_query_strings_not_empty() {
457        assert!(!PYTHON.is_empty());
458        assert!(!JAVASCRIPT.is_empty());
459        assert!(!TYPESCRIPT.is_empty());
460        assert!(!RUST.is_empty());
461        assert!(!GO.is_empty());
462        assert!(!JAVA.is_empty());
463        assert!(!C.is_empty());
464        assert!(!CPP.is_empty());
465        assert!(!CSHARP.is_empty());
466        assert!(!RUBY.is_empty());
467        assert!(!BASH.is_empty());
468        assert!(!PHP.is_empty());
469        assert!(!KOTLIN.is_empty());
470        assert!(!SWIFT.is_empty());
471        assert!(!SCALA.is_empty());
472        assert!(!HASKELL.is_empty());
473        assert!(!ELIXIR.is_empty());
474        assert!(!CLOJURE.is_empty());
475        assert!(!OCAML.is_empty());
476        assert!(!LUA.is_empty());
477        assert!(!R.is_empty());
478        assert!(!HCL.is_empty());
479        assert!(!ZIG.is_empty());
480        assert!(!DART.is_empty());
481    }
482}