svlint/opt/rustwide/workdir/src/syntaxrules/
re_required_genvar.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 ReRequiredGenvar {
8 re: Option<Regex>,
9 under_genvar_declaration: bool,
10 under_genvar_initialization: bool,
11}
12
13impl SyntaxRule for ReRequiredGenvar {
14 fn check(
15 &mut self,
16 syntax_tree: &SyntaxTree,
17 event: &NodeEvent,
18 option: &ConfigOption,
19 ) -> SyntaxRuleResult {
20 if self.re.is_none() {
21 self.re = Some(Regex::new(&option.re_required_genvar).unwrap());
22 }
23
24 let node = match event {
25 NodeEvent::Enter(x) => {
26 match x {
27 RefNode::GenvarDeclaration(_) => {
28 self.under_genvar_declaration = true;
29 }
30 RefNode::GenvarInitialization(_) => {
31 self.under_genvar_initialization = true;
32 }
33 _ => ()
34 }
35 x
36 }
37 NodeEvent::Leave(x) => {
38 match x {
39 RefNode::GenvarDeclaration(_) => {
40 self.under_genvar_declaration = false;
41 }
42 RefNode::GenvarInitialization(_) => {
43 self.under_genvar_initialization = false;
44 }
45 _ => ()
46 }
47 return SyntaxRuleResult::Pass;
48 }
49 };
50
51 let c: bool = self.under_genvar_declaration ||
52 self.under_genvar_initialization;
53
54 match (c, node) {
55 (true, RefNode::GenvarIdentifier(x)) => {
56 check_regex(true, unwrap_node!(*x, Identifier),
57 &syntax_tree, &self.re.as_ref().unwrap())
58 }
59 _ => SyntaxRuleResult::Pass
60 }
61 }
62
63 fn name(&self) -> String {
64 String::from("re_required_genvar")
65 }
66
67 fn hint(&self, option: &ConfigOption) -> String {
68 String::from(format!(
69 "Use a genvar identifier matching regex `{}`.",
70 &option.re_required_genvar
71 ))
72 }
73
74 fn reason(&self) -> String {
75 String::from("Identifiers must conform to the naming scheme.")
76 }
77}