about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDuong Quoc Khanh <dqkqdlot@gmail.com>2023-02-13 20:11:04 +0900
committerDuong Quoc Khanh <dqkqdlot@gmail.com>2023-02-13 20:11:04 +0900
commit0285acc5f791e1d2bf652abb88ffeb0a75c1165a (patch)
tree715f1a061c1b01767845e3e4ac3161ce4c221c25
parente1396bde73900c638112c34bbf1b9b7e31a20a0d (diff)
downloadrust-0285acc5f791e1d2bf652abb88ffeb0a75c1165a.tar.gz
rust-0285acc5f791e1d2bf652abb88ffeb0a75c1165a.zip
Find `next_non_trivia_token` of `name_ref`.
-rw-r--r--crates/ide-completion/src/context/analysis.rs28
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 {