Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/goto_definition.rs')
-rw-r--r--crates/ide/src/goto_definition.rs53
1 files changed, 2 insertions, 51 deletions
diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs
index b00aa4d0ca..c0a7438081 100644
--- a/crates/ide/src/goto_definition.rs
+++ b/crates/ide/src/goto_definition.rs
@@ -16,15 +16,12 @@ use ide_db::{
defs::{Definition, IdentClass},
famous_defs::FamousDefs,
helpers::pick_best_token,
+ syntax_helpers::node_ext::find_loops,
};
use itertools::Itertools;
use span::FileId;
use syntax::{
- AstNode, AstToken,
- SyntaxKind::*,
- SyntaxNode, SyntaxToken, T, TextRange,
- ast::{self, HasLoopBody},
- match_ast,
+ AstNode, AstToken, SyntaxKind::*, SyntaxNode, SyntaxToken, T, TextRange, ast, match_ast,
};
#[derive(Debug)]
@@ -510,51 +507,6 @@ fn nav_for_branch_exit_points(
Some(navs)
}
-pub(crate) fn find_loops(
- sema: &Semantics<'_, RootDatabase>,
- token: &SyntaxToken,
-) -> Option<Vec<ast::Expr>> {
- let parent = token.parent()?;
- let lbl = match_ast! {
- match parent {
- ast::BreakExpr(break_) => break_.lifetime(),
- ast::ContinueExpr(continue_) => continue_.lifetime(),
- _ => None,
- }
- };
- let label_matches =
- |it: Option<ast::Label>| match (lbl.as_ref(), it.and_then(|it| it.lifetime())) {
- (Some(lbl), Some(it)) => lbl.text() == it.text(),
- (None, _) => true,
- (Some(_), None) => false,
- };
-
- let find_ancestors = |token: SyntaxToken| {
- for anc in sema.token_ancestors_with_macros(token).filter_map(ast::Expr::cast) {
- let node = match &anc {
- ast::Expr::LoopExpr(loop_) if label_matches(loop_.label()) => anc,
- ast::Expr::WhileExpr(while_) if label_matches(while_.label()) => anc,
- ast::Expr::ForExpr(for_) if label_matches(for_.label()) => anc,
- ast::Expr::BlockExpr(blk)
- if blk.label().is_some() && label_matches(blk.label()) =>
- {
- anc
- }
- _ => continue,
- };
-
- return Some(node);
- }
- None
- };
-
- sema.descend_into_macros(token.clone())
- .into_iter()
- .filter_map(find_ancestors)
- .collect_vec()
- .into()
-}
-
fn nav_for_break_points(
sema: &Semantics<'_, RootDatabase>,
token: &SyntaxToken,
@@ -562,7 +514,6 @@ fn nav_for_break_points(
let db = sema.db;
let navs = find_loops(sema, token)?
- .into_iter()
.filter_map(|expr| {
let file_id = sema.hir_file_for(expr.syntax());
let expr_in_file = InFile::new(file_id, expr.clone());