barad-dur 0.17.3

The all-seeing repository analyzer
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
// ── Rust ─────────────────────────────────────────────────────────────

pub const RUST_COMPLEXITY: &str = r#"[
  (if_expression)
  (for_expression)
  (while_expression)
  (loop_expression)
  (match_expression)
] @cc"#;

pub const RUST_COMPLEXITY_OPERATORS: &str = r#"(binary_expression operator: ["&&" "||"]) @cc"#;

pub const RUST_PUBLIC_METHODS: &str =
    r#"(function_item (visibility_modifier) @vis name: (identifier) @name)"#;

pub const RUST_PROPERTIES: &str = r#"(field_declaration (visibility_modifier) @vis)"#;

pub const RUST_COMMENTS: &str = r#"[(line_comment) (block_comment)] @comment"#;

pub const RUST_FUNCTIONS: &str = r#"(function_item name: (identifier) @name) @func"#;

pub const RUST_NESTING: &str = r#"[
  (if_expression)
  (for_expression)
  (while_expression)
  (loop_expression)
  (match_expression)
] @nest"#;

// ── JavaScript ──────────────────────────────────────────────────────

pub const JS_COMPLEXITY: &str = r#"[
  (if_statement)
  (for_statement)
  (for_in_statement)
  (while_statement)
  (do_statement)
  (switch_statement)
  (catch_clause)
  (ternary_expression)
] @cc"#;

pub const JS_COMPLEXITY_OPERATORS: &str = r#"(binary_expression operator: ["&&" "||" "??"]) @cc"#;

pub const JS_PUBLIC_METHODS: &str = r#"(export_statement
  declaration: [
    (function_declaration)
    (lexical_declaration)
  ]
) @pub_method"#;

pub const JS_PROPERTIES: &str = r#"(field_definition) @prop"#;

pub const JS_COMMENTS: &str = r#"(comment) @comment"#;

pub const JS_FUNCTIONS: &str = r#"[
  (function_declaration name: (identifier) @name)
  (method_definition name: (property_identifier) @name)
] @func"#;

pub const JS_NESTING: &str = r#"[
  (if_statement)
  (for_statement)
  (for_in_statement)
  (while_statement)
  (do_statement)
  (switch_statement)
] @nest"#;

// ── TypeScript ──────────────────────────────────────────────────────
// TypeScript shares the same complexity and comment queries as JavaScript.
// Public methods and properties differ due to TS-specific node types.

pub const TS_PUBLIC_METHODS: &str = r#"(export_statement
  declaration: [
    (function_declaration)
    (lexical_declaration)
  ]
) @pub_method"#;

pub const TS_PROPERTIES: &str = r#"[
  (public_field_definition)
  (property_signature)
] @prop"#;

// ── Python ──────────────────────────────────────────────────────────

pub const PYTHON_COMPLEXITY: &str = r#"[
  (if_statement)
  (elif_clause)
  (for_statement)
  (while_statement)
  (except_clause)
  (boolean_operator)
  (conditional_expression)
] @cc"#;

pub const PYTHON_PUBLIC_METHODS: &str = r#"(function_definition name: (identifier) @name)"#;

pub const PYTHON_COMMENTS: &str = r#"(comment) @comment"#;

pub const PYTHON_FUNCTIONS: &str = r#"(function_definition name: (identifier) @name) @func"#;

pub const PYTHON_NESTING: &str = r#"[
  (if_statement)
  (for_statement)
  (while_statement)
  (with_statement)
] @nest"#;

// ── Go ──────────────────────────────────────────────────────────────

pub const GO_COMPLEXITY: &str = r#"[
  (if_statement)
  (for_statement)
  (expression_switch_statement)
  (type_switch_statement)
] @cc"#;

pub const GO_COMPLEXITY_OPERATORS: &str = r#"(binary_expression operator: ["&&" "||"]) @cc"#;

pub const GO_PUBLIC_METHODS: &str = r#"[
  (function_declaration name: (identifier) @name)
  (method_declaration name: (field_identifier) @name)
]"#;

pub const GO_PROPERTIES: &str = r#"(field_declaration name: (field_identifier) @name)"#;

