Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_assists/src/utils.rs')
| -rw-r--r-- | crates/ide_assists/src/utils.rs | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/crates/ide_assists/src/utils.rs b/crates/ide_assists/src/utils.rs index 9bc70bc3fe..5273a3107b 100644 --- a/crates/ide_assists/src/utils.rs +++ b/crates/ide_assists/src/utils.rs @@ -14,11 +14,11 @@ use syntax::{ self, edit::{self, AstNodeEdit}, edit_in_place::AttrsOwnerEdit, - make, HasArgList, HasAttrs, HasGenericParams, HasName, HasTypeBounds, + make, HasArgList, HasAttrs, HasGenericParams, HasName, HasTypeBounds, Whitespace, }, - ted, AstNode, Direction, SmolStr, + ted, AstNode, AstToken, Direction, SmolStr, SourceFile, SyntaxKind::*, - SyntaxNode, TextSize, T, + SyntaxNode, TextRange, TextSize, T, }; use crate::assist_context::{AssistBuilder, AssistContext}; @@ -500,3 +500,29 @@ pub(crate) fn get_methods(items: &ast::AssocItemList) -> Vec<ast::Fn> { .filter(|f| f.name().is_some()) .collect() } + +/// Trim(remove leading and trailing whitespace) `initial_range` in `source_file`, return the trimmed range. +pub(crate) fn trimmed_text_range(source_file: &SourceFile, initial_range: TextRange) -> TextRange { + let mut trimmed_range = initial_range; + while source_file + .syntax() + .token_at_offset(trimmed_range.start()) + .find_map(Whitespace::cast) + .is_some() + && trimmed_range.start() < trimmed_range.end() + { + let start = trimmed_range.start() + TextSize::from(1); + trimmed_range = TextRange::new(start, trimmed_range.end()); + } + while source_file + .syntax() + .token_at_offset(trimmed_range.end()) + .find_map(Whitespace::cast) + .is_some() + && trimmed_range.start() < trimmed_range.end() + { + let end = trimmed_range.end() - TextSize::from(1); + trimmed_range = TextRange::new(trimmed_range.start(), end); + } + trimmed_range +} |