1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
use crate::linter::{Rule, RuleResult}; use sv_parser::{NodeEvent, RefNode, SyntaxTree}; #[derive(Default)] pub struct GenerateKeywordRequired { generate_region: Vec<()>, } impl Rule for GenerateKeywordRequired { fn check(&mut self, _syntax_tree: &SyntaxTree, event: &NodeEvent) -> RuleResult { match event { NodeEvent::Enter(RefNode::GenerateRegion(_)) => { self.generate_region.push(()); RuleResult::Pass } NodeEvent::Leave(RefNode::GenerateRegion(_)) => { self.generate_region.pop(); RuleResult::Pass } NodeEvent::Enter(RefNode::IfGenerateConstruct(_)) => { if self.generate_region.last().is_some() { RuleResult::Pass } else { RuleResult::Fail } } NodeEvent::Enter(RefNode::CaseGenerateConstruct(_)) => { if self.generate_region.last().is_some() { RuleResult::Pass } else { RuleResult::Fail } } NodeEvent::Enter(RefNode::LoopGenerateConstruct(_)) => { if self.generate_region.last().is_some() { RuleResult::Pass } else { RuleResult::Fail } } _ => RuleResult::Pass, } } fn name(&self) -> String { String::from("generate_keyword_required") } fn hint(&self) -> String { String::from("`generate`/`endgenerate` is required") } fn reason(&self) -> String { String::from("some tools don't support `generate`/`endgenerate` omitting") } }