Skip to main content

normalize_languages/
jinja2.rs

1//! Jinja2 template support.
2
3use crate::{Language, LanguageSymbols};
4
5/// Jinja2 language support.
6pub struct Jinja2;
7
8impl Language for Jinja2 {
9    fn name(&self) -> &'static str {
10        "Jinja2"
11    }
12    fn extensions(&self) -> &'static [&'static str] {
13        &["j2", "jinja", "jinja2"]
14    }
15    fn grammar_name(&self) -> &'static str {
16        "jinja2"
17    }
18
19    fn as_symbols(&self) -> Option<&dyn LanguageSymbols> {
20        Some(self)
21    }
22}
23
24impl LanguageSymbols for Jinja2 {}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use crate::validate_unused_kinds_audit;
30
31    #[test]
32    fn unused_node_kinds_audit() {
33        #[rustfmt::skip]
34        let documented_unused: &[&str] = &[
35            // Statements — macro_statement covered by tags.scm; for/if/call/elif covered by
36            // complexity.scm (audit doesn't check complexity.scm so they stay here)
37            "autoescape_statement", "block_statement", "call_statement", "debug_statement",
38            "do_statement", "expression_statement", "extends_statement",
39            "filter_block_statement", "for_statement", "from_statement", "if_statement",
40            "import_statement", "include_statement", "raw_statement",
41            "set_block_statement", "set_statement", "trans_statement", "with_statement",
42            // Expressions — future: calls.scm will cover call_expression
43            "add_expression", "and_expression", "attribute_expression", "call_expression",
44            "comparison_expression", "concat_expression", "dict_expression",
45            "filter_expression", "list_expression", "mul_expression", "not_expression",
46            "or_expression", "parenthesized_expression", "power_expression",
47            "subscript_expression", "ternary_expression", "test_expression",
48            "unary_expression",
49            // Clauses / auxiliary — elif_clause covered by complexity.scm
50            "elif_clause", "else_clause", "for_else", "identifier", "identifier_tuple",
51            "import_item", "import_list", "pluralize_clause", "with_assignment",
52            "with_assignments",
53        ];
54        validate_unused_kinds_audit(&Jinja2, documented_unused)
55            .expect("Jinja2 unused node kinds audit failed");
56    }
57}