Skip to content

Commit 70a6cf0

Browse files
committed
Auto merge of #15522 - SomeoneToIgnore:resolve-inlay-hints, r=Veykril
Resolve inlay hint data Part of #13962 Support https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#inlayHint_resolve better, by omitting all inlay hint fields specified in the client hint resolve capabilities. Current list of all capabilities possible to resolve later: ``` "textEdits" "tooltip" "label.tooltip" "label.location" "label.command" ``` and every one specified in the client capabilities is now resolved by r-a, being omitted in the initial response. -------------- When editing `inlay_hints.rs` file around line `457` with no resolve capabilities, I get <details> <summary>resolved json, 10803 characters</summary> ```json {"jsonrpc":"2.0","id":55,"result":[{"position":{"line":477,"character":1},"label":[{"value":"fn inlay_hints","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/ide/src/inlay_hints.rs","range":{"start":{"line":445,"character":14},"end":{"line":445,"character":25}}}}],"paddingLeft":true,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":451,"character":10},"label":[{"value":": "},{"value":"ProfileSpan","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/profile/src/hprof.rs","range":{"start":{"line":85,"character":11},"end":{"line":85,"character":22}}}},{"value":""}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":451,"character":27},"label":[{"value":"label:","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/profile/src/hprof.rs","range":{"start":{"line":60,"character":12},"end":{"line":60,"character":17}}}}],"kind":2,"paddingLeft":false,"paddingRight":true,"data":{"file_id":0}},{"position":{"line":452,"character":12},"label":[{"value":": "},{"value":"Semantics","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/hir/src/semantics.rs","range":{"start":{"line":108,"character":11},"end":{"line":108,"character":20}}}},{"value":"<'_, "},{"value":"RootDatabase","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/ide-db/src/lib.rs","range":{"start":{"line":75,"character":11},"end":{"line":75,"character":23}}}},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":453,"character":12},"label":[{"value":": "},{"value":"SourceFile","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/syntax/src/ast/generated/nodes.rs","range":{"start":{"line":223,"character":11},"end":{"line":223,"character":21}}}},{"value":""}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":454,"character":12},"label":[{"value":": &"},{"value":"SyntaxNode","location":{"uri":"file:///Users/someonetoignore/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rowan-0.15.11/src/api.rs","range":{"start":{"line":15,"character":11},"end":{"line":15,"character":21}}}},{"value":"<"},{"value":"RustLanguage","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/syntax/src/syntax_node.rs","range":{"start":{"line":15,"character":9},"end":{"line":15,"character":21}}}},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":456,"character":12},"label":": i32","kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":458,"character":15},"label":[{"value":": "},{"value":"Vec","location":{"uri":"file:///Users/someonetoignore/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/alloc/src/vec/mod.rs","range":{"start":{"line":395,"character":11},"end":{"line":395,"character":14}}}},{"value":"<"},{"value":"InlayHint","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/ide/src/inlay_hints.rs","range":{"start":{"line":149,"character":11},"end":{"line":149,"character":20}}}},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":460,"character":21},"label":[{"value":": "},{"value":"SemanticsScope","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/hir/src/semantics.rs","range":{"start":{"line":1651,"character":11},"end":{"line":1651,"character":25}}}},{"value":"<'_>"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":460,"character":36},"label":[{"value":"node:","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/hir/src/semantics.rs","range":{"start":{"line":482,"character":24},"end":{"line":482,"character":28}}}}],"kind":2,"paddingLeft":false,"paddingRight":true,"data":{"file_id":0}},{"position":{"line":461,"character":23},"label":[{"value":": "},{"value":"FamousDefs","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/ide-db/src/famous_defs.rs","range":{"start":{"line":20,"character":11},"end":{"line":20,"character":21}}}},{"value":"<'_, '_>"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":463,"character":17},"label":[{"value":": impl FnMut("},{"value":"SyntaxNode","location":{"uri":"file:///Users/someonetoignore/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rowan-0.15.11/src/api.rs","range":{"start":{"line":15,"character":11},"end":{"line":15,"character":21}}}},{"value":"<"},{"value":"RustLanguage","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/syntax/src/syntax_node.rs","range":{"start":{"line":15,"character":9},"end":{"line":15,"character":21}}}},{"value":">)"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":463,"character":25},"label":[{"value":": "},{"value":"SyntaxNode","location":{"uri":"file:///Users/someonetoignore/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rowan-0.15.11/src/api.rs","range":{"start":{"line":15,"character":11},"end":{"line":15,"character":21}}}},{"value":"<"},{"value":"RustLanguage","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/syntax/src/syntax_node.rs","range":{"start":{"line":15,"character":9},"end":{"line":15,"character":21}}}},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":463,"character":33},"label":[{"value":"hints:","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/ide/src/inlay_hints.rs","range":{"start":{"line":480,"character":4},"end":{"line":480,"character":9}}}}],"kind":2,"paddingLeft":false,"paddingRight":true,"data":{"file_id":0}},{"position":{"line":465,"character":22},"label":[{"value":": "},{"value":"TextRange","location":{"uri":"file:///Users/someonetoignore/.cargo/registry/src/index.crates.io-6f17d22bba15001f/text-size-1.1.0/src/range.rs","range":{"start":{"line":14,"character":11},"end":{"line":14,"character":20}}}},{"value":""}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":467,"character":35},"label":[{"value":": "},{"value":"SyntaxNode","location":{"uri":"file:///Users/someonetoignore/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rowan-0.15.11/src/api.rs","range":{"start":{"line":15,"character":11},"end":{"line":15,"character":21}}}},{"value":"<"},{"value":"RustLanguage","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/syntax/src/syntax_node.rs","range":{"start":{"line":15,"character":9},"end":{"line":15,"character":21}}}},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":469,"character":92},"label":[{"value":"impl "},{"value":"Iterator","location":{"uri":"file:///Users/someonetoignore/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs","range":{"start":{"line":72,"character":10},"end":{"line":72,"character":18}}}},{"value":"<"},{"value":"Item","location":{"uri":"file:///Users/someonetoignore/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs","range":{"start":{"line":76,"character":9},"end":{"line":76,"character":13}}}},{"value":" = "},{"value":"SyntaxNode","location":{"uri":"file:///Users/someonetoignore/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rowan-0.15.11/src/api.rs","range":{"start":{"line":15,"character":11},"end":{"line":15,"character":21}}}},{"value":"<"},{"value":"RustLanguage","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/syntax/src/syntax_node.rs","range":{"start":{"line":15,"character":9},"end":{"line":15,"character":21}}}},{"value":">>"}],"kind":1,"paddingLeft":true,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":468,"character":34},"label":[{"value":"impl "},{"value":"Iterator","location":{"uri":"file:///Users/someonetoignore/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs","range":{"start":{"line":72,"character":10},"end":{"line":72,"character":18}}}},{"value":"<"},{"value":"Item","location":{"uri":"file:///Users/someonetoignore/.rustup/toolchains/stable-aarch64-apple-darwin/lib/rustlib/src/rust/library/core/src/iter/traits/iterator.rs","range":{"start":{"line":76,"character":9},"end":{"line":76,"character":13}}}},{"value":" = "},{"value":"SyntaxNode","location":{"uri":"file:///Users/someonetoignore/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rowan-0.15.11/src/api.rs","range":{"start":{"line":15,"character":11},"end":{"line":15,"character":21}}}},{"value":"<"},{"value":"RustLanguage","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/syntax/src/syntax_node.rs","range":{"start":{"line":15,"character":9},"end":{"line":15,"character":21}}}},{"value":">>"},{"value":""}],"kind":1,"paddingLeft":true,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":467,"character":41},"label":[{"value":""},{"value":"SyntaxNode","location":{"uri":"file:///Users/someonetoignore/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rowan-0.15.11/src/api.rs","range":{"start":{"line":15,"character":11},"end":{"line":15,"character":21}}}},{"value":"<"},{"value":"RustLanguage","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/syntax/src/syntax_node.rs","range":{"start":{"line":15,"character":9},"end":{"line":15,"character":21}}}},{"value":">"}],"kind":1,"paddingLeft":true,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":469,"character":40},"label":" -> bool","kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":469,"character":39},"label":[{"value":": &"},{"value":"SyntaxNode","location":{"uri":"file:///Users/someonetoignore/.cargo/registry/src/index.crates.io-6f17d22bba15001f/rowan-0.15.11/src/api.rs","range":{"start":{"line":15,"character":11},"end":{"line":15,"character":21}}}},{"value":"<"},{"value":"RustLanguage","location":{"uri":"file:///Users/someonetoignore/work/rust-analyzer/crates/syntax/src/syntax_node.rs","range":{"start":{"line":15,"character":9},"end":{"line":15,"character":21}}}},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}}]} ``` </details> for the visible editor range alone, pretty much repeated on every consequent edit. With this patch and all inlay hint resolve capabilities enabled, for the same example I observe quite a footprint reduction: <details> <summary>unresolved json, 4142 characters</summary> ```json {"jsonrpc":"2.0","id":49,"result":[{"position":{"line":477,"character":1},"label":[{"value":"fn inlay_hints"}],"paddingLeft":true,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":451,"character":10},"label":[{"value":": "},{"value":"ProfileSpan"},{"value":""}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":451,"character":27},"label":[{"value":"label:"}],"kind":2,"paddingLeft":false,"paddingRight":true,"data":{"file_id":0}},{"position":{"line":452,"character":12},"label":[{"value":": "},{"value":"Semantics"},{"value":"<'_, "},{"value":"RootDatabase"},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":453,"character":12},"label":[{"value":": "},{"value":"SourceFile"},{"value":""}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":454,"character":12},"label":[{"value":": &"},{"value":"SyntaxNode"},{"value":"<"},{"value":"RustLanguage"},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":456,"character":12},"label":": i32","kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":458,"character":15},"label":[{"value":": "},{"value":"Vec"},{"value":"<"},{"value":"InlayHint"},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":460,"character":21},"label":[{"value":": "},{"value":"SemanticsScope"},{"value":"<'_>"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":460,"character":36},"label":[{"value":"node:"}],"kind":2,"paddingLeft":false,"paddingRight":true,"data":{"file_id":0}},{"position":{"line":461,"character":23},"label":[{"value":": "},{"value":"FamousDefs"},{"value":"<'_, '_>"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":463,"character":17},"label":[{"value":": impl FnMut("},{"value":"SyntaxNode"},{"value":"<"},{"value":"RustLanguage"},{"value":">)"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":463,"character":25},"label":[{"value":": "},{"value":"SyntaxNode"},{"value":"<"},{"value":"RustLanguage"},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":463,"character":33},"label":[{"value":"hints:"}],"kind":2,"paddingLeft":false,"paddingRight":true,"data":{"file_id":0}},{"position":{"line":465,"character":22},"label":[{"value":": "},{"value":"TextRange"},{"value":""}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":467,"character":35},"label":[{"value":": "},{"value":"SyntaxNode"},{"value":"<"},{"value":"RustLanguage"},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":469,"character":92},"label":[{"value":"impl "},{"value":"Iterator"},{"value":"<"},{"value":"Item"},{"value":" = "},{"value":"SyntaxNode"},{"value":"<"},{"value":"RustLanguage"},{"value":">>"}],"kind":1,"paddingLeft":true,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":468,"character":34},"label":[{"value":"impl "},{"value":"Iterator"},{"value":"<"},{"value":"Item"},{"value":" = "},{"value":"SyntaxNode"},{"value":"<"},{"value":"RustLanguage"},{"value":">>"},{"value":""}],"kind":1,"paddingLeft":true,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":467,"character":41},"label":[{"value":""},{"value":"SyntaxNode"},{"value":"<"},{"value":"RustLanguage"},{"value":">"}],"kind":1,"paddingLeft":true,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":469,"character":40},"label":" -> bool","kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}},{"position":{"line":469,"character":39},"label":[{"value":": &"},{"value":"SyntaxNode"},{"value":"<"},{"value":"RustLanguage"},{"value":">"}],"kind":1,"paddingLeft":false,"paddingRight":false,"data":{"file_id":0}}]} ``` </details> with all unresolved parts needing only for navigation, hover or applying the hint edit — dynamic parts that are made after mouse hover or similar events, that resolve the hint data.
2 parents 347695a + 7f450da commit 70a6cf0

