@@ -11,8 +11,8 @@ use ide::{
11
11
Annotation , AnnotationKind , Assist , AssistKind , Cancellable , CompletionFieldsToResolve ,
12
12
CompletionItem , CompletionItemKind , CompletionRelevance , Documentation , FileId , FileRange ,
13
13
FileSystemEdit , Fold , FoldKind , Highlight , HlMod , HlOperator , HlPunct , HlRange , HlTag , Indel ,
14
- InlayFieldsToResolve , InlayHint , InlayHintLabel , InlayHintLabelPart , InlayKind , Markup ,
15
- NavigationTarget , ReferenceCategory , RenameError , Runnable , Severity , SignatureHelp ,
14
+ InlayFieldsToResolve , InlayHint , InlayHintLabel , InlayHintLabelPart , InlayKind , LazyProperty ,
15
+ Markup , NavigationTarget , ReferenceCategory , RenameError , Runnable , Severity , SignatureHelp ,
16
16
SnippetEdit , SourceChange , StructureNodeKind , SymbolKind , TextEdit , TextRange , TextSize ,
17
17
} ;
18
18
use ide_db:: { assists, rust_doc:: format_docs, FxHasher } ;
@@ -549,12 +549,11 @@ pub(crate) fn inlay_hint(
549
549
) -> Cancellable < lsp_types:: InlayHint > {
550
550
let hint_needs_resolve = |hint : & InlayHint | -> Option < TextRange > {
551
551
hint. resolve_parent . filter ( |_| {
552
- hint. text_edit . is_some ( )
553
- || hint
554
- . label
555
- . parts
556
- . iter ( )
557
- . any ( |part| part. linked_location . is_some ( ) || part. tooltip . is_some ( ) )
552
+ hint. text_edit . as_ref ( ) . is_some_and ( LazyProperty :: is_lazy)
553
+ || hint. label . parts . iter ( ) . any ( |part| {
554
+ part. linked_location . as_ref ( ) . is_some_and ( LazyProperty :: is_lazy)
555
+ || part. tooltip . as_ref ( ) . is_some_and ( LazyProperty :: is_lazy)
556
+ } )
558
557
} )
559
558
} ;
560
559
@@ -569,22 +568,21 @@ pub(crate) fn inlay_hint(
569
568
} ) ;
570
569
571
570
let mut something_to_resolve = false ;
572
- let text_edits = if snap
573
- . config
574
- . visual_studio_code_version ( )
575
- . is_none_or ( |version| VersionReq :: parse ( ">=1.86.0" ) . unwrap ( ) . matches ( version) )
576
- && resolve_range_and_hash. is_some ( )
577
- && fields_to_resolve. resolve_text_edits
578
- {
579
- something_to_resolve |= inlay_hint. text_edit . is_some ( ) ;
580
- None
581
- } else {
582
- inlay_hint
583
- . text_edit
584
- . take ( )
585
- . and_then ( |it| it. computed ( ) )
586
- . map ( |it| text_edit_vec ( line_index, it) )
587
- } ;
571
+ let text_edits = inlay_hint
572
+ . text_edit
573
+ . take ( )
574
+ . and_then ( |it| match it {
575
+ LazyProperty :: Computed ( it) => Some ( it) ,
576
+ LazyProperty :: Lazy => {
577
+ something_to_resolve |=
578
+ snap. config . visual_studio_code_version ( ) . is_none_or ( |version| {
579
+ VersionReq :: parse ( ">=1.86.0" ) . unwrap ( ) . matches ( version)
580
+ } ) && resolve_range_and_hash. is_some ( )
581
+ && fields_to_resolve. resolve_text_edits ;
582
+ None
583
+ }
584
+ } )
585
+ . map ( |it| text_edit_vec ( line_index, it) ) ;
588
586
let ( label, tooltip) = inlay_hint_label (
589
587
snap,
590
588
fields_to_resolve,
@@ -637,22 +635,23 @@ fn inlay_hint_label(
637
635
let ( label, tooltip) = match & * label. parts {
638
636
[ InlayHintLabelPart { linked_location : None , .. } ] => {
639
637
let InlayHintLabelPart { text, tooltip, .. } = label. parts . pop ( ) . unwrap ( ) ;
640
- let hint_tooltip = if needs_resolve && fields_to_resolve. resolve_hint_tooltip {
641
- * something_to_resolve |= tooltip. is_some ( ) ;
642
- None
643
- } else {
644
- match tooltip. and_then ( |it| it. computed ( ) ) {
645
- Some ( ide:: InlayTooltip :: String ( s) ) => {
646
- Some ( lsp_types:: InlayHintTooltip :: String ( s) )
647
- }
648
- Some ( ide:: InlayTooltip :: Markdown ( s) ) => {
649
- Some ( lsp_types:: InlayHintTooltip :: MarkupContent ( lsp_types:: MarkupContent {
650
- kind : lsp_types:: MarkupKind :: Markdown ,
651
- value : s,
652
- } ) )
653
- }
654
- None => None ,
638
+ let tooltip = tooltip. and_then ( |it| match it {
639
+ LazyProperty :: Computed ( it) => Some ( it) ,
640
+ LazyProperty :: Lazy => {
641
+ * something_to_resolve |=
642
+ needs_resolve && fields_to_resolve. resolve_hint_tooltip ;
643
+ None
655
644
}
645
+ } ) ;
646
+ let hint_tooltip = match tooltip {
647
+ Some ( ide:: InlayTooltip :: String ( s) ) => Some ( lsp_types:: InlayHintTooltip :: String ( s) ) ,
648
+ Some ( ide:: InlayTooltip :: Markdown ( s) ) => {
649
+ Some ( lsp_types:: InlayHintTooltip :: MarkupContent ( lsp_types:: MarkupContent {
650
+ kind : lsp_types:: MarkupKind :: Markdown ,
651
+ value : s,
652
+ } ) )
653
+ }
654
+ None => None ,
656
655
} ;
657
656
( lsp_types:: InlayHintLabel :: String ( text) , hint_tooltip)
658
657
}
@@ -661,34 +660,38 @@ fn inlay_hint_label(
661
660
. parts
662
661
. into_iter ( )
663
662
. map ( |part| {
664
- let tooltip = if needs_resolve && fields_to_resolve. resolve_label_tooltip {
665
- * something_to_resolve |= part. tooltip . is_some ( ) ;
666
- None
667
- } else {
668
- match part. tooltip . and_then ( |it| it. computed ( ) ) {
669
- Some ( ide:: InlayTooltip :: String ( s) ) => {
670
- Some ( lsp_types:: InlayHintLabelPartTooltip :: String ( s) )
671
- }
672
- Some ( ide:: InlayTooltip :: Markdown ( s) ) => {
673
- Some ( lsp_types:: InlayHintLabelPartTooltip :: MarkupContent (
674
- lsp_types:: MarkupContent {
675
- kind : lsp_types:: MarkupKind :: Markdown ,
676
- value : s,
677
- } ,
678
- ) )
679
- }
680
- None => None ,
663
+ let tooltip = part. tooltip . and_then ( |it| match it {
664
+ LazyProperty :: Computed ( it) => Some ( it) ,
665
+ LazyProperty :: Lazy => {
666
+ * something_to_resolve |= fields_to_resolve. resolve_label_tooltip ;
667
+ None
681
668
}
669
+ } ) ;
670
+ let tooltip = match tooltip {
671
+ Some ( ide:: InlayTooltip :: String ( s) ) => {
672
+ Some ( lsp_types:: InlayHintLabelPartTooltip :: String ( s) )
673
+ }
674
+ Some ( ide:: InlayTooltip :: Markdown ( s) ) => {
675
+ Some ( lsp_types:: InlayHintLabelPartTooltip :: MarkupContent (
676
+ lsp_types:: MarkupContent {
677
+ kind : lsp_types:: MarkupKind :: Markdown ,
678
+ value : s,
679
+ } ,
680
+ ) )
681
+ }
682
+ None => None ,
682
683
} ;
683
- let location = if needs_resolve && fields_to_resolve. resolve_label_location {
684
- * something_to_resolve |= part. linked_location . is_some ( ) ;
685
- None
686
- } else {
687
- part. linked_location
688
- . and_then ( |it| it. computed ( ) )
689
- . map ( |range| location ( snap, range) )
690
- . transpose ( ) ?
691
- } ;
684
+ let location = part
685
+ . linked_location
686
+ . and_then ( |it| match it {
687
+ LazyProperty :: Computed ( it) => Some ( it) ,
688
+ LazyProperty :: Lazy => {
689
+ * something_to_resolve |= fields_to_resolve. resolve_label_location ;
690
+ None
691
+ }
692
+ } )
693
+ . map ( |range| location ( snap, range) )
694
+ . transpose ( ) ?;
692
695
Ok ( lsp_types:: InlayHintLabelPart {
693
696
value : part. text ,
694
697
tooltip,
0 commit comments