diff --git a/crates/hir/src/code_model.rs b/crates/hir/src/code_model.rs index 9b78944c6ee..f68299d3a12 100644 --- a/crates/hir/src/code_model.rs +++ b/crates/hir/src/code_model.rs @@ -1,5 +1,5 @@ //! FIXME: write short doc here -use std::{iter, sync::Arc}; +use std::{fmt::Write, iter, sync::Arc}; use arrayvec::ArrayVec; use base_db::{CrateDisplayName, CrateId, Edition, FileId}; @@ -729,8 +729,7 @@ impl DefWithBody { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct Function { - // DO NOT MERGE: this was previously pub(crate) - pub id: FunctionId, + pub(crate) id: FunctionId, } impl Function { @@ -798,6 +797,19 @@ impl Function { pub fn has_body(self, db: &dyn HirDatabase) -> bool { db.function_data(self.id).has_body } + + /// A textual representation of the HIR of this function for debugging purposes. + pub fn debug_hir(self, db: &dyn HirDatabase) -> String { + let body = db.body(self.id.into()); + + let mut result = String::new(); + writeln!(&mut result, "HIR expressions in the body of `{}`:", self.name(db)).unwrap(); + for (id, expr) in body.exprs.iter() { + writeln!(&mut result, "{:?}: {:?}", id, expr).unwrap(); + } + + result + } } // Note: logically, this belongs to `hir_ty`, but we are not using it there yet. diff --git a/crates/ide/src/view_hir.rs b/crates/ide/src/view_hir.rs index e48f2cfe026..cfcfb7cfbc0 100644 --- a/crates/ide/src/view_hir.rs +++ b/crates/ide/src/view_hir.rs @@ -1,11 +1,9 @@ use hir::{Function, Semantics}; -use hir::db::DefDatabase; use ide_db::base_db::FilePosition; use ide_db::RootDatabase; -use syntax::{AstNode, algo::find_node_at_offset, ast}; -use std::fmt::Write; +use syntax::{algo::find_node_at_offset, ast, AstNode}; -// Feature: View hir +// Feature: View Hir // // |=== // | Editor | Action Name @@ -20,20 +18,8 @@ fn body_hir(db: &RootDatabase, position: FilePosition) -> Option { let sema = Semantics::new(db); let source_file = sema.parse(position.file_id); - let function = find_node_at_offset::( - source_file.syntax(), - position.offset, - )?; + let function = find_node_at_offset::(source_file.syntax(), position.offset)?; let function: Function = sema.to_def(&function)?; - let body = db.body(function.id.into()); - - let mut result = String::new(); - writeln!(&mut result, "== Body expressions ==").ok()?; - - for (id, expr) in body.exprs.iter() { - writeln!(&mut result, "{:?}: {:?}", id, expr).ok()?; - } - - Some(result) -} \ No newline at end of file + Some(function.debug_hir(db)) +} diff --git a/docs/dev/README.md b/docs/dev/README.md index 4a2f9feb369..55527bab0aa 100644 --- a/docs/dev/README.md +++ b/docs/dev/README.md @@ -227,6 +227,8 @@ There are also two VS Code commands which might be of interest: * `Rust Analyzer: Syntax Tree` shows syntax tree of the current file/selection. +* `Rust Analyzer: View Hir` shows the HIR expressions within the function containing the cursor. + You can hover over syntax nodes in the opened text file to see the appropriate rust code that it refers to and the rust editor will also highlight the proper text range. diff --git a/docs/dev/lsp-extensions.md b/docs/dev/lsp-extensions.md index 8c01db07c84..78d86f060a6 100644 --- a/docs/dev/lsp-extensions.md +++ b/docs/dev/lsp-extensions.md @@ -1,5 +1,5 @@