22 files changed

+274
-82
lines changed

crates/ide/src/inlay_hints.rs

+32-1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,28 @@ pub struct InlayHintsConfig {
5252
pub closure_style: ClosureStyle,
5353
pub max_length: Option<usize>,
5454
pub closing_brace_hints_min_lines: Option<usize>,
55+
pub fields_to_resolve: InlayFieldsToResolve,
56+
}
57+
58+
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
59+
pub struct InlayFieldsToResolve {
60+
pub resolve_text_edits: bool,
61+
pub resolve_hint_tooltip: bool,
62+
pub resolve_label_tooltip: bool,
63+
pub resolve_label_location: bool,
64+
pub resolve_label_command: bool,
65+
}
66+
67+
impl InlayFieldsToResolve {
68+
pub const fn empty() -> Self {
69+
Self {
70+
resolve_text_edits: false,
71+
resolve_hint_tooltip: false,
72+
resolve_label_tooltip: false,
73+
resolve_label_location: false,
74+
resolve_label_command: false,
75+
}
76+
}
5577
}
5678

5779
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -123,11 +145,13 @@ pub struct InlayHint {
123145
pub label: InlayHintLabel,
124146
/// Text edit to apply when "accepting" this inlay hint.
125147
pub text_edit: Option<TextEdit>,
148+
pub needs_resolve: bool,
126149
}
127150

