@@ -524,9 +524,17 @@ pub enum InlayTooltip {
524
524
Markdown ( String ) ,
525
525
}
526
526
527
- #[ derive( Default , Hash ) ]
527
+ #[ derive( Default ) ]
528
528
pub struct InlayHintLabel {
529
529
pub parts : SmallVec < [ InlayHintLabelPart ; 1 ] > ,
530
+ pub tooltip : Option < LazyProperty < String > > ,
531
+ }
532
+
533
+ impl std:: hash:: Hash for InlayHintLabel {
534
+ fn hash < H : std:: hash:: Hasher > ( & self , state : & mut H ) {
535
+ self . parts . hash ( state) ;
536
+ self . tooltip . is_some ( ) . hash ( state) ;
537
+ }
530
538
}
531
539
532
540
impl InlayHintLabel {
@@ -537,6 +545,7 @@ impl InlayHintLabel {
537
545
) -> InlayHintLabel {
538
546
InlayHintLabel {
539
547
parts : smallvec ! [ InlayHintLabelPart { text: s. into( ) , linked_location, tooltip } ] ,
548
+ tooltip : None ,
540
549
}
541
550
}
542
551
@@ -582,6 +591,7 @@ impl From<String> for InlayHintLabel {
582
591
fn from ( s : String ) -> Self {
583
592
Self {
584
593
parts : smallvec ! [ InlayHintLabelPart { text: s, linked_location: None , tooltip: None } ] ,
594
+ tooltip : None ,
585
595
}
586
596
}
587
597
}
@@ -592,8 +602,9 @@ impl From<&str> for InlayHintLabel {
592
602
parts : smallvec ! [ InlayHintLabelPart {
593
603
text: s. into( ) ,
594
604
linked_location: None ,
595
- tooltip: None
605
+ tooltip: None ,
596
606
} ] ,
607
+ tooltip : None ,
597
608
}
598
609
}
599
610
}
@@ -606,7 +617,10 @@ impl fmt::Display for InlayHintLabel {
606
617
607
618
impl fmt:: Debug for InlayHintLabel {
608
619
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
609
- f. debug_list ( ) . entries ( & self . parts ) . finish ( )
620
+ f. debug_struct ( "InlayHintLabel" )
621
+ . field ( "parts" , & self . parts )
622
+ . field ( "tooltip" , & self . tooltip )
623
+ . finish ( )
610
624
}
611
625
}
612
626
@@ -703,6 +717,13 @@ impl InlayHintLabelBuilder<'_> {
703
717
}
704
718
}
705
719
720
+ fn write_to_label_and_tooltip ( & mut self , s : & str ) -> fmt:: Result {
721
+ if let Some ( LazyProperty :: Computed ( ref mut tooltip) ) = self . result . tooltip {
722
+ tooltip. push_str ( s) ;
723
+ }
724
+ self . write_str ( s)
725
+ }
726
+
706
727
fn finish ( mut self ) -> InlayHintLabel {
707
728
self . make_new_part ( ) ;
708
729
self . result
@@ -744,31 +765,44 @@ fn label_of_ty(
744
765
)
745
766
} ) ;
746
767
747
- label_builder. write_str ( LABEL_START ) ?;
768
+ label_builder. write_to_label_and_tooltip ( LABEL_START ) ?;
748
769
label_builder. start_location_link ( ModuleDef :: from ( iter_trait) . into ( ) ) ;
749
- label_builder. write_str ( LABEL_ITERATOR ) ?;
770
+ label_builder. write_to_label_and_tooltip ( LABEL_ITERATOR ) ?;
750
771
label_builder. end_location_link ( ) ;
751
- label_builder. write_str ( LABEL_MIDDLE ) ?;
772
+ label_builder. write_to_label_and_tooltip ( LABEL_MIDDLE ) ?;
752
773
label_builder. start_location_link ( ModuleDef :: from ( item) . into ( ) ) ;
753
- label_builder. write_str ( LABEL_ITEM ) ?;
774
+ label_builder. write_to_label_and_tooltip ( LABEL_ITEM ) ?;
754
775
label_builder. end_location_link ( ) ;
755
- label_builder. write_str ( LABEL_MIDDLE2 ) ?;
776
+ label_builder. write_to_label_and_tooltip ( LABEL_MIDDLE2 ) ?;
756
777
rec ( sema, famous_defs, max_length, & ty, label_builder, config, display_target) ?;
757
- label_builder. write_str ( LABEL_END ) ?;
778
+ label_builder. write_to_label_and_tooltip ( LABEL_END ) ?;
758
779
Ok ( ( ) )
759
780
}
760
- None => ty
761
- . display_truncated ( sema. db , max_length, display_target)
762
- . with_closure_style ( config. closure_style )
763
- . write_to ( label_builder) ,
781
+ None => {
782
+ if let Some ( LazyProperty :: Computed ( ref mut tooltip) ) = label_builder. result . tooltip
783
+ {
784
+ ty. display ( sema. db , display_target)
785
+ . with_closure_style ( config. closure_style )
786
+ . write_to ( tooltip) ?;
787
+ }
788
+
789
+ ty. display_truncated ( sema. db , max_length, display_target)
790
+ . with_closure_style ( config. closure_style )
791
+ . write_to ( label_builder)
792
+ }
764
793
}
765
794
}
766
795
796
+ let tooltip = if config. fields_to_resolve . resolve_label_tooltip {
797
+ Some ( LazyProperty :: Lazy )
798
+ } else {
799
+ Some ( LazyProperty :: Computed ( String :: new ( ) ) )
800
+ } ;
767
801
let mut label_builder = InlayHintLabelBuilder {
768
802
db : sema. db ,
769
803
last_part : String :: new ( ) ,
770
804
location : None ,
771
- result : InlayHintLabel :: default ( ) ,
805
+ result : InlayHintLabel { tooltip , .. Default :: default ( ) } ,
772
806
resolve : config. fields_to_resolve . resolve_label_location ,
773
807
} ;
774
808
let _ =
@@ -966,6 +1000,22 @@ mod tests {
966
1000
assert ! ( edits. is_empty( ) , "unexpected edits: {edits:?}" ) ;
967
1001
}
968
1002
1003
+ #[ track_caller]
1004
+ pub ( super ) fn check_tooltip (
1005
+ config : InlayHintsConfig ,
1006
+ #[ rust_analyzer:: rust_fixture] ra_fixture : & str ,
1007
+ expect : Expect ,
1008
+ ) {
1009
+ let ( analysis, file_id) = fixture:: file ( ra_fixture) ;
1010
+ let inlay_hints = analysis. inlay_hints ( & config, file_id, None ) . unwrap ( ) ;
1011
+
1012
+ let tooltips = inlay_hints
1013
+ . into_iter ( )
1014
+ . filter_map ( |hint| hint. label . tooltip ?. computed ( ) )
1015
+ . collect :: < Vec < _ > > ( ) ;
1016
+ expect. assert_debug_eq ( & tooltips) ;
1017
+ }
1018
+
969
1019
#[ test]
970
1020
fn hints_disabled ( ) {
971
1021
check_with_config (
0 commit comments