diff --git a/crates/hir/src/code_model.rs b/crates/hir/src/code_model.rs index 63c1a8ebf0..563145f921 100644 --- a/crates/hir/src/code_model.rs +++ b/crates/hir/src/code_model.rs @@ -1398,7 +1398,7 @@ impl Type { }; let canonical_ty = Canonical { value: self.ty.value.clone(), kinds: Arc::new([]) }; - method_resolution::implements_trait( + method_resolution::implements_trait_unique( &canonical_ty, db, self.ty.environment.clone(), diff --git a/crates/hir_ty/src/method_resolution.rs b/crates/hir_ty/src/method_resolution.rs index 8961df4049..5a6f0c67fb 100644 --- a/crates/hir_ty/src/method_resolution.rs +++ b/crates/hir_ty/src/method_resolution.rs @@ -740,6 +740,19 @@ pub fn implements_trait( solution.is_some() } +pub fn implements_trait_unique( + ty: &Canonical, + db: &dyn HirDatabase, + env: Arc, + krate: CrateId, + trait_: TraitId, +) -> bool { + let goal = generic_implements_goal(db, env, trait_, ty.clone()); + let solution = db.trait_solve(krate, goal); + + matches!(solution, Some(crate::traits::Solution::Unique(_))) +} + /// This creates Substs for a trait with the given Self type and type variables /// for all other parameters, to query Chalk with it. fn generic_implements_goal( diff --git a/crates/ide/src/syntax_highlighting/test_data/highlighting.html b/crates/ide/src/syntax_highlighting/test_data/highlighting.html index c6b4f5a002..ee115972b0 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlighting.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlighting.html @@ -115,6 +115,12 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd f() } +fn foobar() -> impl Copy {} + +fn foo() { + let bar = foobar(); +} + macro_rules! def_fn { ($($tt:tt)*) => {$($tt)*} } diff --git a/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs index dd43f9dd95..5ea712cf5f 100644 --- a/crates/ide/src/syntax_highlighting/tests.rs +++ b/crates/ide/src/syntax_highlighting/tests.rs @@ -89,6 +89,12 @@ fn baz ()>(f: F) { f() } +fn foobar() -> impl Copy {} + +fn foo() { + let bar = foobar(); +} + macro_rules! def_fn { ($($tt:tt)*) => {$($tt)*} }