128151
impl InlayHint {
129152
fn closing_paren_after(kind: InlayKind, range: TextRange) -> InlayHint {
130153
InlayHint {
154+
needs_resolve: false,
131155
range,
132156
kind,
133157
label: InlayHintLabel::from(")"),
@@ -139,6 +163,7 @@ impl InlayHint {
139163
}
140164
fn opening_paren_before(kind: InlayKind, range: TextRange) -> InlayHint {
141165
InlayHint {
166+
needs_resolve: false,
142167
range,
143168
kind,
144169
label: InlayHintLabel::from("("),
@@ -196,6 +221,10 @@ impl InlayHintLabel {
196221
}),
197222
}
198223
}
224+
225+
pub fn needs_resolve(&self) -> bool {
226+
self.parts.iter().any(|part| part.linked_location.is_some() || part.tooltip.is_some())
227+
}
199228
}
200229

201230
impl From<String> for InlayHintLabel {
@@ -529,6 +558,7 @@ fn closure_has_block_body(closure: &ast::ClosureExpr) -> bool {
529558

530559
#[cfg(test)]
531560
mod tests {
561+
532562
use expect_test::Expect;
533563
use hir::ClosureStyle;
534564
use itertools::Itertools;
@@ -538,7 +568,7 @@ mod tests {
538568
use crate::DiscriminantHints;
539569
use crate::{fixture, inlay_hints::InlayHintsConfig, LifetimeElisionHints};
540570

541-
use super::ClosureReturnTypeHints;
571+
use super::{ClosureReturnTypeHints, InlayFieldsToResolve};
542572

543573
pub(super) const DISABLED_CONFIG: InlayHintsConfig = InlayHintsConfig {
544574
discriminant_hints: DiscriminantHints::Never,
@@ -559,6 +589,7 @@ mod tests {
559589
param_names_for_lifetime_elision_hints: false,
560590
max_length: None,
561591
closing_brace_hints_min_lines: None,
592+
fields_to_resolve: InlayFieldsToResolve::empty(),
562593
};
563594
pub(super) const TEST_CONFIG: InlayHintsConfig = InlayHintsConfig {
564595
type_hints: true,

crates/ide/src/inlay_hints/adjustment.rs

+11-9
Original file line numberDiff line numberDiff line change
@@ -137,21 +137,23 @@ pub(super) fn hints(
137137
}
138138
_ => continue,
139139
};
140+
let label = InlayHintLabel::simple(
141+
if postfix { format!(".{}", text.trim_end()) } else { text.to_owned() },
142+
Some(InlayTooltip::Markdown(format!(
143+
"`{}` → `{}` ({coercion} coercion)",
144+
source.display(sema.db),
145+
target.display(sema.db),
146+
))),
147+
None,
148+
);
140149
acc.push(InlayHint {
150+
needs_resolve: label.needs_resolve(),
141151
range: expr.syntax().text_range(),
142152
pad_left: false,
143153
pad_right: false,
144154
position: if postfix { InlayHintPosition::After } else { InlayHintPosition::Before },
145155
kind: InlayKind::Adjustment,
146-
label: InlayHintLabel::simple(
147-
if postfix { format!(".{}", text.trim_end()) } else { text.to_owned() },
148-
Some(InlayTooltip::Markdown(format!(
149-
"`{}` → `{}` ({coercion} coercion)",
150-
source.display(sema.db),
151-
target.display(sema.db),
152-
))),
153-
None,
154-
),
156+
label,
155157
text_edit: None,
156158
});
157159
}

crates/ide/src/inlay_hints/bind_pat.rs

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ pub(super) fn hints(
9999
None => pat.syntax().text_range(),
100100
};
101101
acc.push(InlayHint {
102+
needs_resolve: label.needs_resolve() || text_edit.is_some(),
102103
range: match type_ascriptable {
103104
Some(Some(t)) => text_range.cover(t.text_range()),
104105
_ => text_range,

crates/ide/src/inlay_hints/binding_mode.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,10 @@ pub(super) fn hints(
5050
_ => return,
5151
};
5252
acc.push(InlayHint {
53+
needs_resolve: false,
5354
range,
5455
kind: InlayKind::BindingMode,
55-
label: r.to_string().into(),
56+
label: r.into(),
5657
text_edit: None,
5758
position: InlayHintPosition::Before,
5859
pad_left: false,
@@ -68,9 +69,10 @@ pub(super) fn hints(
6869
hir::BindingMode::Ref(Mutability::Shared) => "ref",
6970
};
7071
acc.push(InlayHint {
72+
needs_resolve: false,
7173
range: pat.syntax().text_range(),
7274
kind: InlayKind::BindingMode,
73-
label: bm.to_string().into(),
75+
label: bm.into(),
7476
text_edit: None,
7577
position: InlayHintPosition::Before,
7678
pad_left: false,

crates/ide/src/inlay_hints/chaining.rs

+19-1
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,12 @@ pub(super) fn hints(
5757
}
5858
}
5959
}
60+
let label = label_of_ty(famous_defs, config, &ty)?;
6061
acc.push(InlayHint {
62+
needs_resolve: label.needs_resolve(),
6163
range: expr.syntax().text_range(),
6264
kind: InlayKind::Chaining,
63-
label: label_of_ty(famous_defs, config, &ty)?,
65+
label,
6466
text_edit: None,
6567
position: InlayHintPosition::After,
6668
pad_left: true,
@@ -128,6 +130,7 @@ fn main() {
128130
"",
129131
],
130132
text_edit: None,
133+
needs_resolve: true,
131134
},
132135
InlayHint {
133136
range: 147..154,
@@ -152,6 +155,7 @@ fn main() {
152155
"",
153156
],
154157
text_edit: None,
158+
needs_resolve: true,
155159
},
156160
]
157161
"#]],
@@ -221,6 +225,7 @@ fn main() {
221225
"",
222226
],
223227
text_edit: None,
228+
needs_resolve: true,
224229
},
225230
InlayHint {
226231
range: 143..179,
@@ -245,6 +250,7 @@ fn main() {
245250
"",
246251
],
247252
text_edit: None,
253+
needs_resolve: true,
248254
},
249255
]
250256
"#]],
@@ -298,6 +304,7 @@ fn main() {
298304
"",
299305
],
300306
text_edit: None,
307+
needs_resolve: true,
301308
},
302309
InlayHint {
303310
range: 143..179,
@@ -322,6 +329,7 @@ fn main() {
322329
"",
323330
],
324331
text_edit: None,
332+
needs_resolve: true,
325333
},
326334
]
327335
"#]],
@@ -389,6 +397,7 @@ fn main() {
389397
"<i32, bool>>",
390398
],
391399
text_edit: None,
400+
needs_resolve: true,
392401
},
393402
InlayHint {
394403
range: 246..265,
@@ -426,6 +435,7 @@ fn main() {
426435
"<i32, bool>>",
427436
],
428437
text_edit: None,
438+
needs_resolve: true,
429439
},
430440
]
431441
"#]],
@@ -495,6 +505,7 @@ fn main() {
495505
" = ()>",
496506
],
497507
text_edit: None,
508+
needs_resolve: true,
498509
},
499510
InlayHint {
500511
range: 174..224,
@@ -532,6 +543,7 @@ fn main() {
532543
" = ()>",
533544
],
534545
text_edit: None,
546+
needs_resolve: true,
535547
},
536548
InlayHint {
537549
range: 174..206,
@@ -569,6 +581,7 @@ fn main() {
569581
" = ()>",
570582
],
571583
text_edit: None,
584+
needs_resolve: true,
572585
},
573586
InlayHint {
574587
range: 174..189,
@@ -593,6 +606,7 @@ fn main() {
593606
"",
594607
],
595608
text_edit: None,
609+
needs_resolve: true,
596610
},
597611
]
598612
"#]],
@@ -655,6 +669,7 @@ fn main() {
655669
],
656670
},
657671
),
672+
needs_resolve: true,
658673
},
659674
InlayHint {
660675
range: 145..185,
@@ -679,6 +694,7 @@ fn main() {
679694
"",
680695
],
681696
text_edit: None,
697+
needs_resolve: true,
682698
},
683699
InlayHint {
684700
range: 145..168,
@@ -703,6 +719,7 @@ fn main() {
703719
"",
704720
],
705721
text_edit: None,
722+
needs_resolve: true,
706723
},
707724
InlayHint {
708725
range: 222..228,
@@ -725,6 +742,7 @@ fn main() {
725742
},
726743
],
727744
text_edit: None,
745+
needs_resolve: true,
728746
},
729747
]
730748
"#]],

