Skip to content

Commit 4a335de

Browse files
authored
fix(definitions): parse modifier without params (#22)
1 parent c905b4c commit 4a335de

File tree

3 files changed

+44
-5
lines changed

3 files changed

+44
-5
lines changed

src/definitions/mod.rs

+18
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,24 @@ mod tests {
535535
);
536536
}
537537

538+
#[test]
539+
fn test_parse_modifier_no_param() {
540+
let cursor = parse_file(include_str!("../../test-data/ParserTest.sol"));
541+
let items = find_items(cursor);
542+
let item = find_modifier(
543+
"modifierWithoutParam",
544+
Some(Parent::Contract("ParserTest".to_string())),
545+
&items,
546+
);
547+
assert_eq!(
548+
item.natspec.as_ref().unwrap().items,
549+
vec![NatSpecItem {
550+
kind: NatSpecKind::Notice,
551+
comment: "The description of the modifier".to_string()
552+
},]
553+
);
554+
}
555+
538556
#[test]
539557
fn test_parse_private_function() {
540558
let cursor = parse_file(include_str!("../../test-data/ParserTest.sol"));

src/definitions/modifier.rs

+21-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use slang_solidity::cst::{NonterminalKind, Query, QueryMatch, TextRange};
22

33
use crate::{
4-
error::Result,
4+
error::{Error, Result},
55
lint::{Diagnostic, ItemDiagnostics, ItemType},
66
natspec::{NatSpec, NatSpecKind},
77
};
@@ -40,7 +40,8 @@ impl Validate for ModifierDefinition {
4040
@modifier_name name:[Identifier]
4141
parameters:[ParametersDeclaration
4242
@modifier_params parameters:[Parameters]
43-
]
43+
]?
44+
@modifier_attr attributes:[ModifierAttributes]
4445
]",
4546
)
4647
.expect("query should compile")
@@ -49,11 +50,26 @@ impl Validate for ModifierDefinition {
4950
fn extract(m: QueryMatch) -> Result<Definition> {
5051
let modifier = capture!(m, "modifier");
5152
let name = capture!(m, "modifier_name");
52-
let params = capture!(m, "modifier_params");
53+
let params = match m
54+
.capture("modifier_params")
55+
.map(|(_, mut captures)| captures.next())
56+
{
57+
Some(Some(ret)) => Some(ret),
58+
Some(None) => None,
59+
_ => return Err(Error::UnknownError),
60+
};
61+
let attr = capture!(m, "modifier_attr");
5362

54-
let span = name.text_range().start..params.text_range().end;
63+
let span = if let Some(params) = &params {
64+
name.text_range().start..params.text_range().end
65+
} else {
66+
name.text_range().start..attr.text_range().end
67+
};
5568
let name = name.node().unparse().trim().to_string();
56-
let params = extract_params(params, NonterminalKind::Parameter);
69+
let params = params
70+
.map(|p| extract_params(p, NonterminalKind::Parameter))
71+
.unwrap_or_default();
72+
5773
let natspec = extract_comment(modifier.clone(), &[])?;
5874
let parent = extract_parent_name(modifier);
5975

test-data/ParserTest.sol

+5
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ contract ParserTest is IParserTest {
6868
_;
6969
}
7070

71+
/// @notice The description of the modifier
72+
modifier modifierWithoutParam {
73+
_;
74+
}
75+
7176
// TODO: Fallback and receive functions
7277
// fallback() {}
7378
// receive () {}

0 commit comments

Comments
 (0)