From 553254973e24a2c0bdf1475fccbbc4603e8421f0 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Thu, 27 Feb 2020 00:12:26 +0800 Subject: Skip trival token in original_range --- crates/ra_ide/src/extend_selection.rs | 24 +++++++----------------- crates/ra_ide/src/hover.rs | 27 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 17 deletions(-) (limited to 'crates/ra_ide/src') diff --git a/crates/ra_ide/src/extend_selection.rs b/crates/ra_ide/src/extend_selection.rs index 86e6f12d7..2e09bd1ec 100644 --- a/crates/ra_ide/src/extend_selection.rs +++ b/crates/ra_ide/src/extend_selection.rs @@ -5,7 +5,7 @@ use std::iter::successors; use hir::Semantics; use ra_ide_db::RootDatabase; use ra_syntax::{ - algo::{self, find_covering_element}, + algo::{self, find_covering_element, skip_trivia_token}, ast::{self, AstNode, AstToken}, Direction, NodeOrToken, SyntaxKind::{self, *}, @@ -118,14 +118,14 @@ fn extend_tokens_from_range( NodeOrToken::Token(it) => (it.clone(), it), }; - let mut first_token = skip_whitespace(first_token, Direction::Next)?; - let mut last_token = skip_whitespace(last_token, Direction::Prev)?; + let mut first_token = skip_trivia_token(first_token, Direction::Next)?; + let mut last_token = skip_trivia_token(last_token, Direction::Prev)?; while !first_token.text_range().is_subrange(&original_range) { - first_token = skip_whitespace(first_token.next_token()?, Direction::Next)?; + first_token = skip_trivia_token(first_token.next_token()?, Direction::Next)?; } while !last_token.text_range().is_subrange(&original_range) { - last_token = skip_whitespace(last_token.prev_token()?, Direction::Prev)?; + last_token = skip_trivia_token(last_token.prev_token()?, Direction::Prev)?; } // compute original mapped token range @@ -149,14 +149,14 @@ fn extend_tokens_from_range( // Find the first and last text range under expanded parent let first = successors(Some(first_token), |token| { let token = token.prev_token()?; - skip_whitespace(token, Direction::Prev) + skip_trivia_token(token, Direction::Prev) }) .take_while(validate) .last()?; let last = successors(Some(last_token), |token| { let token = token.next_token()?; - skip_whitespace(token, Direction::Next) + skip_trivia_token(token, Direction::Next) }) .take_while(validate) .last()?; @@ -169,16 +169,6 @@ fn extend_tokens_from_range( } } -fn skip_whitespace(mut token: SyntaxToken, direction: Direction) -> Option { - while token.kind() == WHITESPACE { - token = match direction { - Direction::Next => token.next_token()?, - Direction::Prev => token.prev_token()?, - } - } - Some(token) -} - fn union_range(range: TextRange, r: TextRange) -> TextRange { let start = range.start().min(r.start()); let end = range.end().max(r.end()); diff --git a/crates/ra_ide/src/hover.rs b/crates/ra_ide/src/hover.rs index 29b16e602..177038e20 100644 --- a/crates/ra_ide/src/hover.rs +++ b/crates/ra_ide/src/hover.rs @@ -174,6 +174,10 @@ pub(crate) fn hover(db: &RootDatabase, position: FilePosition) -> Optionfoo; }; } assert_eq!(hover_on, "bar") } + #[test] + fn test_hover_through_literal_string_in_macro() { + // FIXME: Currently `hover::type_of` do not work inside + // macro expansion + check_hover_no_result( + r#" + //- /lib.rs + macro_rules! arr { + ($($tt:tt)*) => { [$($tt)*)] } + } + fn foo() { + let mastered_for_itunes = ""; + let _ = arr!("Tr<|>acks", &mastered_for_itunes); + } + "#, + ); + } + #[test] fn test_hover_non_ascii_space_doc() { check_hover_result( -- cgit v1.2.3