Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-db/src/active_parameter.rs')
-rw-r--r--crates/ide-db/src/active_parameter.rs19
1 files changed, 8 insertions, 11 deletions
diff --git a/crates/ide-db/src/active_parameter.rs b/crates/ide-db/src/active_parameter.rs
index 5780b5a5bb..98d2e81754 100644
--- a/crates/ide-db/src/active_parameter.rs
+++ b/crates/ide-db/src/active_parameter.rs
@@ -1,7 +1,7 @@
//! This module provides functionality for querying callable information about a token.
use either::Either;
-use hir::{Semantics, Type};
+use hir::{InFile, Semantics, Type};
use parser::T;
use syntax::{
ast::{self, HasArgList, HasName},
@@ -13,7 +13,7 @@ use crate::RootDatabase;
#[derive(Debug)]
pub struct ActiveParameter {
pub ty: Type,
- pub pat: Option<Either<ast::SelfParam, ast::Pat>>,
+ pub src: Option<InFile<Either<ast::SelfParam, ast::Param>>>,
}
impl ActiveParameter {
@@ -22,18 +22,18 @@ impl ActiveParameter {
let (signature, active_parameter) = callable_for_token(sema, token)?;
let idx = active_parameter?;
- let mut params = signature.params(sema.db);
+ let mut params = signature.params();
if idx >= params.len() {
cov_mark::hit!(too_many_arguments);
return None;
}
- let (pat, ty) = params.swap_remove(idx);
- Some(ActiveParameter { ty, pat })
+ let param = params.swap_remove(idx);
+ Some(ActiveParameter { ty: param.ty().clone(), src: param.source(sema.db) })
}
pub fn ident(&self) -> Option<ast::Name> {
- self.pat.as_ref().and_then(|param| match param {
- Either::Right(ast::Pat::IdentPat(ident)) => ident.name(),
+ self.src.as_ref().and_then(|param| match param.value.as_ref().right()?.pat()? {
+ ast::Pat::IdentPat(ident) => ident.name(),
_ => None,
})
}
@@ -60,10 +60,7 @@ pub fn callable_for_node(
token: &SyntaxToken,
) -> Option<(hir::Callable, Option<usize>)> {
let callable = match calling_node {
- ast::CallableExpr::Call(call) => {
- let expr = call.expr()?;
- sema.type_of_expr(&expr)?.adjusted().as_callable(sema.db)
- }
+ ast::CallableExpr::Call(call) => sema.resolve_expr_as_callable(&call.expr()?),
ast::CallableExpr::MethodCall(call) => sema.resolve_method_call_as_callable(call),
}?;
let active_param = calling_node.arg_list().map(|arg_list| {