aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/fn_references.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide/src/fn_references.rs')
-rw-r--r--crates/ide/src/fn_references.rs21
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 @@
1use hir::Semantics;
2use ide_db::RootDatabase;
3use syntax::{ast, ast::NameOwner, AstNode, SyntaxNode};
4
5use crate::{runnables::has_test_related_attribute, FileId, FileRange};
6
7pub(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
13pub(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}