code-gauge 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +83 -21
  2. package/dist/cli.cjs +3 -3
  3. package/dist/cli.cjs.map +1 -1
  4. package/dist/cli.js +3 -3
  5. package/dist/cli.js.map +1 -1
  6. package/dist/cliConfig.cjs +1 -1
  7. package/dist/cliConfig.cjs.map +1 -1
  8. package/dist/cliConfig.d.ts +11 -0
  9. package/dist/cliConfig.js +1 -1
  10. package/dist/cliConfig.js.map +1 -1
  11. package/dist/crossFileDuplication.cjs +1 -1
  12. package/dist/crossFileDuplication.cjs.map +1 -1
  13. package/dist/crossFileDuplication.js +1 -1
  14. package/dist/crossFileDuplication.js.map +1 -1
  15. package/dist/diffCommand.cjs +5 -0
  16. package/dist/diffCommand.cjs.map +1 -0
  17. package/dist/diffCommand.d.ts +17 -0
  18. package/dist/diffCommand.js +5 -0
  19. package/dist/diffCommand.js.map +1 -0
  20. package/dist/duplication.cjs +1 -1
  21. package/dist/duplication.cjs.map +1 -1
  22. package/dist/duplication.d.ts +20 -24
  23. package/dist/duplication.js +1 -1
  24. package/dist/duplication.js.map +1 -1
  25. package/dist/git.cjs +2 -0
  26. package/dist/git.cjs.map +1 -0
  27. package/dist/git.d.ts +27 -0
  28. package/dist/git.js +2 -0
  29. package/dist/git.js.map +1 -0
  30. package/dist/index.cjs +1 -1
  31. package/dist/index.d.ts +3 -2
  32. package/dist/index.js +1 -1
  33. package/dist/languages.cjs +1 -1
  34. package/dist/languages.cjs.map +1 -1
  35. package/dist/languages.d.ts +5 -0
  36. package/dist/languages.js +1 -1
  37. package/dist/languages.js.map +1 -1
  38. package/dist/metrics.cjs +1 -1
  39. package/dist/metrics.cjs.map +1 -1
  40. package/dist/metrics.d.ts +18 -5
  41. package/dist/metrics.js +1 -1
  42. package/dist/metrics.js.map +1 -1
  43. package/dist/nativeMetrics.cjs +3 -1
  44. package/dist/nativeMetrics.cjs.map +1 -1
  45. package/dist/nativeMetrics.d.ts +29 -10
  46. package/dist/nativeMetrics.js +3 -1
  47. package/dist/nativeMetrics.js.map +1 -1
  48. package/dist/regressionGate.cjs +2 -0
  49. package/dist/regressionGate.cjs.map +1 -0
  50. package/dist/regressionGate.d.ts +106 -0
  51. package/dist/regressionGate.js +2 -0
  52. package/dist/regressionGate.js.map +1 -0
  53. package/dist/scan.cjs +2 -0
  54. package/dist/scan.cjs.map +1 -0
  55. package/dist/scan.d.ts +55 -0
  56. package/dist/scan.js +2 -0
  57. package/dist/scan.js.map +1 -0
  58. package/dist/types.d.ts +18 -13
  59. package/native/Cargo.lock +523 -0
  60. package/native/Cargo.toml +45 -0
  61. package/native/build.rs +3 -0
  62. package/native/src/complexity.rs +627 -0
  63. package/native/src/dep_degree.rs +253 -0
  64. package/native/src/duplication.rs +2007 -0
  65. package/native/src/functions.rs +345 -0
  66. package/native/src/languages.rs +647 -0
  67. package/native/src/lib.rs +101 -0
  68. package/native/src/measure.rs +590 -0
  69. package/native/src/ncss.rs +263 -0
  70. package/native/src/types.rs +135 -0
  71. package/native/src/util.rs +139 -0
  72. package/package.json +16 -19
  73. package/scripts/buildNative.mjs +25 -0
  74. package/scripts/installNative.mjs +96 -0
  75. package/dist/ncss.cjs +0 -2
  76. package/dist/ncss.cjs.map +0 -1
  77. package/dist/ncss.d.ts +0 -17
  78. package/dist/ncss.js +0 -2
  79. package/dist/ncss.js.map +0 -1
