Unnamed repository; edit this file 'description' to name the repository.
lets use syntaxFactory in migration as well
bit-aloo 6 weeks ago
parent 4a7e119 · commit 0e79e2b
-rw-r--r--crates/ide-db/src/imports/insert_use.rs6
-rw-r--r--crates/syntax/src/syntax_editor.rs48
2 files changed, 38 insertions, 16 deletions
diff --git a/crates/ide-db/src/imports/insert_use.rs b/crates/ide-db/src/imports/insert_use.rs
index 133d9a9305..41ce1e5960 100644
--- a/crates/ide-db/src/imports/insert_use.rs
+++ b/crates/ide-db/src/imports/insert_use.rs
@@ -709,7 +709,11 @@ fn insert_use_with_editor_(
Some(b) => {
cov_mark::hit!(insert_empty_module);
syntax_editor.insert(Position::after(&b), syntax_factory.whitespace("\n"));
- syntax_editor.insert_with_whitespace(Position::after(&b), use_item.syntax());
+ syntax_editor.insert_with_whitespace(
+ Position::after(&b),
+ use_item.syntax(),
+ syntax_factory,
+ );
}
None => {
cov_mark::hit!(insert_empty_file);
diff --git a/crates/syntax/src/syntax_editor.rs b/crates/syntax/src/syntax_editor.rs
index d68957c501..8e4dc75d22 100644
--- a/crates/syntax/src/syntax_editor.rs
+++ b/crates/syntax/src/syntax_editor.rs
@@ -16,7 +16,7 @@ use rustc_hash::FxHashMap;
use crate::{
AstNode, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, T,
- ast::{self, edit::IndentLevel, make},
+ ast::{self, edit::IndentLevel, syntax_factory::SyntaxFactory},
};
mod edit_algo;
@@ -104,22 +104,28 @@ impl SyntaxEditor {
self.changes.push(Change::InsertAll(position, elements))
}
- pub fn insert_with_whitespace(&mut self, position: Position, element: impl Element) {
- self.insert_all_with_whitespace(position, vec![element.syntax_element()])
+ pub fn insert_with_whitespace(
+ &mut self,
+ position: Position,
+ element: impl Element,
+ factory: &SyntaxFactory,
+ ) {
+ self.insert_all_with_whitespace(position, vec![element.syntax_element()], factory)
}
pub fn insert_all_with_whitespace(
&mut self,
position: Position,
mut elements: Vec<SyntaxElement>,
+ factory: &SyntaxFactory,
) {
if let Some(first) = elements.first()
- && let Some(ws) = ws_before(&position, first)
+ && let Some(ws) = ws_before(&position, first, factory)
{
elements.insert(0, ws.into());
}
if let Some(last) = elements.last()
- && let Some(ws) = ws_after(&position, last)
+ && let Some(ws) = ws_after(&position, last, factory)
{
elements.push(ws.into());
}
@@ -437,7 +443,11 @@ impl Element for SyntaxToken {
}
}
-fn ws_before(position: &Position, new: &SyntaxElement) -> Option<SyntaxToken> {
+fn ws_before(
+ position: &Position,
+ new: &SyntaxElement,
+ factory: &SyntaxFactory,
+) -> Option<SyntaxToken> {
let prev = match &position.repr {
PositionRepr::FirstChild(_) => return None,
PositionRepr::After(it) => it,
@@ -449,7 +459,7 @@ fn ws_before(position: &Position, new: &SyntaxElement) -> Option<SyntaxToken> {
{
let mut indent = IndentLevel::from_element(&item_list.syntax().clone().into());
indent.0 += 1;
- return Some(make::tokens::whitespace(&format!("\n{indent}")));
+ return Some(factory.whitespace(&format!("\n{indent}")));
}
if prev.kind() == T!['{']
@@ -458,21 +468,29 @@ fn ws_before(position: &Position, new: &SyntaxElement) -> Option<SyntaxToken> {
{
let mut indent = IndentLevel::from_element(&stmt_list.syntax().clone().into());
indent.0 += 1;
- return Some(make::tokens::whitespace(&format!("\n{indent}")));
+ return Some(factory.whitespace(&format!("\n{indent}")));
}
- ws_between(prev, new)
+ ws_between(prev, new, factory)
}
-fn ws_after(position: &Position, new: &SyntaxElement) -> Option<SyntaxToken> {
+fn ws_after(
+ position: &Position,
+ new: &SyntaxElement,
+ factory: &SyntaxFactory,
+) -> Option<SyntaxToken> {
let next = match &position.repr {
PositionRepr::FirstChild(parent) => parent.first_child_or_token()?,
PositionRepr::After(sibling) => sibling.next_sibling_or_token()?,
};
- ws_between(new, &next)
+ ws_between(new, &next, factory)
}
-fn ws_between(left: &SyntaxElement, right: &SyntaxElement) -> Option<SyntaxToken> {
+fn ws_between(
+ left: &SyntaxElement,
+ right: &SyntaxElement,
+ factory: &SyntaxFactory,
+) -> Option<SyntaxToken> {
if left.kind() == SyntaxKind::WHITESPACE || right.kind() == SyntaxKind::WHITESPACE {
return None;
}
@@ -493,16 +511,16 @@ fn ws_between(left: &SyntaxElement, right: &SyntaxElement) -> Option<SyntaxToken
if left.kind() == SyntaxKind::USE {
indent.0 = IndentLevel::from_element(right).0.max(indent.0);
}
- return Some(make::tokens::whitespace(&format!("\n{indent}")));
+ return Some(factory.whitespace(&format!("\n{indent}")));
}
if left.kind() == SyntaxKind::ATTR {
let mut indent = IndentLevel::from_element(right);
if right.kind() == SyntaxKind::ATTR {
indent.0 = IndentLevel::from_element(left).0.max(indent.0);
}
- return Some(make::tokens::whitespace(&format!("\n{indent}")));
+ return Some(factory.whitespace(&format!("\n{indent}")));
}
- Some(make::tokens::single_space())
+ Some(factory.whitespace(" "))
}
fn is_ancestor_or_self(node: &SyntaxNode, ancestor: &SyntaxNode) -> bool {