Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/view_hir.rs')
-rw-r--r--crates/ide/src/view_hir.rs27
1 files changed, 8 insertions, 19 deletions
diff --git a/crates/ide/src/view_hir.rs b/crates/ide/src/view_hir.rs
index bfdf9d0f33..ec5e993f5a 100644
--- a/crates/ide/src/view_hir.rs
+++ b/crates/ide/src/view_hir.rs
@@ -1,6 +1,6 @@
-use hir::{DefWithBody, Semantics};
+use hir::Semantics;
use ide_db::{FilePosition, RootDatabase};
-use syntax::{algo::ancestors_at_offset, ast, AstNode};
+use syntax::AstNode;
// Feature: View Hir
//
@@ -10,21 +10,10 @@ use syntax::{algo::ancestors_at_offset, ast, AstNode};
//
// ![View Hir](https://user-images.githubusercontent.com/48062697/113065588-068bdb80-91b1-11eb-9a78-0b4ef1e972fb.gif)
pub(crate) fn view_hir(db: &RootDatabase, position: FilePosition) -> String {
- body_hir(db, position).unwrap_or_else(|| "Not inside a function body".to_owned())
-}
-
-fn body_hir(db: &RootDatabase, position: FilePosition) -> Option<String> {
- let sema = Semantics::new(db);
- let source_file = sema.parse_guess_edition(position.file_id);
-
- let item = ancestors_at_offset(source_file.syntax(), position.offset)
- .filter(|it| !ast::MacroCall::can_cast(it.kind()))
- .find_map(ast::Item::cast)?;
- let def: DefWithBody = match item {
- ast::Item::Fn(it) => sema.to_def(&it)?.into(),
- ast::Item::Const(it) => sema.to_def(&it)?.into(),
- ast::Item::Static(it) => sema.to_def(&it)?.into(),
- _ => return None,
- };
- Some(def.debug_hir(db))
+ (|| {
+ let sema = Semantics::new(db);
+ let source_file = sema.parse_guess_edition(position.file_id);
+ sema.debug_hir_at(source_file.syntax().token_at_offset(position.offset).next()?)
+ })()
+ .unwrap_or_else(|| "Not inside a lowerable item".to_owned())
}