@@ -9,7 +9,10 @@ use crate::SnippetCap;
9
9
use base_db:: { AnchoredPathBuf , FileId } ;
10
10
use nohash_hasher:: IntMap ;
11
11
use stdx:: never;
12
- use syntax:: { algo, ast, ted, AstNode , SyntaxNode , SyntaxNodePtr , TextRange , TextSize } ;
12
+ use syntax:: {
13
+ algo, ast, ted, AstNode , SyntaxElement , SyntaxNode , SyntaxNodePtr , SyntaxToken , TextRange ,
14
+ TextSize ,
15
+ } ;
13
16
use text_edit:: { TextEdit , TextEditBuilder } ;
14
17
15
18
#[ derive( Default , Debug , Clone ) ]
@@ -237,19 +240,31 @@ impl SourceChangeBuilder {
237
240
/// Adds a tabstop snippet to place the cursor before `node`
238
241
pub fn add_tabstop_before ( & mut self , _cap : SnippetCap , node : impl AstNode ) {
239
242
assert ! ( node. syntax( ) . parent( ) . is_some( ) ) ;
240
- self . add_snippet ( PlaceSnippet :: Before ( node. syntax ( ) . clone ( ) ) ) ;
243
+ self . add_snippet ( PlaceSnippet :: Before ( node. syntax ( ) . clone ( ) . into ( ) ) ) ;
241
244
}
242
245
243
246
/// Adds a tabstop snippet to place the cursor after `node`
244
247
pub fn add_tabstop_after ( & mut self , _cap : SnippetCap , node : impl AstNode ) {
245
248
assert ! ( node. syntax( ) . parent( ) . is_some( ) ) ;
246
- self . add_snippet ( PlaceSnippet :: After ( node. syntax ( ) . clone ( ) ) ) ;
249
+ self . add_snippet ( PlaceSnippet :: After ( node. syntax ( ) . clone ( ) . into ( ) ) ) ;
250
+ }
251
+
252
+ /// Adds a tabstop snippet to place the cursor before `token`
253
+ pub fn add_tabstop_before_token ( & mut self , _cap : SnippetCap , token : SyntaxToken ) {
254
+ assert ! ( token. parent( ) . is_some( ) ) ;
255
+ self . add_snippet ( PlaceSnippet :: Before ( token. clone ( ) . into ( ) ) ) ;
256
+ }
257
+
258
+ /// Adds a tabstop snippet to place the cursor after `token`
259
+ pub fn add_tabstop_after_token ( & mut self , _cap : SnippetCap , token : SyntaxToken ) {
260
+ assert ! ( token. parent( ) . is_some( ) ) ;
261
+ self . add_snippet ( PlaceSnippet :: After ( token. clone ( ) . into ( ) ) ) ;
247
262
}
248
263
249
264
/// Adds a snippet to move the cursor selected over `node`
250
265
pub fn add_placeholder_snippet ( & mut self , _cap : SnippetCap , node : impl AstNode ) {
251
266
assert ! ( node. syntax( ) . parent( ) . is_some( ) ) ;
252
- self . add_snippet ( PlaceSnippet :: Over ( node. syntax ( ) . clone ( ) ) )
267
+ self . add_snippet ( PlaceSnippet :: Over ( node. syntax ( ) . clone ( ) . into ( ) ) )
253
268
}
254
269
255
270
fn add_snippet ( & mut self , snippet : PlaceSnippet ) {
@@ -282,46 +297,48 @@ impl From<FileSystemEdit> for SourceChange {
282
297
}
283
298
284
299
enum PlaceSnippet {
285
- /// Place a tabstop before a node
286
- Before ( SyntaxNode ) ,
287
- /// Place a tabstop before a node
288
- After ( SyntaxNode ) ,
289
- /// Place a placeholder snippet in place of the node
290
- Over ( SyntaxNode ) ,
300
+ /// Place a tabstop before an element
301
+ Before ( SyntaxElement ) ,
302
+ /// Place a tabstop before an element
303
+ After ( SyntaxElement ) ,
304
+ /// Place a placeholder snippet in place of the element
305
+ Over ( SyntaxElement ) ,
291
306
}
292
307
293
308
impl PlaceSnippet {
294
- /// Places the snippet before or over a node with the given tab stop index
309
+ /// Places the snippet before or over an element with the given tab stop index
295
310
fn place ( self , order : usize ) {
296
- // ensure the target node is still attached
311
+ // ensure the target element is still attached
297
312
match & self {
298
- PlaceSnippet :: Before ( node) | PlaceSnippet :: After ( node) | PlaceSnippet :: Over ( node) => {
299
- // node should still be in the tree, but if it isn't
313
+ PlaceSnippet :: Before ( element)
314
+ | PlaceSnippet :: After ( element)
315
+ | PlaceSnippet :: Over ( element) => {
316
+ // element should still be in the tree, but if it isn't
300
317
// then it's okay to just ignore this place
301
- if stdx:: never!( node . parent( ) . is_none( ) ) {
318
+ if stdx:: never!( element . parent( ) . is_none( ) ) {
302
319
return ;
303
320
}
304
321
}
305
322
}
306
323
307
324
match self {
308
- PlaceSnippet :: Before ( node ) => {
309
- ted:: insert_raw ( ted:: Position :: before ( & node ) , Self :: make_tab_stop ( order) ) ;
325
+ PlaceSnippet :: Before ( element ) => {
326
+ ted:: insert_raw ( ted:: Position :: before ( & element ) , Self :: make_tab_stop ( order) ) ;
310
327
}
311
- PlaceSnippet :: After ( node ) => {
312
- ted:: insert_raw ( ted:: Position :: after ( & node ) , Self :: make_tab_stop ( order) ) ;
328
+ PlaceSnippet :: After ( element ) => {
329
+ ted:: insert_raw ( ted:: Position :: after ( & element ) , Self :: make_tab_stop ( order) ) ;
313
330
}
314
- PlaceSnippet :: Over ( node ) => {
315
- let position = ted:: Position :: before ( & node ) ;
316
- node . detach ( ) ;
331
+ PlaceSnippet :: Over ( element ) => {
332
+ let position = ted:: Position :: before ( & element ) ;
333
+ element . detach ( ) ;
317
334
318
335
let snippet = ast:: SourceFile :: parse ( & format ! ( "${{{order}:_}}" ) )
319
336
. syntax_node ( )
320
337
. clone_for_update ( ) ;
321
338
322
339
let placeholder =
323
340
snippet. descendants ( ) . find_map ( ast:: UnderscoreExpr :: cast) . unwrap ( ) ;
324
- ted:: replace ( placeholder. syntax ( ) , node ) ;
341
+ ted:: replace ( placeholder. syntax ( ) , element ) ;
325
342
326
343
ted:: insert_raw ( position, snippet) ;
327
344
}
0 commit comments