diff options
Diffstat (limited to 'crates/ide/src/view_hir.rs')
-rw-r--r-- | crates/ide/src/view_hir.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/crates/ide/src/view_hir.rs b/crates/ide/src/view_hir.rs new file mode 100644 index 000000000..e48f2cfe0 --- /dev/null +++ b/crates/ide/src/view_hir.rs | |||
@@ -0,0 +1,39 @@ | |||
1 | use hir::{Function, Semantics}; | ||
2 | use hir::db::DefDatabase; | ||
3 | use ide_db::base_db::FilePosition; | ||
4 | use ide_db::RootDatabase; | ||
5 | use syntax::{AstNode, algo::find_node_at_offset, ast}; | ||
6 | use std::fmt::Write; | ||
7 | |||
8 | // Feature: View hir | ||
9 | // | ||
10 | // |=== | ||
11 | // | Editor | Action Name | ||
12 | // | ||
13 | // | VS Code | **Rust Analyzer: View Hir** | ||
14 | // |=== | ||
15 | pub(crate) fn view_hir(db: &RootDatabase, position: FilePosition) -> String { | ||
16 | body_hir(db, position).unwrap_or("Not inside a function body".to_string()) | ||
17 | } | ||
18 | |||
19 | fn body_hir(db: &RootDatabase, position: FilePosition) -> Option<String> { | ||
20 | let sema = Semantics::new(db); | ||
21 | let source_file = sema.parse(position.file_id); | ||
22 | |||
23 | let function = find_node_at_offset::<ast::Fn>( | ||
24 | source_file.syntax(), | ||
25 | position.offset, | ||
26 | )?; | ||
27 | |||
28 | let function: Function = sema.to_def(&function)?; | ||
29 | let body = db.body(function.id.into()); | ||
30 | |||
31 | let mut result = String::new(); | ||
32 | writeln!(&mut result, "== Body expressions ==").ok()?; | ||
33 | |||
34 | for (id, expr) in body.exprs.iter() { | ||
35 | writeln!(&mut result, "{:?}: {:?}", id, expr).ok()?; | ||
36 | } | ||
37 | |||
38 | Some(result) | ||
39 | } \ No newline at end of file | ||