&mut self,
ty: Ty,
name: &Name,
- _id: ExprOrPatId,
+ id: ExprOrPatId,
) -> Option<(ValueNs, Option<Substs>)> {
let krate = self.resolver.krate()?;
trait_: t,
substs: trait_substs,
}));
+
+ self.write_assoc_resolution(id, *item);
return Some((ValueNs::Function(f), Some(substs)));
}
}
"spam RECORD_FIELD_DEF FileId(1) [17; 26) [17; 21)",
);
}
+
+ #[test]
+ fn goto_definition_works_for_ufcs_inherent_methods() {
+ check_goto(
+ "
+ //- /lib.rs
+ struct Foo;
+ impl Foo {
+ fn frobnicate() { }
+ }
+
+ fn bar(foo: &Foo) {
+ Foo::frobnicate<|>();
+ }
+ ",
+ "frobnicate FN_DEF FileId(1) [27; 47) [30; 40)",
+ );
+ }
+
+ #[test]
+ fn goto_definition_works_for_ufcs_trait_methods_through_traits() {
+ check_goto(
+ "
+ //- /lib.rs
+ trait Foo {
+ fn frobnicate();
+ }
+
+ fn bar() {
+ Foo::frobnicate<|>();
+ }
+ ",
+ "frobnicate FN_DEF FileId(1) [16; 32) [19; 29)",
+ );
+ }
+
+ #[test]
+ fn goto_definition_works_for_ufcs_trait_methods_through_self() {
+ check_goto(
+ "
+ //- /lib.rs
+ struct Foo;
+ trait Trait {
+ fn frobnicate();
+ }
+ impl Trait for Foo {}
+
+ fn bar() {
+ Foo::frobnicate<|>();
+ }
+ ",
+ "frobnicate FN_DEF FileId(1) [30; 46) [33; 43)",
+ );
+ }
+
#[test]
fn goto_definition_on_self() {
check_goto(