From 077592a12fd982de3e69572a4c738dd4468617f9 Mon Sep 17 00:00:00 2001 From: Phil Ellison Date: Mon, 28 Dec 2020 18:29:58 +0000 Subject: Initial implementation of view-hir command --- crates/ide/src/view_hir.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 crates/ide/src/view_hir.rs (limited to 'crates/ide/src/view_hir.rs') 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 @@ +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; + +// Feature: View hir +// +// |=== +// | Editor | Action Name +// +// | VS Code | **Rust Analyzer: View Hir** +// |=== +pub(crate) fn view_hir(db: &RootDatabase, position: FilePosition) -> String { + body_hir(db, position).unwrap_or("Not inside a function body".to_string()) +} + +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: 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 -- cgit v1.2.3