1
Fork 0

add goto-to-def actions for trait bound

This commit is contained in:
lh123 2025-01-16 14:47:42 +08:00
parent b6ba392bb1
commit fdc672e402
2 changed files with 104 additions and 1 deletions

View file

@ -559,8 +559,20 @@ fn goto_type_action_for_def(
.for_each(|it| push_new_def(it.into()));
} else if let Definition::Function(function) = def {
walk_and_push_ty(db, &function.ret_type(db), &mut push_new_def);
let krate = function.module(db).krate();
let sized_trait =
db.lang_item(krate.into(), LangItem::Sized).and_then(|lang_item| lang_item.as_trait());
for param in function.params_without_self(db) {
walk_and_push_ty(db, param.ty(), &mut push_new_def);
if let Some(type_param) = param.ty().as_type_param(db) {
type_param
.trait_bounds(db)
.into_iter()
.filter(|&it| Some(it.into()) != sized_trait)
.for_each(|it| push_new_def(it.into()));
} else {
walk_and_push_ty(db, param.ty(), &mut push_new_def);
}
}
} else {
let ty = match def {

View file

@ -2368,6 +2368,97 @@ fn test() {
);
}
#[test]
fn test_hover_show_type_def_for_func_param() {
check_actions(
r#"
struct Bar;
fn f(b: Bar) {
}
fn test() {
let b = Bar;
f$0(b);
}
"#,
expect![[r#"
[
Reference(
FilePositionWrapper {
file_id: FileId(
0,
),
offset: 15,
},
),
GoToType(
[
HoverGotoTypeData {
mod_path: "ra_test_fixture::Bar",
nav: NavigationTarget {
file_id: FileId(
0,
),
full_range: 0..11,
focus_range: 7..10,
name: "Bar",
kind: Struct,
description: "struct Bar",
},
},
],
),
]
"#]],
);
}
#[test]
fn test_hover_show_type_def_for_trait_bound() {
check_actions(
r#"
trait Bar {}
fn f<T: Bar>(b: T) {
}
fn test() {
f$0();
}
"#,
expect![[r#"
[
Reference(
FilePositionWrapper {
file_id: FileId(
0,
),
offset: 16,
},
),
GoToType(
[
HoverGotoTypeData {
mod_path: "ra_test_fixture::Bar",
nav: NavigationTarget {
file_id: FileId(
0,
),
full_range: 0..12,
focus_range: 6..9,
name: "Bar",
kind: Trait,
description: "trait Bar",
},
},
],
),
]
"#]],
);
}
#[test]
fn test_hover_non_ascii_space_doc() {
check(