svlint/opt/rustwide/workdir/src/syntaxrules/
re_required_generateblock.rs1use 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}