Skip to content

Commit 26616c6

Browse files
authored
Merge pull request #310 from skjdbg/param_in_pack_fix
proposed fix for parameter in package false negative #309
2 parents 15d7ccb + ed254b2 commit 26616c6

3 files changed

Lines changed: 33 additions & 20 deletions

File tree

MANUAL.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5109,13 +5109,21 @@ Replace `parameter` keyword with `localparam`.
51095109

51105110
In a package, `localparam` properly describes the non-overridable semantics.
51115111

5112-
### Pass Example (1 of 1)
5112+
### Pass Example (1 of 2)
51135113
```systemverilog
51145114
package P;
51155115
localparam int A = 1;
51165116
endpackage
51175117
```
51185118

5119+
### Pass Example (2 of 2)
5120+
```systemverilog
5121+
package foo;
5122+
class bar #( parameter int baz );
5123+
endclass
5124+
endpackage
5125+
```
5126+
51195127
### Fail Example (1 of 1)
51205128
```systemverilog
51215129
package P;

src/syntaxrules/parameter_in_package.rs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use crate::config::ConfigOption;
22
use crate::linter::{SyntaxRule, SyntaxRuleResult};
3-
use sv_parser::{unwrap_locate, unwrap_node, NodeEvent, RefNode, SyntaxTree};
3+
use sv_parser::{unwrap_locate, NodeEvent, RefNode, SyntaxTree};
44

55
#[derive(Default)]
6-
pub struct ParameterInPackage;
6+
pub struct ParameterInPackage {
7+
inside_param_port_list : bool,
8+
}
79

810
impl SyntaxRule for ParameterInPackage {
911
fn check(
@@ -12,24 +14,22 @@ impl SyntaxRule for ParameterInPackage {
1214
event: &NodeEvent,
1315
_option: &ConfigOption,
1416
) -> SyntaxRuleResult {
15-
let node = match event {
16-
NodeEvent::Enter(x) => x,
17-
NodeEvent::Leave(_) => {
18-
return SyntaxRuleResult::Pass;
19-
}
20-
};
21-
match node {
22-
RefNode::PackageDeclaration(x) => {
23-
let param = unwrap_node!(*x, ParameterDeclaration);
24-
if let Some(param) = param {
25-
let param_locate = unwrap_locate!(param).unwrap();
26-
SyntaxRuleResult::FailLocate(*param_locate)
27-
} else {
28-
SyntaxRuleResult::Pass
17+
match event {
18+
NodeEvent::Enter(RefNode::ParameterPortList(_)) => {
19+
self.inside_param_port_list = true;
20+
},
21+
NodeEvent::Leave(RefNode::ParameterPortList(_)) => {
22+
self.inside_param_port_list = false;
23+
},
24+
NodeEvent::Enter(RefNode::ParameterDeclaration(&ref x)) => {
25+
if !self.inside_param_port_list {
26+
let param_locate = unwrap_locate!(x).unwrap();
27+
return SyntaxRuleResult::FailLocate(*param_locate)
2928
}
30-
}
31-
_ => SyntaxRuleResult::Pass,
32-
}
29+
},
30+
_ => {}
31+
};
32+
return SyntaxRuleResult::Pass
3333
}
3434

3535
fn name(&self) -> String {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
package P;
22
localparam int A = 1;
33
endpackage
4+
////////////////////////////////////////////////////////////////////////////////
5+
package foo;
6+
class bar #( parameter int baz );
7+
endclass
8+
endpackage

0 commit comments

Comments
 (0)