@@ -9,7 +9,10 @@ use crate::SnippetCap;
99use base_db:: { AnchoredPathBuf , FileId } ;
1010use nohash_hasher:: IntMap ;
1111use 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+ } ;
1316use text_edit:: { TextEdit , TextEditBuilder } ;
1417
1518#[ derive( Default , Debug , Clone ) ]
@@ -237,19 +240,31 @@ impl SourceChangeBuilder {
237240 /// Adds a tabstop snippet to place the cursor before `node`
238241 pub fn add_tabstop_before ( & mut self , _cap : SnippetCap , node : impl AstNode ) {
239242 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 ( ) ) ) ;
241244 }
242245
243246 /// Adds a tabstop snippet to place the cursor after `node`
244247 pub fn add_tabstop_after ( & mut self , _cap : SnippetCap , node : impl AstNode ) {
245248 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 ( ) ) ) ;
247262 }
248263
249264 /// Adds a snippet to move the cursor selected over `node`
250265 pub fn add_placeholder_snippet ( & mut self , _cap : SnippetCap , node : impl AstNode ) {
251266 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 ( ) ) )
253268 }
254269
255270 fn add_snippet ( & mut self , snippet : PlaceSnippet ) {
@@ -282,46 +297,48 @@ impl From<FileSystemEdit> for SourceChange {
282297}
283298
284299enum 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 ) ,
291306}
292307
293308impl 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
295310 fn place ( self , order : usize ) {
296- // ensure the target node is still attached
311+ // ensure the target element is still attached
297312 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
300317 // 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( ) ) {
302319 return ;
303320 }
304321 }
305322 }
306323
307324 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) ) ;
310327 }
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) ) ;
313330 }
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 ( ) ;
317334
318335 let snippet = ast:: SourceFile :: parse ( & format ! ( "${{{order}:_}}" ) )
319336 . syntax_node ( )
320337 . clone_for_update ( ) ;
321338
322339 let placeholder =
323340 snippet. descendants ( ) . find_map ( ast:: UnderscoreExpr :: cast) . unwrap ( ) ;
324- ted:: replace ( placeholder. syntax ( ) , node ) ;
341+ ted:: replace ( placeholder. syntax ( ) , element ) ;
325342
326343 ted:: insert_raw ( position, snippet) ;
327344 }
0 commit comments