@@ -0,0 +1,647 @@
1
+ use tree_sitter::Language;
2
+
3
+ /// Per-language node-type configuration mirroring src/languages.ts.
4
+ pub struct LanguageDefinition {
5
+ pub name: &'static str,
6
+ pub aliases: &'static [&'static str],
7
+ grammar_id: GrammarId,
8
+ pub function_node_types: &'static [&'static str],
9
+ pub decision_node_types: &'static [&'static str],
10
+ pub nesting_node_types: &'static [&'static str],
11
+ pub ncss_node_types: &'static [&'static str],
12
+ pub ncss_container_node_types: &'static [&'static str],
13
+ }
14
+
15
+ #[derive(Clone, Copy)]
16
+ enum GrammarId {
17
+ C,
18
+ Cpp,
19
+ Go,
20
+ Java,
21
+ JavaScript,
22
+ Python,
23
+ Ruby,
24
+ Rust,
25
+ TypeScript,
26
+ Tsx,
27
+ }
28
+
29
+ impl LanguageDefinition {
30
+ pub fn grammar(&self) -> Language {
31
+ match self.grammar_id {
32
+ GrammarId::C => tree_sitter_c::language(),
33
+ GrammarId::Cpp => tree_sitter_cpp::language(),
34
+ GrammarId::Go => tree_sitter_go::language(),
35
+ GrammarId::Java => tree_sitter_java::language(),
36
+ GrammarId::JavaScript => tree_sitter_javascript::language(),
37
+ GrammarId::Python => tree_sitter_python::language(),
38
+ GrammarId::Ruby => tree_sitter_ruby::language(),
39
+ GrammarId::Rust => tree_sitter_rust::language(),
40
+ GrammarId::TypeScript => tree_sitter_typescript::language_typescript(),
41
+ GrammarId::Tsx => tree_sitter_typescript::language_tsx(),
42
+ }
43
+ }
44
+ }
45
+
46
+ const COMMON_FUNCTION_NODES: &[&str] = &[
47
+ "function",
48
+ "function_declaration",
49
+ "function_definition",
50
+ "function_expression",
51
+ "function_item",
52
+ "function_signature_item",
53
+ "function_declarator",
54
+ "func_literal",
55
+ "method_declaration",
56
+ "method_definition",
57
+ "method_spec",
58
+ "arrow_function",
59
+ "generator_function",
60
+ "generator_function_declaration",
61
+ "lambda",
62
+ "lambda_expression",
63
+ "closure_expression",
64
+ ];
65
+
66
+ const COMMON_DECISION_NODES: &[&str] = &[
67
+ "if_statement",
68
+ "elif_clause",
69
+ "else_if_clause",
70
+ "for_statement",
71
+ "for_in_statement",
72
+ "while_statement",
73
+ "do_statement",
74
+ "catch_clause",
75
+ "except_clause",
76
+ "case_clause",
77
+ "switch_case",
78
+ "match_arm",
79
+ "conditional_expression",
80
+ "ternary_expression",
81
+ "if_expression",
82
+ "while_expression",
83
+ "for_expression",
84
+ "loop_expression",
85
+ ];
86
+
87
+ const GO_DECISION_NODES: &[&str] = &[
88
+ "if_statement",
89
+ "elif_clause",
90
+ "else_if_clause",
91
+ "for_statement",
92
+ "for_in_statement",
93
+ "while_statement",
94
+ "do_statement",
95
+ "catch_clause",
96
+ "except_clause",
97
+ "case_clause",
98
+ "switch_case",
99
+ "match_arm",
100
+ "conditional_expression",
101
+ "ternary_expression",
102
+ "if_expression",
103
+ "while_expression",
104
+ "for_expression",
105
+ "loop_expression",
106
+ "expression_case",
107
+ "type_case",
108
+ "communication_case",
109
+ ];
110
+
111
+ // Default switch branches add no decision, but their contents are nested inside the switch like
112
+ // any other arm, so they appear in the nesting sets only.
113
+ const COMMON_NESTING_NODES: &[&str] = &[
114
+ "if_statement",
115
+ "elif_clause",
116
+ "else_if_clause",
117
+ "for_statement",
118
+ "for_in_statement",
119
+ "while_statement",
120
+ "do_statement",
121
+ "catch_clause",
122
+ "except_clause",
123
+ "case_clause",
124
+ "switch_case",
125
+ "match_arm",
126
+ "conditional_expression",
127
+ "ternary_expression",
128
+ "if_expression",
129
+ "while_expression",
130
+ "for_expression",
131
+ "loop_expression",
132
+ "switch_default",
133
+ ];
134
+ const GO_NESTING_NODES: &[&str] = &[
135
+ "if_statement",
136
+ "elif_clause",
137
+ "else_if_clause",
138
+ "for_statement",
139
+ "for_in_statement",
140
+ "while_statement",
141
+ "do_statement",
142
+ "catch_clause",
143
+ "except_clause",
144
+ "case_clause",
145
+ "switch_case",
146
+ "match_arm",
147
+ "conditional_expression",
148
+ "ternary_expression",
149
+ "if_expression",
150
+ "while_expression",
151
+ "for_expression",
152
+ "loop_expression",
153
+ "expression_case",
154
+ "type_case",
155
+ "communication_case",
156
+ "default_case",
157
+ ];
158
+
159
+ const JAVA_FUNCTION_NODES: &[&str] = &[
160
+ "function",
161
+ "function_declaration",
162
+ "function_definition",
163
+ "function_expression",
164
+ "function_item",
165
+ "function_signature_item",
166
+ "function_declarator",
167
+ "func_literal",
168
+ "method_declaration",
169
+ "method_definition",
170
+ "method_spec",
171
+ "arrow_function",
172
+ "generator_function",
173
+ "generator_function_declaration",
174
+ "lambda",
175
+ "lambda_expression",
176
+ "closure_expression",
177
+ "constructor_declaration",
178
+ "compact_constructor_declaration",
179
+ ];
180
+
181
+ const JAVA_DECISION_NODES: &[&str] = &[
182
+ "if_statement",
183
+ "elif_clause",
184
+ "else_if_clause",
185
+ "for_statement",
186
+ "for_in_statement",
187
+ "while_statement",
188
+ "do_statement",
189
+ "catch_clause",
190
+ "except_clause",
191
+ "case_clause",
192
+ "switch_case",
193
+ "match_arm",
194
+ "conditional_expression",
195
+ "ternary_expression",
196
+ "if_expression",
197
+ "while_expression",
198
+ "for_expression",
199
+ "loop_expression",
200
+ "enhanced_for_statement",
201
+ "switch_block_statement_group",
202
+ "switch_rule",
203
+ ];
204
+
205
+ const RUBY_FUNCTION_NODES: &[&str] = &["method", "singleton_method", "lambda", "block", "do_block"];
206
+ const RUBY_DECISION_NODES: &[&str] = &[
207
+ "if",
208
+ "elsif",
209
+ "unless",
210
+ "while",
211
+ "until",
212
+ "for",
213
+ "when",
214
+ "in_clause",
215
+ "rescue",
216
+ "conditional",
217
+ "if_modifier",
218
+ "unless_modifier",
219
+ "while_modifier",
220
+ "until_modifier",
221
+ "rescue_modifier",
222
+ ];
223
+
224
+ const C_FUNCTION_NODES: &[&str] = &["function_definition", "lambda_expression"];
225
+ const C_DECISION_NODES: &[&str] = &[
226
+ "if_statement",
227
+ "elif_clause",
228
+ "else_if_clause",
229
+ "for_statement",
230
+ "for_in_statement",
231
+ "while_statement",
232
+ "do_statement",
233
+ "catch_clause",
234
+ "except_clause",
235
+ "case_clause",
236
+ "switch_case",
237
+ "match_arm",
238
+ "conditional_expression",
239
+ "ternary_expression",
240
+ "if_expression",
241
+ "while_expression",
242
+ "for_expression",
243
+ "loop_expression",
244
+ "case_statement",
245
+ ];
246
+ const CPP_DECISION_NODES: &[&str] = &[
247
+ "if_statement",
248
+ "elif_clause",
249
+ "else_if_clause",
250
+ "for_statement",
251
+ "for_in_statement",
252
+ "while_statement",
253
+ "do_statement",
254
+ "catch_clause",
255
+ "except_clause",
256
+ "case_clause",
257
+ "switch_case",
258
+ "match_arm",
259
+ "conditional_expression",
260
+ "ternary_expression",
261
+ "if_expression",
262
+ "while_expression",
263
+ "for_expression",
264
+ "loop_expression",
265
+ "case_statement",
266
+ "for_range_loop",
267
+ ];
268
+
269
+ // NCSS node sets: every listed type counts as one non-commenting source statement. The Java set is
270
+ // calibrated against PMD's NcssCount rule; see src/languages.ts.
271
+ const JS_NCSS_NODES: &[&str] = &[
272
+ "import_statement",
273
+ "export_statement",
274
+ "lexical_declaration",
275
+ "variable_declaration",
276
+ "function_declaration",
277
+ "function_signature",
278
+ "generator_function_declaration",
279
+ "class_declaration",
280
+ "abstract_class_declaration",
281
+ "module",
282
+ "method_definition",
283
+ "abstract_method_signature",
284
+ "class_static_block",
285
+ "field_definition",
286
+ "public_field_definition",
287
+ "type_alias_declaration",
288
+ "interface_declaration",
289
+ "enum_declaration",
290
+ "expression_statement",
291
+ "if_statement",
292
+ "else_clause",
293
+ "switch_statement",
294
+ "switch_case",
295
+ "switch_default",
296
+ "for_statement",
297
+ "for_in_statement",
298
+ "while_statement",
299
+ "do_statement",
300
+ "catch_clause",
301
+ "finally_clause",
302
+ "labeled_statement",
303
+ "return_statement",
304
+ "break_statement",
305
+ "continue_statement",
306
+ "throw_statement",
307
+ "debugger_statement",
308
+ "with_statement",
309
+ ];
310
+
311
+ const PYTHON_NCSS_NODES: &[&str] = &[
312
+ "import_statement",
313
+ "import_from_statement",
314
+ "future_import_statement",
315
+ "print_statement",
316
+ "exec_statement",
317
+ "assert_statement",
318
+ "expression_statement",
319
+ "return_statement",
320
+ "delete_statement",
321
+ "raise_statement",
322
+ "pass_statement",
323
+ "break_statement",
324
+ "continue_statement",
325
+ "global_statement",
326
+ "nonlocal_statement",
327
+ "if_statement",
328
+ "elif_clause",
329
+ "else_clause",
330
+ "for_statement",
331
+ "while_statement",
332
+ "except_clause",
333
+ "except_group_clause",
334
+ "finally_clause",
335
+ "with_statement",
336
+ "match_statement",
337
+ "case_clause",
338
+ "function_definition",
339
+ "class_definition",
340
+ "type_alias_statement",
341
+ ];
342
+
343
+ const GO_NCSS_NODES: &[&str] = &[
344
+ "package_clause",
345
+ "import_spec",
346
+ "type_spec",
347
+ "type_alias",
348
+ "const_spec",
349
+ "var_spec",
350
+ "function_declaration",
351
+ "method_declaration",
352
+ // Struct fields and interface members count contextually (see ncss.rs): only inside a named
353
+ // `type T struct/interface { ... }`, not in inline anonymous types, which are part of one
354
+ // declaration.
355
+ "short_var_declaration",
356
+ "expression_statement",
357
+ "send_statement",
358
+ "inc_statement",
359
+ "dec_statement",
360
+ "assignment_statement",
361
+ "if_statement",
362
+ "for_statement",
363
+ "expression_switch_statement",
364
+ "type_switch_statement",
365
+ "select_statement",
366
+ "expression_case",
367
+ "type_case",
368
+ "communication_case",
369
+ "default_case",
370
+ "return_statement",
371
+ "break_statement",
372
+ "continue_statement",
373
+ "goto_statement",
374
+ "fallthrough_statement",
375
+ "defer_statement",
376
+ "go_statement",
377
+ "labeled_statement",
378
+ ];
379
+
380
+ const RUST_NCSS_NODES: &[&str] = &[
381
+ "use_declaration",
382
+ "extern_crate_declaration",
383
+ "foreign_mod_item",
384
+ "mod_item",
385
+ "const_item",
386
+ "static_item",
387
+ "struct_item",
388
+ "enum_item",
389
+ "union_item",
390
+ "trait_item",
391
+ "impl_item",
392
+ "function_item",
393
+ "function_signature_item",
394
+ "type_item",
395
+ "associated_type",
396
+ "macro_definition",
397
+ "field_declaration",
398
+ "let_declaration",
399
+ "expression_statement",
400
+ "else_clause",
401
+ "match_arm",
402
+ ];
403
+ // `else_clause` is a container so `else if` chains count the nested if_expression; a plain
404
+ // `else { ... }` is unaffected because its only child is a `block`, itself a container.
405
+ const RUST_NCSS_CONTAINERS: &[&str] = &["block", "else_clause"];
406
+
407
+ const JAVA_NCSS_NODES: &[&str] = &[
408
+ "package_declaration",
409
+ "import_declaration",
410
+ "module_declaration",
411
+ "requires_module_directive",
412
+ "exports_module_directive",
413
+ "opens_module_directive",
414
+ "uses_module_directive",
415
+ "provides_module_directive",
416
+ "class_declaration",
417
+ "interface_declaration",
418
+ "enum_declaration",
419
+ "annotation_type_declaration",
420
+ "annotation_type_element_declaration",
421
+ "record_declaration",
422
+ "field_declaration",
423
+ "constant_declaration",
424
+ "method_declaration",
425
+ "constructor_declaration",
426
+ "compact_constructor_declaration",
427
+ "static_initializer",
428
+ "explicit_constructor_invocation",
429
+ "local_variable_declaration",
430
+ "expression_statement",
431
+ "if_statement",
432
+ "while_statement",
433
+ "do_statement",
434
+ "for_statement",
435
+ "enhanced_for_statement",
436
+ "switch_statement",
437
+ "switch_expression",
438
+ "switch_label",
439
+ "break_statement",
440
+ "continue_statement",
441
+ "return_statement",
442
+ "throw_statement",
443
+ "assert_statement",
444
+ "synchronized_statement",
445
+ "labeled_statement",
446
+ "yield_statement",
447
+ "resource",
448
+ "catch_clause",
449
+ "finally_clause",
450
+ ];
451
+
452
+ // Ruby statements have no wrapper node types, so bodies are counted positionally (see
453
+ // ncss_container_node_types); only clause nodes hanging off non-container parents need listing.
454
+ const RUBY_NCSS_NODES: &[&str] = &["elsif", "else", "when", "in_clause", "rescue", "ensure"];
455
+ const RUBY_NCSS_CONTAINERS: &[&str] = &[
456
+ "program",
457
+ "body_statement",
458
+ "then",
459
+ "else",
460
+ "do",
461
+ "block_body",
462
+ "begin",
463
+ "ensure",
464
+ ];
465
+
466
+ const C_NCSS_NODES: &[&str] = &[
467
+ "preproc_include",
468
+ "preproc_def",
469
+ "preproc_function_def",
470
+ "declaration",
471
+ "type_definition",
472
+ "field_declaration",
473
+ "function_definition",
474
+ // Counted only when they carry a body (see BODYLESS_NCSS_SPECIFIER_TYPES in ncss.rs).
475
+ "struct_specifier",
476
+ "enum_specifier",
477
+ "union_specifier",
478
+ "expression_statement",
479
+ "if_statement",
480
+ "else_clause",
481
+ "switch_statement",
482
+ "case_statement",
483
+ "for_statement",
484
+ "while_statement",
485
+ "do_statement",
486
+ "return_statement",
487
+ "break_statement",
488
+ "continue_statement",
489
+ "goto_statement",
490
+ "labeled_statement",
491
+ ];
492
+ const CPP_NCSS_NODES: &[&str] = &[
493
+ "preproc_include",
494
+ "preproc_def",
495
+ "preproc_function_def",
496
+ "declaration",
497
+ "type_definition",
498
+ "field_declaration",
499
+ "function_definition",
500
+ "struct_specifier",
501
+ "enum_specifier",
502
+ "union_specifier",
503
+ "expression_statement",
504
+ "if_statement",
505
+ "else_clause",
506
+ "switch_statement",
507
+ "case_statement",
508
+ "for_statement",
509
+ "while_statement",
510
+ "do_statement",
511
+ "return_statement",
512
+ "break_statement",
513
+ "continue_statement",
514
+ "goto_statement",
515
+ "labeled_statement",
516
+ "class_specifier",
517
+ "namespace_definition",
518
+ "using_declaration",
519
+ "alias_declaration",
520
+ "namespace_alias_definition",
521
+ "concept_definition",
522
+ "static_assert_declaration",
523
+ "for_range_loop",
524
+ "catch_clause",
525
+ "throw_statement",
526
+ "co_return_statement",
527
+ "co_yield_statement",
528
+ ];
529
+
530
+ pub const LANGUAGES: &[LanguageDefinition] = &[
531
+ LanguageDefinition {
532
+ name: "javascript",
533
+ aliases: &["js", "mjs", "cjs"],
534
+ grammar_id: GrammarId::JavaScript,
535
+ function_node_types: COMMON_FUNCTION_NODES,
536
+ decision_node_types: COMMON_DECISION_NODES,
537
+ nesting_node_types: COMMON_NESTING_NODES,
538
+ ncss_node_types: JS_NCSS_NODES,
539
+ ncss_container_node_types: &[],
540
+ },
541
+ LanguageDefinition {
542
+ name: "jsx",
543
+ aliases: &[],
544
+ grammar_id: GrammarId::JavaScript,
545
+ function_node_types: COMMON_FUNCTION_NODES,
546
+ decision_node_types: COMMON_DECISION_NODES,
547
+ nesting_node_types: COMMON_NESTING_NODES,
548
+ ncss_node_types: JS_NCSS_NODES,
549
+ ncss_container_node_types: &[],
550
+ },
551
+ LanguageDefinition {
552
+ name: "typescript",
553
+ aliases: &["ts"],
554
+ grammar_id: GrammarId::TypeScript,
555
+ function_node_types: COMMON_FUNCTION_NODES,
556
+ decision_node_types: COMMON_DECISION_NODES,
557
+ nesting_node_types: COMMON_NESTING_NODES,
558
+ ncss_node_types: JS_NCSS_NODES,
559
+ ncss_container_node_types: &[],
560
+ },
561
+ LanguageDefinition {
562
+ name: "tsx",
563
+ aliases: &[],
564
+ grammar_id: GrammarId::Tsx,
565
+ function_node_types: COMMON_FUNCTION_NODES,
566
+ decision_node_types: COMMON_DECISION_NODES,
567
+ nesting_node_types: COMMON_NESTING_NODES,
568
+ ncss_node_types: JS_NCSS_NODES,
569
+ ncss_container_node_types: &[],
570
+ },
571
+ LanguageDefinition {
572
+ name: "python",
573
+ aliases: &["py"],
574
+ grammar_id: GrammarId::Python,
575
+ function_node_types: COMMON_FUNCTION_NODES,
576
+ decision_node_types: COMMON_DECISION_NODES,
577
+ nesting_node_types: COMMON_NESTING_NODES,
578
+ ncss_node_types: PYTHON_NCSS_NODES,
579
+ ncss_container_node_types: &[],
580
+ },
581
+ LanguageDefinition {
582
+ name: "go",
583
+ aliases: &[],
584
+ grammar_id: GrammarId::Go,
585
+ function_node_types: COMMON_FUNCTION_NODES,
586
+ decision_node_types: GO_DECISION_NODES,
587
+ nesting_node_types: GO_NESTING_NODES,
588
+ ncss_node_types: GO_NCSS_NODES,
589
+ ncss_container_node_types: &[],
590
+ },
591
+ LanguageDefinition {
592
+ name: "rust",
593
+ aliases: &["rs"],
594
+ grammar_id: GrammarId::Rust,
595
+ function_node_types: COMMON_FUNCTION_NODES,
596
+ decision_node_types: COMMON_DECISION_NODES,
597
+ nesting_node_types: COMMON_NESTING_NODES,
598
+ ncss_node_types: RUST_NCSS_NODES,
599
+ ncss_container_node_types: RUST_NCSS_CONTAINERS,
600
+ },
601
+ LanguageDefinition {
602
+ name: "java",
603
+ aliases: &[],
604
+ grammar_id: GrammarId::Java,
605
+ function_node_types: JAVA_FUNCTION_NODES,
606
+ decision_node_types: JAVA_DECISION_NODES,
607
+ nesting_node_types: JAVA_DECISION_NODES,
608
+ ncss_node_types: JAVA_NCSS_NODES,
609
+ ncss_container_node_types: &[],
610
+ },
611
+ LanguageDefinition {
612
+ name: "ruby",
613
+ aliases: &["rb"],
614
+ grammar_id: GrammarId::Ruby,
615
+ function_node_types: RUBY_FUNCTION_NODES,
616
+ decision_node_types: RUBY_DECISION_NODES,
617
+ nesting_node_types: RUBY_DECISION_NODES,
618
+ ncss_node_types: RUBY_NCSS_NODES,
619
+ ncss_container_node_types: RUBY_NCSS_CONTAINERS,
620
+ },
621
+ LanguageDefinition {
622
+ name: "c",
623
+ aliases: &[],
624
+ grammar_id: GrammarId::C,
625
+ function_node_types: C_FUNCTION_NODES,
626
+ decision_node_types: C_DECISION_NODES,
627
+ nesting_node_types: C_DECISION_NODES,
628
+ ncss_node_types: C_NCSS_NODES,
629
+ ncss_container_node_types: &[],
630
+ },
631
+ LanguageDefinition {
632
+ name: "cpp",
633
+ aliases: &["c++", "cxx"],
634
+ grammar_id: GrammarId::Cpp,
635
+ function_node_types: C_FUNCTION_NODES,
636
+ decision_node_types: CPP_DECISION_NODES,
637
+ nesting_node_types: CPP_DECISION_NODES,
638
+ ncss_node_types: CPP_NCSS_NODES,
639
+ ncss_container_node_types: &[],
640
+ },
641
+ ];
642
+
643
+ pub fn find_language(name: &str) -> Option<&'static LanguageDefinition> {
644
+ LANGUAGES
645
+ .iter()
646
+ .find(|language| language.name == name || language.aliases.contains(&name))
647
+ }