]> git.lizzy.rs Git - rust.git/blob - src/tools/rust-analyzer/crates/ide/src/view_hir.rs
Rollup merge of #100221 - compiler-errors:impossible-trait-items, r=lcnr,notriddle...
[rust.git] / src / tools / rust-analyzer / crates / ide / src / view_hir.rs
1 use hir::{Function, Semantics};
2 use ide_db::base_db::FilePosition;
3 use ide_db::RootDatabase;
4 use syntax::{algo::find_node_at_offset, ast, AstNode};
5
6 // Feature: View Hir
7 //
8 // |===
9 // | Editor  | Action Name
10 //
11 // | VS Code | **rust-analyzer: View Hir**
12 // |===
13 // image::https://user-images.githubusercontent.com/48062697/113065588-068bdb80-91b1-11eb-9a78-0b4ef1e972fb.gif[]
14 pub(crate) fn view_hir(db: &RootDatabase, position: FilePosition) -> String {
15     body_hir(db, position).unwrap_or_else(|| "Not inside a function body".to_string())
16 }
17
18 fn body_hir(db: &RootDatabase, position: FilePosition) -> Option<String> {
19     let sema = Semantics::new(db);
20     let source_file = sema.parse(position.file_id);
21
22     let function = find_node_at_offset::<ast::Fn>(source_file.syntax(), position.offset)?;
23
24     let function: Function = sema.to_def(&function)?;
25     Some(function.debug_hir(db))
26 }