diff options
Diffstat (limited to 'crates/ide/src/move_item.rs')
-rw-r--r-- | crates/ide/src/move_item.rs | 28 |
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 @@ | |||
1 | use std::{iter::once, mem}; | 1 | use std::{iter::once, mem}; |
2 | 2 | ||
3 | use hir::Semantics; | 3 | use hir::Semantics; |
4 | use ide_db::{base_db::FileRange, RootDatabase}; | 4 | use ide_db::{base_db::FileRange, helpers::pick_best_token, RootDatabase}; |
5 | use itertools::Itertools; | 5 | use itertools::Itertools; |
6 | use syntax::{ | 6 | use syntax::{algo, ast, match_ast, AstNode, SyntaxElement, SyntaxKind, SyntaxNode, TextRange}; |
7 | algo, ast, match_ast, AstNode, SyntaxElement, SyntaxKind, SyntaxNode, SyntaxToken, TextRange, | ||
8 | TokenAtOffset, | ||
9 | }; | ||
10 | use text_edit::{TextEdit, TextEditBuilder}; | 7 | use 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 | ||
173 | fn 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)] |
186 | mod tests { | 178 | mod tests { |
187 | use crate::fixture; | 179 | use crate::fixture; |