diff options
Diffstat (limited to 'crates/ra_ide/src')
-rw-r--r-- | crates/ra_ide/src/display/navigation_target.rs | 19 | ||||
-rw-r--r-- | crates/ra_ide/src/expand.rs | 83 |
2 files changed, 46 insertions, 56 deletions
diff --git a/crates/ra_ide/src/display/navigation_target.rs b/crates/ra_ide/src/display/navigation_target.rs index 6a2bf7273..6a6b49afd 100644 --- a/crates/ra_ide/src/display/navigation_target.rs +++ b/crates/ra_ide/src/display/navigation_target.rs | |||
@@ -7,14 +7,10 @@ use ra_syntax::{ | |||
7 | ast::{self, DocCommentsOwner, NameOwner}, | 7 | ast::{self, DocCommentsOwner, NameOwner}, |
8 | match_ast, AstNode, SmolStr, | 8 | match_ast, AstNode, SmolStr, |
9 | SyntaxKind::{self, BIND_PAT, TYPE_PARAM}, | 9 | SyntaxKind::{self, BIND_PAT, TYPE_PARAM}, |
10 | SyntaxNode, TextRange, | 10 | TextRange, |
11 | }; | 11 | }; |
12 | 12 | ||
13 | use crate::{ | 13 | use crate::{db::RootDatabase, expand::original_range, FileSymbol}; |
14 | db::RootDatabase, | ||
15 | expand::{original_range_by_kind, OriginalRangeKind}, | ||
16 | FileRange, FileSymbol, | ||
17 | }; | ||
18 | 14 | ||
19 | use super::short_label::ShortLabel; | 15 | use super::short_label::ShortLabel; |
20 | 16 | ||
@@ -420,14 +416,3 @@ pub(crate) fn description_from_symbol(db: &RootDatabase, symbol: &FileSymbol) -> | |||
420 | } | 416 | } |
421 | } | 417 | } |
422 | } | 418 | } |
423 | |||
424 | fn original_range(db: &RootDatabase, node: InFile<&SyntaxNode>) -> FileRange { | ||
425 | if let Some(range) = original_range_by_kind(db, node, OriginalRangeKind::CallToken) { | ||
426 | return range; | ||
427 | } | ||
428 | if let Some(range) = original_range_by_kind(db, node, OriginalRangeKind::WholeCall) { | ||
429 | return range; | ||
430 | } | ||
431 | |||
432 | FileRange { file_id: node.file_id.original_file(db), range: node.value.text_range() } | ||
433 | } | ||
diff --git a/crates/ra_ide/src/expand.rs b/crates/ra_ide/src/expand.rs index 258478bc1..7a22bb0a4 100644 --- a/crates/ra_ide/src/expand.rs +++ b/crates/ra_ide/src/expand.rs | |||
@@ -7,55 +7,60 @@ use ra_syntax::{ast, AstNode, SyntaxNode, SyntaxToken, TextRange}; | |||
7 | 7 | ||
8 | use crate::{db::RootDatabase, FileRange}; | 8 | use crate::{db::RootDatabase, FileRange}; |
9 | 9 | ||
10 | #[derive(Debug, PartialEq, Eq)] | 10 | pub(crate) fn original_range(db: &RootDatabase, node: InFile<&SyntaxNode>) -> FileRange { |
11 | pub(crate) enum OriginalRangeKind { | 11 | if let Some((range, Origin::Call)) = original_range_and_origin(db, node) { |
12 | /// Return range if any token is matched | 12 | return range; |
13 | #[allow(dead_code)] | 13 | } |
14 | Any, | 14 | |
15 | /// Return range if token is inside macro_call | 15 | if let Some(expansion) = node.file_id.expansion_info(db) { |
16 | CallToken, | 16 | if let Some(call_node) = expansion.call_node() { |
17 | /// Return whole macro call range if matched | 17 | return FileRange { |
18 | WholeCall, | 18 | file_id: call_node.file_id.original_file(db), |
19 | range: call_node.value.text_range(), | ||
20 | }; | ||
21 | } | ||
22 | } | ||
23 | |||
24 | FileRange { file_id: node.file_id.original_file(db), range: node.value.text_range() } | ||
19 | } | 25 | } |
20 | 26 | ||
21 | pub(crate) fn original_range_by_kind( | 27 | fn original_range_and_origin( |
22 | db: &RootDatabase, | 28 | db: &RootDatabase, |
23 | node: InFile<&SyntaxNode>, | 29 | node: InFile<&SyntaxNode>, |
24 | kind: OriginalRangeKind, | 30 | ) -> Option<(FileRange, Origin)> { |
25 | ) -> Option<FileRange> { | ||
26 | let expansion = node.file_id.expansion_info(db)?; | 31 | let expansion = node.file_id.expansion_info(db)?; |
27 | 32 | ||
28 | // the input node has only one token ? | 33 | // the input node has only one token ? |
29 | let single = node.value.first_token()? == node.value.last_token()?; | 34 | let single = node.value.first_token()? == node.value.last_token()?; |
30 | 35 | ||
31 | // FIXME: We should handle recurside macro expansions | 36 | // FIXME: We should handle recurside macro expansions |
32 | let range = match kind { | 37 | let (range, origin) = node.value.descendants().find_map(|it| { |
33 | OriginalRangeKind::WholeCall => expansion.call_node()?.map(|node| node.text_range()), | 38 | let first = it.first_token()?; |
34 | _ => node.value.descendants().find_map(|it| { | 39 | let last = it.last_token()?; |
35 | let first = it.first_token()?; | 40 | |
36 | let last = it.last_token()?; | 41 | if !single && first == last { |
37 | 42 | return None; | |
38 | if !single && first == last { | 43 | } |
39 | return None; | 44 | |
40 | } | 45 | // Try to map first and last tokens of node, and, if success, return the union range of mapped tokens |
41 | 46 | let (first, first_origin) = expansion.map_token_up(node.with_value(&first))?; | |
42 | // Try to map first and last tokens of node, and, if success, return the union range of mapped tokens | 47 | let (last, last_origin) = expansion.map_token_up(node.with_value(&last))?; |
43 | let (first, first_origin) = expansion.map_token_up(node.with_value(&first))?; | 48 | |
44 | let (last, last_origin) = expansion.map_token_up(node.with_value(&last))?; | 49 | if first.file_id != last.file_id || first_origin != last_origin { |
45 | 50 | return None; | |
46 | if first.file_id != last.file_id | 51 | } |
47 | || first_origin != last_origin | 52 | |
48 | || (kind == OriginalRangeKind::CallToken && first_origin != Origin::Call) | 53 | // FIXME: Add union method in TextRange |
49 | { | 54 | Some(( |
50 | return None; | 55 | first.with_value(union_range(first.value.text_range(), last.value.text_range())), |
51 | } | 56 | first_origin, |
52 | 57 | )) | |
53 | // FIXME: Add union method in TextRange | 58 | })?; |
54 | Some(first.with_value(union_range(first.value.text_range(), last.value.text_range()))) | 59 | |
55 | })?, | 60 | return Some(( |
56 | }; | 61 | FileRange { file_id: range.file_id.original_file(db), range: range.value }, |
57 | 62 | origin, | |
58 | return Some(FileRange { file_id: range.file_id.original_file(db), range: range.value }); | 63 | )); |
59 | 64 | ||
60 | fn union_range(a: TextRange, b: TextRange) -> TextRange { | 65 | fn union_range(a: TextRange, b: TextRange) -> TextRange { |
61 | let start = a.start().min(b.start()); | 66 | let start = a.start().min(b.start()); |