crates/ide/src/inlay_hints/closing_brace.rs

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ pub(super) fn hints(
109109

110110
let linked_location = name_range.map(|range| FileRange { file_id, range });
111111
acc.push(InlayHint {
112+
needs_resolve: linked_location.is_some(),
112113
range: closing_token.text_range(),
113114
kind: InlayKind::ClosingBrace,
114115
label: InlayHintLabel::simple(label, None, linked_location),

crates/ide/src/inlay_hints/closure_captures.rs

+22-16
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ pub(super) fn hints(
3131
let range = closure.syntax().first_token()?.prev_token()?.text_range();
3232
let range = TextRange::new(range.end() - TextSize::from(1), range.end());
3333
acc.push(InlayHint {
34+
needs_resolve: false,
3435
range,
3536
kind: InlayKind::ClosureCapture,
36-
label: InlayHintLabel::simple("move", None, None),
37+
label: InlayHintLabel::from("move"),
3738
text_edit: None,
3839
position: InlayHintPosition::After,
3940
pad_left: false,
@@ -43,6 +44,7 @@ pub(super) fn hints(
4344
}
4445
};
4546
acc.push(InlayHint {
47+
needs_resolve: false,
4648
range: move_kw_range,
4749
kind: InlayKind::ClosureCapture,
4850
label: InlayHintLabel::from("("),
@@ -59,23 +61,25 @@ pub(super) fn hints(
5961
// force cache the source file, otherwise sema lookup will potentially panic
6062
_ = sema.parse_or_expand(source.file());
6163

64+
let label = InlayHintLabel::simple(
65+
format!(
66+
"{}{}",
67+
match capture.kind() {
68+
hir::CaptureKind::SharedRef => "&",
69+
hir::CaptureKind::UniqueSharedRef => "&unique ",
70+
hir::CaptureKind::MutableRef => "&mut ",
71+
hir::CaptureKind::Move => "",
72+
},
73+
capture.display_place(sema.db)
74+
),
75+
None,
76+
source.name().and_then(|name| name.syntax().original_file_range_opt(sema.db)),
77+
);
6278
acc.push(InlayHint {
79+
needs_resolve: label.needs_resolve(),
6380
range: move_kw_range,
6481
kind: InlayKind::ClosureCapture,
65-
label: InlayHintLabel::simple(
66-
format!(
67-
"{}{}",
68-
match capture.kind() {
69-
hir::CaptureKind::SharedRef => "&",
70-
hir::CaptureKind::UniqueSharedRef => "&unique ",
71-
hir::CaptureKind::MutableRef => "&mut ",
72-
hir::CaptureKind::Move => "",
73-
},
74-
capture.display_place(sema.db)
75-
),
76-
None,
77-
source.name().and_then(|name| name.syntax().original_file_range_opt(sema.db)),
78-
),
82+
label,
7983
text_edit: None,
8084
position: InlayHintPosition::After,
8185
pad_left: false,
@@ -84,9 +88,10 @@ pub(super) fn hints(
8488

8589
if idx != last {
8690
acc.push(InlayHint {
91+
needs_resolve: false,
8792
range: move_kw_range,
8893
kind: InlayKind::ClosureCapture,
89-
label: InlayHintLabel::simple(", ", None, None),
94+
label: InlayHintLabel::from(", "),
9095
text_edit: None,
9196
position: InlayHintPosition::After,
9297
pad_left: false,
@@ -95,6 +100,7 @@ pub(super) fn hints(
95100
}
96101
}
97102
acc.push(InlayHint {
103+
needs_resolve: false,
98104
range: move_kw_range,
99105
kind: InlayKind::ClosureCapture,
100106
label: InlayHintLabel::from(")"),

crates/ide/src/inlay_hints/closure_ret.rs

+1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ pub(super) fn hints(
6464
};
6565

6666
acc.push(InlayHint {
67+
needs_resolve: label.needs_resolve() || text_edit.is_some(),
6768
range: param_list.syntax().text_range(),
6869
kind: InlayKind::Type,
6970
label,

crates/ide/src/inlay_hints/discriminant.rs

+1
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ fn variant_hints(
7979
None,
8080
);
8181
acc.push(InlayHint {
82+
needs_resolve: label.needs_resolve(),
8283
range: match eq_token {
8384
Some(t) => range.cover(t.text_range()),
8485
_ => range,

0 commit comments

Comments
 (0)