aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/move_item.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide/src/move_item.rs')
-rw-r--r--crates/ide/src/move_item.rs28
1 files changed, 10 insertions, 18 deletions
diff --git a/crates/ide/src/move_item.rs b/crates/ide/src/move_item.rs
index 246f10a0a..1223c2810 100644
--- a/crates/ide/src/move_item.rs
+++ b/crates/ide/src/move_item.rs
@@ -1,12 +1,9 @@
1use std::{iter::once, mem}; 1use std::{iter::once, mem};
2 2
3use hir::Semantics; 3use hir::Semantics;
4use ide_db::{base_db::FileRange, RootDatabase}; 4use ide_db::{base_db::FileRange, helpers::pick_best_token, RootDatabase};
5use itertools::Itertools; 5use itertools::Itertools;
6use syntax::{ 6use syntax::{algo, ast, match_ast, AstNode, SyntaxElement, SyntaxKind, SyntaxNode, TextRange};
7 algo, ast, match_ast, AstNode, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, TextRange,
8 TokenAtOffset,
9};
10use text_edit::{TextEdit, TextEditBuilder}; 7use text_edit::{TextEdit, TextEditBuilder};
11 8
12#[derive(Copy, Clone, Debug)] 9#[derive(Copy, Clone, Debug)]
@@ -36,7 +33,14 @@ pub(crate) fn move_item(
36 let file = sema.parse(range.file_id); 33 let file = sema.parse(range.file_id);
37 34
38 let item = if range.range.is_empty() { 35 let item = if range.range.is_empty() {
39 SyntaxElement::Token(pick_best(file.syntax().token_at_offset(range.range.start()))?) 36 SyntaxElement::Token(pick_best_token(
37 file.syntax().token_at_offset(range.range.start()),
38 |kind| match kind {
39 SyntaxKind::IDENT | SyntaxKind::LIFETIME_IDENT => 2,
40 kind if kind.is_trivia() => 0,
41 _ => 1,
42 },
43 )?)
40 } else { 44 } else {
41 file.syntax().covering_element(range.range) 45 file.syntax().covering_element(range.range)
42 }; 46 };
@@ -170,18 +174,6 @@ fn replace_nodes<'a>(
170 edit.finish() 174 edit.finish()
171} 175}
172 176
173fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> {
174 return tokens.max_by_key(priority);
175
176 fn priority(n: &SyntaxToken) -> usize {
177 match n.kind() {
178 SyntaxKind::IDENT | SyntaxKind::LIFETIME_IDENT => 2,
179 kind if kind.is_trivia() => 0,
180 _ => 1,
181 }
182 }
183}
184
185#[cfg(test)] 177#[cfg(test)]
186mod tests { 178mod tests {
187 use crate::fixture; 179 use crate::fixture;