diff options
Diffstat (limited to 'crates/ide/src/fn_references.rs')
-rw-r--r-- | crates/ide/src/fn_references.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/crates/ide/src/fn_references.rs b/crates/ide/src/fn_references.rs new file mode 100644 index 000000000..ca91b98cf --- /dev/null +++ b/crates/ide/src/fn_references.rs | |||
@@ -0,0 +1,21 @@ | |||
1 | use hir::Semantics; | ||
2 | use ide_db::RootDatabase; | ||
3 | use syntax::{ast, ast::NameOwner, AstNode, SyntaxNode}; | ||
4 | |||
5 | use crate::{runnables::has_test_related_attribute, FileId, FileRange}; | ||
6 | |||
7 | pub(crate) fn find_all_methods(db: &RootDatabase, file_id: FileId) -> Vec<FileRange> { | ||
8 | let sema = Semantics::new(db); | ||
9 | let source_file = sema.parse(file_id); | ||
10 | source_file.syntax().descendants().filter_map(|it| method_range(it, file_id)).collect() | ||
11 | } | ||
12 | |||
13 | pub(crate) fn method_range(item: SyntaxNode, file_id: FileId) -> Option<FileRange> { | ||
14 | ast::Fn::cast(item).and_then(|fn_def|{ | ||
15 | if has_test_related_attribute(&fn_def) { | ||
16 | None | ||
17 | } else { | ||
18 | fn_def.name().map(|name| FileRange{ file_id, range: name.syntax().text_range() }) | ||
19 | } | ||
20 | }) | ||
21 | } | ||