pub const GO_COMMENTS: &str = r#"(comment) @comment"#;

pub const GO_FUNCTIONS: &str = r#"[
  (function_declaration name: (identifier) @name)
  (method_declaration name: (field_identifier) @name)
] @func"#;

pub const GO_NESTING: &str = r#"[
  (if_statement)
  (for_statement)
  (expression_switch_statement)
  (type_switch_statement)
] @nest"#;

// ── Java ────────────────────────────────────────────────────────────

pub const JAVA_COMPLEXITY: &str = r#"[
  (if_statement)
  (for_statement)
  (enhanced_for_statement)
  (while_statement)
  (do_statement)
  (switch_expression)
  (catch_clause)
  (ternary_expression)
] @cc"#;

pub const JAVA_COMPLEXITY_OPERATORS: &str = r#"(binary_expression operator: ["&&" "||"]) @cc"#;

pub const JAVA_PUBLIC_METHODS: &str =
    r#"(method_declaration (modifiers) @mods name: (identifier) @name)"#;

pub const JAVA_PROPERTIES: &str = r#"(field_declaration (modifiers) @mods)"#;

pub const JAVA_COMMENTS: &str = r#"[(line_comment) (block_comment)] @comment"#;

pub const JAVA_FUNCTIONS: &str = r#"(method_declaration name: (identifier) @name) @func"#;

pub const JAVA_NESTING: &str = r#"[
  (if_statement)
  (for_statement)
  (enhanced_for_statement)
  (while_statement)
  (do_statement)
  (switch_expression)
] @nest"#;

// ── C# ──────────────────────────────────────────────────────────────

pub const CSHARP_COMPLEXITY: &str = r#"[
  (if_statement)
  (for_statement)
  (foreach_statement)
  (while_statement)
  (do_statement)
  (switch_expression)
  (catch_clause)
  (conditional_expression)
] @cc"#;

pub const CSHARP_COMPLEXITY_OPERATORS: &str = r#"(binary_expression operator: ["&&" "||"]) @cc"#;

pub const CSHARP_PUBLIC_METHODS: &str =
    r#"(method_declaration (modifier) @mod name: (identifier) @name)"#;

pub const CSHARP_PROPERTIES: &str = r#"(field_declaration (modifier) @mod)"#;

pub const CSHARP_COMMENTS: &str = r#"(comment) @comment"#;

pub const CSHARP_FUNCTIONS: &str = r#"(method_declaration name: (identifier) @name) @func"#;

pub const CSHARP_NESTING: &str = r#"[
  (if_statement)
  (for_statement)
  (foreach_statement)
  (while_statement)
  (do_statement)
  (switch_statement)
] @nest"#;

// ── Kotlin ──────────────────────────────────────────────────────────

pub const KOTLIN_COMPLEXITY: &str = r#"[
  (if_expression)
  (for_statement)
  (while_statement)
  (do_while_statement)
  (when_expression)
  (catch_block)
  (try_expression)
] @cc"#;

pub const KOTLIN_COMPLEXITY_OPERATORS: &str = r#"(binary_expression operator: ["&&" "||"]) @cc"#;

pub const KOTLIN_PUBLIC_METHODS: &str =
    r#"(function_declaration (modifiers (visibility_modifier)) name: (identifier) @name)"#;

pub const KOTLIN_PROPERTIES: &str =
    r#"(property_declaration (modifiers (visibility_modifier)) @mods)"#;

pub const KOTLIN_COMMENTS: &str = r#"[(line_comment) (block_comment)] @comment"#;

pub const KOTLIN_FUNCTIONS: &str = r#"(function_declaration name: (identifier) @name) @func"#;

pub const KOTLIN_NESTING: &str = r#"[
  (if_expression)
  (for_statement)
  (while_statement)
  (do_while_statement)
  (when_expression)
] @nest"#;

// ── Import queries ─────────────────────────────────────────────────

pub const RUST_IMPORTS: &str = r#"(use_declaration argument: (_) @path)"#;

