Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 4de7cbe

Browse files
committed
internal: add add_tabstop_{before,after}_token
1 parent db0add1 commit 4de7cbe

File tree

1 file changed

+40
-23
lines changed

1 file changed

+40
-23
lines changed

crates/ide-db/src/source_change.rs

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ use crate::SnippetCap;
99
use base_db::{AnchoredPathBuf, FileId};
1010
use nohash_hasher::IntMap;
1111
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+
};
1316
use 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

284299
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),
291306
}
292307

293308
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
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

Comments
 (0)