1
1
use ide_db:: assists:: AssistId ;
2
2
use syntax:: {
3
- AstNode , T ,
3
+ AstNode , SyntaxToken , T ,
4
4
ast:: { self , syntax_factory:: SyntaxFactory } ,
5
5
} ;
6
6
@@ -39,7 +39,7 @@ pub(crate) fn toggle_macro_delimiter(acc: &mut Assists, ctx: &AssistContext<'_>)
39
39
let makro = ctx. find_node_at_offset :: < ast:: MacroCall > ( ) ?;
40
40
41
41
let cursor_offset = ctx. offset ( ) ;
42
- let semicolon = makro . semicolon_token ( ) ;
42
+ let semicolon = macro_semicolon ( & makro ) ;
43
43
let token_tree = makro. token_tree ( ) ?;
44
44
45
45
let ltoken = token_tree. left_delimiter_token ( ) ?;
@@ -95,6 +95,14 @@ pub(crate) fn toggle_macro_delimiter(acc: &mut Assists, ctx: &AssistContext<'_>)
95
95
)
96
96
}
97
97
98
+ fn macro_semicolon ( makro : & ast:: MacroCall ) -> Option < SyntaxToken > {
99
+ makro. semicolon_token ( ) . or_else ( || {
100
+ let macro_expr = ast:: MacroExpr :: cast ( makro. syntax ( ) . parent ( ) ?) ?;
101
+ let expr_stmt = ast:: ExprStmt :: cast ( macro_expr. syntax ( ) . parent ( ) ?) ?;
102
+ expr_stmt. semicolon_token ( )
103
+ } )
104
+ }
105
+
98
106
#[ cfg( test) ]
99
107
mod tests {
100
108
use crate :: tests:: { check_assist, check_assist_not_applicable} ;
@@ -119,7 +127,29 @@ macro_rules! sth {
119
127
120
128
sth!{ }
121
129
"# ,
122
- )
130
+ ) ;
131
+
132
+ check_assist (
133
+ toggle_macro_delimiter,
134
+ r#"
135
+ macro_rules! sth {
136
+ () => {};
137
+ }
138
+
139
+ fn foo() {
140
+ sth!$0( );
141
+ }
142
+ "# ,
143
+ r#"
144
+ macro_rules! sth {
145
+ () => {};
146
+ }
147
+
148
+ fn foo() {
149
+ sth!{ }
150
+ }
151
+ "# ,
152
+ ) ;
123
153
}
124
154
125
155
#[ test]
0 commit comments