Skip to content

Commit 0e79e2b

Browse files
committed
lets use syntaxFactory in migration as well
1 parent 4a7e119 commit 0e79e2b

2 files changed

Lines changed: 38 additions & 16 deletions

File tree

crates/ide-db/src/imports/insert_use.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,11 @@ fn insert_use_with_editor_(
709709
Some(b) => {
710710
cov_mark::hit!(insert_empty_module);
711711
syntax_editor.insert(Position::after(&b), syntax_factory.whitespace("\n"));
712-
syntax_editor.insert_with_whitespace(Position::after(&b), use_item.syntax());
712+
syntax_editor.insert_with_whitespace(
713+
Position::after(&b),
714+
use_item.syntax(),
715+
syntax_factory,
716+
);
713717
}
714718
None => {
715719
cov_mark::hit!(insert_empty_file);

crates/syntax/src/syntax_editor.rs

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use rustc_hash::FxHashMap;
1616

1717
use crate::{
1818
AstNode, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T,
19-
ast::{self, edit::IndentLevel, make},
19+
ast::{self, edit::IndentLevel, syntax_factory::SyntaxFactory},
2020
};
2121

2222
mod edit_algo;
@@ -104,22 +104,28 @@ impl SyntaxEditor {
104104
self.changes.push(Change::InsertAll(position, elements))
105105
}
106106

107-
pub fn insert_with_whitespace(&mut self, position: Position, element: impl Element) {
108-
self.insert_all_with_whitespace(position, vec![element.syntax_element()])
107+
pub fn insert_with_whitespace(
108+
&mut self,
109+
position: Position,
110+
element: impl Element,
111+
factory: &SyntaxFactory,
112+
) {
113+
self.insert_all_with_whitespace(position, vec![element.syntax_element()], factory)
109114
}
110115

111116
pub fn insert_all_with_whitespace(
112117
&mut self,
113118
position: Position,
114119
mut elements: Vec<SyntaxElement>,
120+
factory: &SyntaxFactory,
115121
) {
116122
if let Some(first) = elements.first()
117-
&& let Some(ws) = ws_before(&position, first)
123+
&& let Some(ws) = ws_before(&position, first, factory)
118124
{
119125
elements.insert(0, ws.into());
120126
}
121127
if let Some(last) = elements.last()
122-
&& let Some(ws) = ws_after(&position, last)
128+
&& let Some(ws) = ws_after(&position, last, factory)
123129
{
124130
elements.push(ws.into());
125131
}
@@ -437,7 +443,11 @@ impl Element for SyntaxToken {
437443
}
438444
}
439445

440-
fn ws_before(position: &Position, new: &SyntaxElement) -> Option<SyntaxToken> {
446+
fn ws_before(
447+
position: &Position,
448+
new: &SyntaxElement,
449+
factory: &SyntaxFactory,
450+
) -> Option<SyntaxToken> {
441451
let prev = match &position.repr {
442452
PositionRepr::FirstChild(_) => return None,
443453
PositionRepr::After(it) => it,
@@ -449,7 +459,7 @@ fn ws_before(position: &Position, new: &SyntaxElement) -> Option<SyntaxToken> {
449459
{
450460
let mut indent = IndentLevel::from_element(&item_list.syntax().clone().into());
451461
indent.0 += 1;
452-
return Some(make::tokens::whitespace(&format!("\n{indent}")));
462+
return Some(factory.whitespace(&format!("\n{indent}")));
453463
}
454464

455465
if prev.kind() == T!['{']
@@ -458,21 +468,29 @@ fn ws_before(position: &Position, new: &SyntaxElement) -> Option<SyntaxToken> {
458468
{
459469
let mut indent = IndentLevel::from_element(&stmt_list.syntax().clone().into());
460470
indent.0 += 1;
461-
return Some(make::tokens::whitespace(&format!("\n{indent}")));
471+
return Some(factory.whitespace(&format!("\n{indent}")));
462472
}
463473

464-
ws_between(prev, new)
474+
ws_between(prev, new, factory)
465475
}
466476

467-
fn ws_after(position: &Position, new: &SyntaxElement) -> Option<SyntaxToken> {
477+
fn ws_after(
478+
position: &Position,
479+
new: &SyntaxElement,
480+
factory: &SyntaxFactory,
481+
) -> Option<SyntaxToken> {
468482
let next = match &position.repr {
469483
PositionRepr::FirstChild(parent) => parent.first_child_or_token()?,
470484
PositionRepr::After(sibling) => sibling.next_sibling_or_token()?,
471485
};
472-
ws_between(new, &next)
486+
ws_between(new, &next, factory)
473487
}
474488

475-
fn ws_between(left: &SyntaxElement, right: &SyntaxElement) -> Option<SyntaxToken> {
489+
fn ws_between(
490+
left: &SyntaxElement,
491+
right: &SyntaxElement,
492+
factory: &SyntaxFactory,
493+
) -> Option<SyntaxToken> {
476494
if left.kind() == SyntaxKind::WHITESPACE || right.kind() == SyntaxKind::WHITESPACE {
477495
return None;
478496
}
@@ -493,16 +511,16 @@ fn ws_between(left: &SyntaxElement, right: &SyntaxElement) -> Option<SyntaxToken
493511
if left.kind() == SyntaxKind::USE {
494512
indent.0 = IndentLevel::from_element(right).0.max(indent.0);
495513
}
496-
return Some(make::tokens::whitespace(&format!("\n{indent}")));
514+
return Some(factory.whitespace(&format!("\n{indent}")));
497515
}
498516
if left.kind() == SyntaxKind::ATTR {
499517
let mut indent = IndentLevel::from_element(right);
500518
if right.kind() == SyntaxKind::ATTR {
501519
indent.0 = IndentLevel::from_element(left).0.max(indent.0);
502520
}
503-
return Some(make::tokens::whitespace(&format!("\n{indent}")));
521+
return Some(factory.whitespace(&format!("\n{indent}")));
504522
}
505-
Some(make::tokens::single_space())
523+
Some(factory.whitespace(" "))
506524
}
507525

508526
fn is_ancestor_or_self(node: &SyntaxNode, ancestor: &SyntaxNode) -> bool {

0 commit comments

Comments
 (0)