pub const JS_IMPORTS: &str = r#"[
  (import_statement source: (string) @path)
  (call_expression
    function: (identifier) @fn
    arguments: (arguments (string) @path)
    (#eq? @fn "require"))
] "#;

pub const PYTHON_IMPORTS: &str = r#"[
  (import_statement name: (dotted_name) @path)
  (import_from_statement module_name: (dotted_name) @path)
]"#;

pub const GO_IMPORTS: &str = r#"(import_spec path: (interpreted_string_literal) @path)"#;

pub const JAVA_IMPORTS: &str = r#"(import_declaration (scoped_identifier) @path)"#;

pub const CSHARP_IMPORTS: &str = r#"(using_directive (_) @path)"#;

pub const KOTLIN_IMPORTS: &str = r#"(import (identifier) @path)"#;

#[cfg(test)]
mod tests {
    use super::*;

    fn assert_valid_query(grammar: tree_sitter::Language, query_src: &str, label: &str) {
        tree_sitter::Query::new(&grammar, query_src)
            .unwrap_or_else(|e| panic!("{label} query failed: {e}"));
    }

    fn rust() -> tree_sitter::Language {
        tree_sitter_rust::LANGUAGE.into()
    }
    fn js() -> tree_sitter::Language {
        tree_sitter_javascript::LANGUAGE.into()
    }
    fn ts() -> tree_sitter::Language {
        tree_sitter_typescript::LANGUAGE_TYPESCRIPT.into()
    }
    fn python() -> tree_sitter::Language {
        tree_sitter_python::LANGUAGE.into()
    }
    fn go() -> tree_sitter::Language {
        tree_sitter_go::LANGUAGE.into()
    }
    fn java() -> tree_sitter::Language {
        tree_sitter_java::LANGUAGE.into()
    }
    fn csharp() -> tree_sitter::Language {
        tree_sitter_c_sharp::LANGUAGE.into()
    }
    fn kotlin() -> tree_sitter::Language {
        tree_sitter_kotlin_ng::LANGUAGE.into()
    }

    #[test]
    fn rust_queries_are_valid() {
        assert_valid_query(rust(), RUST_COMPLEXITY, "rust complexity");
        assert_valid_query(rust(), RUST_COMPLEXITY_OPERATORS, "rust operators");
        assert_valid_query(rust(), RUST_PUBLIC_METHODS, "rust public_methods");
        assert_valid_query(rust(), RUST_PROPERTIES, "rust properties");
        assert_valid_query(rust(), RUST_COMMENTS, "rust comments");
        assert_valid_query(rust(), RUST_FUNCTIONS, "rust functions");
        assert_valid_query(rust(), RUST_NESTING, "rust nesting");
    }

    #[test]
    fn js_queries_are_valid() {
        assert_valid_query(js(), JS_COMPLEXITY, "js complexity");
        assert_valid_query(js(), JS_COMPLEXITY_OPERATORS, "js operators");
        assert_valid_query(js(), JS_PUBLIC_METHODS, "js public_methods");
        assert_valid_query(js(), JS_PROPERTIES, "js properties");
        assert_valid_query(js(), JS_COMMENTS, "js comments");
        assert_valid_query(js(), JS_FUNCTIONS, "js functions");
        assert_valid_query(js(), JS_NESTING, "js nesting");
    }

    #[test]
    fn ts_queries_are_valid() {
        // TS shares JS complexity + operators + comments queries
        assert_valid_query(ts(), JS_COMPLEXITY, "ts complexity");
        assert_valid_query(ts(), JS_COMPLEXITY_OPERATORS, "ts operators");
        assert_valid_query(ts(), TS_PUBLIC_METHODS, "ts public_methods");
        assert_valid_query(ts(), TS_PROPERTIES, "ts properties");
        assert_valid_query(ts(), JS_COMMENTS, "ts comments");
    }

    #[test]
    fn python_queries_are_valid() {
        assert_valid_query(python(), PYTHON_COMPLEXITY, "python complexity");
        assert_valid_query(python(), PYTHON_PUBLIC_METHODS, "python public_methods");
        assert_valid_query(python(), PYTHON_FUNCTIONS, "python functions");
        assert_valid_query(python(), PYTHON_NESTING, "python nesting");
        assert_valid_query(python(), PYTHON_COMMENTS, "python comments");
    }

