From 0dbc091fee10cf8aae68d971713b32c07d1a96f0 Mon Sep 17 00:00:00 2001 From: bitgaoshu Date: Sat, 25 Jun 2022 17:33:27 +0800 Subject: [PATCH] add test for suggest_name --- crates/hir/src/semantics.rs | 12 ++--------- crates/hir/src/source_analyzer.rs | 22 ++++++++++++++++---- crates/ide-assists/src/utils/suggest_name.rs | 15 +++++++++++++ 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index aa10b0f878..744f3865aa 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -16,7 +16,6 @@ use hir_expand::{ name::{known, AsName}, ExpansionInfo, MacroCallId, }; -use hir_ty::Interner; use itertools::Itertools; use rustc_hash::{FxHashMap, FxHashSet}; use smallvec::{smallvec, SmallVec}; @@ -975,18 +974,11 @@ impl<'db> SemanticsImpl<'db> { } fn resolve_method_call(&self, call: &ast::MethodCallExpr) -> Option { - self.analyze(call.syntax())?.resolve_method_call(self.db, call).map(|(id, _)| id) + self.analyze(call.syntax())?.resolve_method_call(self.db, call) } fn resolve_method_call_as_callable(&self, call: &ast::MethodCallExpr) -> Option { - let source_analyzer = self.analyze(call.syntax())?; - let (func, subst) = source_analyzer.resolve_method_call(self.db, call)?; - let ty = self.db.value_ty(func.into()).substitute(Interner, &subst); - let resolver = source_analyzer.resolver; - let ty = Type::new_with_resolver(self.db, &resolver, ty); - let mut res = ty.as_callable(self.db)?; - res.is_bound_method = true; - Some(res) + self.analyze(call.syntax())?.resolve_method_call_as_callable(self.db, call) } fn resolve_field(&self, field: &ast::FieldExpr) -> Option { diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs index 3faae8fc4b..7e584aa2b4 100644 --- a/crates/hir/src/source_analyzer.rs +++ b/crates/hir/src/source_analyzer.rs @@ -43,8 +43,8 @@ use syntax::{ use crate::{ db::HirDatabase, semantics::PathResolution, Adt, AssocItem, BindingMode, BuiltinAttr, - BuiltinType, Const, Field, Function, Local, Macro, ModuleDef, Static, Struct, ToolModule, - Trait, Type, TypeAlias, Variant, + BuiltinType, Callable, Const, Field, Function, Local, Macro, ModuleDef, Static, Struct, + ToolModule, Trait, Type, TypeAlias, Variant, }; /// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of @@ -239,15 +239,29 @@ impl SourceAnalyzer { ) } + pub(crate) fn resolve_method_call_as_callable( + &self, + db: &dyn HirDatabase, + call: &ast::MethodCallExpr, + ) -> Option { + let expr_id = self.expr_id(db, &call.clone().into())?; + let (func, substs) = self.infer.as_ref()?.method_resolution(expr_id)?; + let ty = db.value_ty(func.into()).substitute(Interner, &substs); + let ty = Type::new_with_resolver(db, &self.resolver, ty); + let mut res = ty.as_callable(db)?; + res.is_bound_method = true; + Some(res) + } + pub(crate) fn resolve_method_call( &self, db: &dyn HirDatabase, call: &ast::MethodCallExpr, - ) -> Option<(FunctionId, Substitution)> { + ) -> Option { let expr_id = self.expr_id(db, &call.clone().into())?; let (f_in_trait, substs) = self.infer.as_ref()?.method_resolution(expr_id)?; let f_in_impl = self.resolve_impl_method(db, f_in_trait, &substs); - Some((f_in_impl.unwrap_or(f_in_trait), substs)) + f_in_impl.or(Some(f_in_trait)) } pub(crate) fn resolve_field( diff --git a/crates/ide-assists/src/utils/suggest_name.rs b/crates/ide-assists/src/utils/suggest_name.rs index 5b79a7495f..b05a41fa4b 100644 --- a/crates/ide-assists/src/utils/suggest_name.rs +++ b/crates/ide-assists/src/utils/suggest_name.rs @@ -450,6 +450,21 @@ fn foo() { S.bar($01$0, 2) } ); } + #[test] + fn method_on_impl_trait() { + check( + r#" +struct S; +trait T { + fn bar(&self, n: i32, m: u32); +} +impl T for S { fn bar(&self, n: i32, m: u32); } +fn foo() { S.bar($01$0, 2) } +"#, + "n", + ); + } + #[test] fn method_ufcs() { check(