svlint/opt/rustwide/workdir/src/syntaxrules/
re_required_generateblock.rs

1use crate::config::ConfigOption;
2use crate::linter::{check_regex, SyntaxRule, SyntaxRuleResult};
3use regex::Regex;
4use sv_parser::{unwrap_node, NodeEvent, RefNode, SyntaxTree};
5
6#[derive(Default)]
7pub struct ReRequiredGenerateblock {
8    re: Option<Regex>,
9    under_generate_block: bool,
10}
11
12impl SyntaxRule for ReRequiredGenerateblock {
13    fn check(
14        &mut self,
15        syntax_tree: &SyntaxTree,
16        event: &NodeEvent,
17        option: &ConfigOption,
18    ) -> SyntaxRuleResult {
19        if self.re.is_none() {
20            self.re = Some(Regex::new(&option.re_required_generateblock).unwrap());
21        }
22
23        let node = match event {
24            NodeEvent::Enter(x) => {
25                match x {
26                    RefNode::GenerateBlock(_) => {
27                        self.under_generate_block = true;
28                    }
29                    _ => ()
30                }
31                x
32            }
33            NodeEvent::Leave(x) => {
34                match x {
35                    RefNode::GenerateBlock(_) => {
36                        self.under_generate_block = false;
37                    }
38                    _ => ()
39                }
40                return SyntaxRuleResult::Pass;
41            }
42        };
43
44        match (self.under_generate_block, node) {
45            (true, RefNode::GenerateBlockIdentifier(x)) => {
46                check_regex(true, unwrap_node!(*x, Identifier),
47                            &syntax_tree, &self.re.as_ref().unwrap())
48            }
49            _ => SyntaxRuleResult::Pass
50        }
51    }
52
53    fn name(&self) -> String {
54        String::from("re_required_generateblock")
55    }
56
57    fn hint(&self, option: &ConfigOption) -> String {
58        String::from(format!(
59            "Use a generate block identifier matching regex `{}`.",
60            &option.re_required_generateblock
61        ))
62    }
63
64    fn reason(&self) -> String {
65        String::from("Identifiers must conform to the naming scheme.")
66    }
67}