    #[test]
    fn go_queries_are_valid() {
        assert_valid_query(go(), GO_COMPLEXITY, "go complexity");
        assert_valid_query(go(), GO_COMPLEXITY_OPERATORS, "go operators");
        assert_valid_query(go(), GO_PUBLIC_METHODS, "go public_methods");
        assert_valid_query(go(), GO_PROPERTIES, "go properties");
        assert_valid_query(go(), GO_COMMENTS, "go comments");
        assert_valid_query(go(), GO_FUNCTIONS, "go functions");
        assert_valid_query(go(), GO_NESTING, "go nesting");
    }

    #[test]
    fn java_queries_are_valid() {
        assert_valid_query(java(), JAVA_COMPLEXITY, "java complexity");
        assert_valid_query(java(), JAVA_COMPLEXITY_OPERATORS, "java operators");
        assert_valid_query(java(), JAVA_PUBLIC_METHODS, "java public_methods");
        assert_valid_query(java(), JAVA_PROPERTIES, "java properties");
        assert_valid_query(java(), JAVA_COMMENTS, "java comments");
        assert_valid_query(java(), JAVA_FUNCTIONS, "java functions");
        assert_valid_query(java(), JAVA_NESTING, "java nesting");
    }

    #[test]
    fn csharp_queries_are_valid() {
        assert_valid_query(csharp(), CSHARP_COMPLEXITY, "csharp complexity");
        assert_valid_query(csharp(), CSHARP_COMPLEXITY_OPERATORS, "csharp operators");
        assert_valid_query(csharp(), CSHARP_PUBLIC_METHODS, "csharp public_methods");
        assert_valid_query(csharp(), CSHARP_PROPERTIES, "csharp properties");
        assert_valid_query(csharp(), CSHARP_COMMENTS, "csharp comments");
        assert_valid_query(csharp(), CSHARP_FUNCTIONS, "csharp functions");
        assert_valid_query(csharp(), CSHARP_NESTING, "csharp nesting");
    }

    #[test]
    fn rust_import_query_is_valid() {
        assert_valid_query(rust(), RUST_IMPORTS, "rust imports");
    }

    #[test]
    fn js_import_query_is_valid() {
        assert_valid_query(js(), JS_IMPORTS, "js imports");
    }

    #[test]
    fn ts_import_query_is_valid() {
        assert_valid_query(ts(), JS_IMPORTS, "ts imports");
    }

    #[test]
    fn python_import_query_is_valid() {
        assert_valid_query(python(), PYTHON_IMPORTS, "python imports");
    }

    #[test]
    fn go_import_query_is_valid() {
        assert_valid_query(go(), GO_IMPORTS, "go imports");
    }

    #[test]
    fn java_import_query_is_valid() {
        assert_valid_query(java(), JAVA_IMPORTS, "java imports");
    }

    #[test]
    fn csharp_import_query_is_valid() {
        assert_valid_query(csharp(), CSHARP_IMPORTS, "csharp imports");
    }

    #[test]
    fn kotlin_queries_are_valid() {
        assert_valid_query(kotlin(), KOTLIN_COMPLEXITY, "kotlin complexity");
        assert_valid_query(kotlin(), KOTLIN_COMPLEXITY_OPERATORS, "kotlin operators");
        assert_valid_query(kotlin(), KOTLIN_PUBLIC_METHODS, "kotlin public_methods");
        assert_valid_query(kotlin(), KOTLIN_PROPERTIES, "kotlin properties");
        assert_valid_query(kotlin(), KOTLIN_COMMENTS, "kotlin comments");
        assert_valid_query(kotlin(), KOTLIN_FUNCTIONS, "kotlin functions");
        assert_valid_query(kotlin(), KOTLIN_NESTING, "kotlin nesting");
    }

    #[test]
    fn kotlin_import_query_is_valid() {
        assert_valid_query(kotlin(), KOTLIN_IMPORTS, "kotlin imports");
    }
}