1
1
use slang_solidity:: cst:: { NonterminalKind , Query , QueryMatch , TextRange } ;
2
2
3
3
use crate :: {
4
- error:: Result ,
4
+ error:: { Error , Result } ,
5
5
lint:: { Diagnostic , ItemDiagnostics , ItemType } ,
6
6
natspec:: { NatSpec , NatSpecKind } ,
7
7
} ;
@@ -40,7 +40,8 @@ impl Validate for ModifierDefinition {
40
40
@modifier_name name:[Identifier]
41
41
parameters:[ParametersDeclaration
42
42
@modifier_params parameters:[Parameters]
43
- ]
43
+ ]?
44
+ @modifier_attr attributes:[ModifierAttributes]
44
45
]" ,
45
46
)
46
47
. expect ( "query should compile" )
@@ -49,11 +50,26 @@ impl Validate for ModifierDefinition {
49
50
fn extract ( m : QueryMatch ) -> Result < Definition > {
50
51
let modifier = capture ! ( m, "modifier" ) ;
51
52
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" ) ;
53
62
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
+ } ;
55
68
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
+
57
73
let natspec = extract_comment ( modifier. clone ( ) , & [ ] ) ?;
58
74
let parent = extract_parent_name ( modifier) ;
59
75
0 commit comments