use hir::Semantics;
use ide_db::call_info::FnCallNode;
use ide_db::RootDatabase;
-use syntax::{ast, match_ast, AstNode, TextRange};
+use syntax::{ast, AstNode, TextRange};
use crate::{
display::TryToNav, goto_definition, references, FilePosition, NavigationTarget, RangeInfo,
// This target is the containing function
if let Some(nav) = syntax.ancestors().find_map(|node| {
- match_ast! {
- match node {
- ast::Fn(it) => {
- let def = sema.to_def(&it)?;
- def.try_to_nav(sema.db)
- },
- _ => None,
- }
- }
+ let fn_ = ast::Fn::cast(node)?;
+ let def = sema.to_def(&fn_)?;
+ def.try_to_nav(sema.db)
}) {
let relative_range = reference.file_range.range;
calls.add(&nav, relative_range);
.filter_map(|node| FnCallNode::with_node_exact(&node))
.filter_map(|call_node| {
let name_ref = call_node.name_ref()?;
-
- if let Some(func_target) = match &call_node {
+ let func_target = match call_node {
FnCallNode::CallExpr(expr) => {
//FIXME: Type::as_callable is broken
let callable = sema.type_of_expr(&expr.expr()?)?.as_callable(db)?;
match callable.kind() {
- hir::CallableKind::Function(it) => {
- let fn_def: hir::Function = it.into();
- let nav = fn_def.try_to_nav(db)?;
- Some(nav)
- }
+ hir::CallableKind::Function(it) => it.try_to_nav(db),
_ => None,
}
}
let function = sema.resolve_method_call(&expr)?;
function.try_to_nav(db)
}
- } {
- Some((func_target, name_ref.syntax().text_range()))
- } else {
- None
- }
+ }?;
+ Some((func_target, name_ref.syntax().text_range()))
})
.for_each(|(nav, range)| calls.add(&nav, range));