Skip to content

Commit 25c0a00

Browse files
committed
fix: Don't produce ChangedAncestor for SyntaxTokens
1 parent fbd6713 commit 25c0a00

File tree

2 files changed

+52
-10
lines changed

2 files changed

+52
-10
lines changed

src/tools/rust-analyzer/crates/syntax/src/syntax_editor.rs

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ mod tests {
327327

328328
use crate::{
329329
ast::{self, make, syntax_factory::SyntaxFactory},
330-
AstNode,
330+
AstNode, SyntaxKind,
331331
};
332332

333333
use super::*;
@@ -540,4 +540,50 @@ mod tests {
540540
}"#]];
541541
expect.assert_eq(&edit.new_root.to_string());
542542
}
543+
544+
#[test]
545+
fn test_replace_token_in_parent() {
546+
let parent_fn = make::fn_(
547+
None,
548+
make::name("it"),
549+
None,
550+
None,
551+
make::param_list(None, []),
552+
make::block_expr([], Some(make::expr_unit())),
553+
Some(make::ret_type(make::ty_unit())),
554+
false,
555+
false,
556+
false,
557+
false,
558+
);
559+
560+
let mut editor = SyntaxEditor::new(parent_fn.syntax().clone());
561+
562+
if let Some(ret_ty) = parent_fn.ret_type() {
563+
editor.delete(ret_ty.syntax().clone());
564+
565+
if let Some(SyntaxElement::Token(token)) = ret_ty.syntax().next_sibling_or_token() {
566+
if token.kind().is_trivia() {
567+
editor.delete(token);
568+
}
569+
}
570+
}
571+
572+
if let Some(tail) = parent_fn.body().unwrap().tail_expr() {
573+
// FIXME: We do this because `xtask tidy` will not allow us to have trailing whitespace in the expect string.
574+
if let Some(SyntaxElement::Token(token)) = tail.syntax().prev_sibling_or_token() {
575+
if let SyntaxKind::WHITESPACE = token.kind() {
576+
editor.delete(token);
577+
}
578+
}
579+
editor.delete(tail.syntax().clone());
580+
}
581+
582+
let edit = editor.finish();
583+
584+
let expect = expect![[r#"
585+
fn it() {
586+
}"#]];
587+
expect.assert_eq(&edit.new_root.to_string());
588+
}
543589
}

src/tools/rust-analyzer/crates/syntax/src/syntax_editor/edit_algo.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,14 @@ pub(super) fn apply_edits(editor: SyntaxEditor) -> SyntaxEdit {
128128

129129
// Add to changed ancestors, if applicable
130130
match change {
131-
Change::Insert(_, _) | Change::InsertAll(_, _) => {}
132-
Change::Replace(target, _) | Change::ReplaceWithMany(target, _) => {
131+
Change::Replace(SyntaxElement::Node(target), _)
132+
| Change::ReplaceWithMany(SyntaxElement::Node(target), _) => {
133133
changed_ancestors.push_back(ChangedAncestor::single(target, change_index))
134134
}
135135
Change::ReplaceAll(range, _) => {
136136
changed_ancestors.push_back(ChangedAncestor::multiple(range, change_index))
137137
}
138+
_ => (),
138139
}
139140
}
140141

@@ -304,13 +305,8 @@ enum ChangedAncestorKind {
304305
}
305306

306307
impl ChangedAncestor {
307-
fn single(element: &SyntaxElement, change_index: usize) -> Self {
308-
let kind = match element {
309-
SyntaxElement::Node(node) => ChangedAncestorKind::Single { node: node.clone() },
310-
SyntaxElement::Token(token) => {
311-
ChangedAncestorKind::Single { node: token.parent().unwrap() }
312-
}
313-
};
308+
fn single(node: &SyntaxNode, change_index: usize) -> Self {
309+
let kind = ChangedAncestorKind::Single { node: node.clone() };
314310

315311
Self { kind, change_index }
316312
}

0 commit comments

Comments
 (0)