add goto-to-def actions for trait bound
This commit is contained in:
parent
b6ba392bb1
commit
fdc672e402
2 changed files with 104 additions and 1 deletions
|
@ -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 {
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue