diff options
| author | Duong Quoc Khanh <dqkqdlot@gmail.com> | 2023-02-13 20:11:04 +0900 |
|---|---|---|
| committer | Duong Quoc Khanh <dqkqdlot@gmail.com> | 2023-02-13 20:11:04 +0900 |
| commit | 0285acc5f791e1d2bf652abb88ffeb0a75c1165a (patch) | |
| tree | 715f1a061c1b01767845e3e4ac3161ce4c221c25 | |
| parent | e1396bde73900c638112c34bbf1b9b7e31a20a0d (diff) | |
| download | rust-0285acc5f791e1d2bf652abb88ffeb0a75c1165a.tar.gz rust-0285acc5f791e1d2bf652abb88ffeb0a75c1165a.zip | |
Find `next_non_trivia_token` of `name_ref`.
| -rw-r--r-- | crates/ide-completion/src/context/analysis.rs | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/crates/ide-completion/src/context/analysis.rs b/crates/ide-completion/src/context/analysis.rs index 48066736c51..4c66f95903a 100644 --- a/crates/ide-completion/src/context/analysis.rs +++ b/crates/ide-completion/src/context/analysis.rs @@ -608,16 +608,8 @@ fn classify_name_ref( let reciever_is_part_of_indivisible_expression = match &receiver { Some(ast::Expr::IfExpr(_)) => { - let next_sibling = field.dot_token().and_then(|token| { - let dot_token = original_file.covering_element(token.text_range()); - let next_sibling = dot_token.as_token().and_then(|t| t.next_token()).and_then(|t| next_non_trivia_sibling(t.into())); - next_sibling - }); - match next_sibling { - Some(syntax::NodeOrToken::Node(n)) => n.first_child_or_token().map(|t| t.kind()) == Some(SyntaxKind::ELSE_KW), - Some(syntax::NodeOrToken::Token(t)) => t.kind() == SyntaxKind::ELSE_KW, - None => false - } + let next_token_kind = next_non_trivia_token(name_ref.syntax().clone()).map(|t| t.kind()); + next_token_kind == Some(SyntaxKind::ELSE_KW) }, _ => false }; @@ -1337,6 +1329,22 @@ fn previous_non_trivia_token(e: impl Into<SyntaxElement>) -> Option<SyntaxToken> None } +fn next_non_trivia_token(e: impl Into<SyntaxElement>) -> Option<SyntaxToken> { + let mut token = match e.into() { + SyntaxElement::Node(n) => n.last_token()?, + SyntaxElement::Token(t) => t, + } + .next_token(); + while let Some(inner) = token { + if !inner.kind().is_trivia() { + return Some(inner); + } else { + token = inner.next_token(); + } + } + None +} + fn next_non_trivia_sibling(ele: SyntaxElement) -> Option<SyntaxElement> { let mut e = ele.next_sibling_or_token(); while let Some(inner) = e { |
