This repository was archived by the owner on May 28, 2025. It is now read-only.
File tree Expand file tree Collapse file tree 2 files changed +104
-1
lines changed
src/tools/rust-analyzer/crates/ide/src Expand file tree Collapse file tree 2 files changed +104
-1
lines changed Original file line number Diff line number Diff line change @@ -559,8 +559,20 @@ fn goto_type_action_for_def(
559559 . for_each ( |it| push_new_def ( it. into ( ) ) ) ;
560560 } else if let Definition :: Function ( function) = def {
561561 walk_and_push_ty ( db, & function. ret_type ( db) , & mut push_new_def) ;
562+
563+ let krate = function. module ( db) . krate ( ) ;
564+ let sized_trait =
565+ db. lang_item ( krate. into ( ) , LangItem :: Sized ) . and_then ( |lang_item| lang_item. as_trait ( ) ) ;
562566 for param in function. params_without_self ( db) {
563- walk_and_push_ty ( db, param. ty ( ) , & mut push_new_def) ;
567+ if let Some ( type_param) = param. ty ( ) . as_type_param ( db) {
568+ type_param
569+ . trait_bounds ( db)
570+ . into_iter ( )
571+ . filter ( |& it| Some ( it. into ( ) ) != sized_trait)
572+ . for_each ( |it| push_new_def ( it. into ( ) ) ) ;
573+ } else {
574+ walk_and_push_ty ( db, param. ty ( ) , & mut push_new_def) ;
575+ }
564576 }
565577 } else {
566578 let ty = match def {
Original file line number Diff line number Diff line change @@ -2368,6 +2368,97 @@ fn test() {
23682368 ) ;
23692369}
23702370
2371+ #[ test]
2372+ fn test_hover_show_type_def_for_func_param ( ) {
2373+ check_actions (
2374+ r#"
2375+ struct Bar;
2376+ fn f(b: Bar) {
2377+
2378+ }
2379+
2380+ fn test() {
2381+ let b = Bar;
2382+ f$0(b);
2383+ }
2384+ "# ,
2385+ expect ! [ [ r#"
2386+ [
2387+ Reference(
2388+ FilePositionWrapper {
2389+ file_id: FileId(
2390+ 0,
2391+ ),
2392+ offset: 15,
2393+ },
2394+ ),
2395+ GoToType(
2396+ [
2397+ HoverGotoTypeData {
2398+ mod_path: "ra_test_fixture::Bar",
2399+ nav: NavigationTarget {
2400+ file_id: FileId(
2401+ 0,
2402+ ),
2403+ full_range: 0..11,
2404+ focus_range: 7..10,
2405+ name: "Bar",
2406+ kind: Struct,
2407+ description: "struct Bar",
2408+ },
2409+ },
2410+ ],
2411+ ),
2412+ ]
2413+ "# ] ] ,
2414+ ) ;
2415+ }
2416+
2417+ #[ test]
2418+ fn test_hover_show_type_def_for_trait_bound ( ) {
2419+ check_actions (
2420+ r#"
2421+ trait Bar {}
2422+ fn f<T: Bar>(b: T) {
2423+
2424+ }
2425+
2426+ fn test() {
2427+ f$0();
2428+ }
2429+ "# ,
2430+ expect ! [ [ r#"
2431+ [
2432+ Reference(
2433+ FilePositionWrapper {
2434+ file_id: FileId(
2435+ 0,
2436+ ),
2437+ offset: 16,
2438+ },
2439+ ),
2440+ GoToType(
2441+ [
2442+ HoverGotoTypeData {
2443+ mod_path: "ra_test_fixture::Bar",
2444+ nav: NavigationTarget {
2445+ file_id: FileId(
2446+ 0,
2447+ ),
2448+ full_range: 0..12,
2449+ focus_range: 6..9,
2450+ name: "Bar",
2451+ kind: Trait,
2452+ description: "trait Bar",
2453+ },
2454+ },
2455+ ],
2456+ ),
2457+ ]
2458+ "# ] ] ,
2459+ ) ;
2460+ }
2461+
23712462#[ test]
23722463fn test_hover_non_ascii_space_doc ( ) {
23732464 check (
You can’t perform that action at this time.
0 commit comments