diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs index e6360bc6ec1..42009ea6491 100644 --- a/crates/ide/src/inlay_hints.rs +++ b/crates/ide/src/inlay_hints.rs @@ -16,6 +16,7 @@ use syntax::{ ast::{self, AstNode}, match_ast, NodeOrToken, SyntaxNode, TextRange, }; +use text_edit::TextEdit; use crate::{navigation_target::TryToNav, FileId}; @@ -113,14 +114,26 @@ pub struct InlayHint { pub kind: InlayKind, /// The actual label to show in the inlay hint. pub label: InlayHintLabel, + /// Text edit to apply when "accepting" this inlay hint. + pub text_edit: Option, } impl InlayHint { fn closing_paren(range: TextRange) -> InlayHint { - InlayHint { range, kind: InlayKind::ClosingParenthesis, label: InlayHintLabel::from(")") } + InlayHint { + range, + kind: InlayKind::ClosingParenthesis, + label: InlayHintLabel::from(")"), + text_edit: None, + } } fn opening_paren(range: TextRange) -> InlayHint { - InlayHint { range, kind: InlayKind::OpeningParenthesis, label: InlayHintLabel::from("(") } + InlayHint { + range, + kind: InlayKind::OpeningParenthesis, + label: InlayHintLabel::from("("), + text_edit: None, + } } } diff --git a/crates/ide/src/inlay_hints/adjustment.rs b/crates/ide/src/inlay_hints/adjustment.rs index 0b146091956..fea4b89b89f 100644 --- a/crates/ide/src/inlay_hints/adjustment.rs +++ b/crates/ide/src/inlay_hints/adjustment.rs @@ -135,6 +135,7 @@ pub(super) fn hints( ))), None, ), + text_edit: None, }); } if !postfix && needs_inner_parens { diff --git a/crates/ide/src/inlay_hints/bind_pat.rs b/crates/ide/src/inlay_hints/bind_pat.rs index 5f571d04482..4cd1fce8c92 100644 --- a/crates/ide/src/inlay_hints/bind_pat.rs +++ b/crates/ide/src/inlay_hints/bind_pat.rs @@ -12,9 +12,10 @@ use syntax::{ match_ast, }; -use crate::{inlay_hints::closure_has_block_body, InlayHint, InlayHintsConfig, InlayKind}; - -use super::label_of_ty; +use crate::{ + inlay_hints::{closure_has_block_body, label_of_ty}, + InlayHint, InlayHintsConfig, InlayKind, +}; pub(super) fn hints( acc: &mut Vec, @@ -50,6 +51,7 @@ pub(super) fn hints( }, kind: InlayKind::Type, label, + text_edit: None, }); Some(()) diff --git a/crates/ide/src/inlay_hints/binding_mode.rs b/crates/ide/src/inlay_hints/binding_mode.rs index 5d9729263c2..3d7f969aaab 100644 --- a/crates/ide/src/inlay_hints/binding_mode.rs +++ b/crates/ide/src/inlay_hints/binding_mode.rs @@ -49,7 +49,12 @@ pub(super) fn hints( (true, false) => "&", _ => return, }; - acc.push(InlayHint { range, kind: InlayKind::BindingMode, label: r.to_string().into() }); + acc.push(InlayHint { + range, + kind: InlayKind::BindingMode, + label: r.to_string().into(), + text_edit: None, + }); }); match pat { ast::Pat::IdentPat(pat) if pat.ref_token().is_none() && pat.mut_token().is_none() => { @@ -63,6 +68,7 @@ pub(super) fn hints( range: pat.syntax().text_range(), kind: InlayKind::BindingMode, label: bm.to_string().into(), + text_edit: None, }); } ast::Pat::OrPat(pat) if !pattern_adjustments.is_empty() && outer_paren_pat.is_none() => { diff --git a/crates/ide/src/inlay_hints/chaining.rs b/crates/ide/src/inlay_hints/chaining.rs index 11e6dc05fa1..eed5a2554cc 100644 --- a/crates/ide/src/inlay_hints/chaining.rs +++ b/crates/ide/src/inlay_hints/chaining.rs @@ -61,6 +61,7 @@ pub(super) fn hints( range: expr.syntax().text_range(), kind: InlayKind::Chaining, label: label_of_ty(famous_defs, config, ty)?, + text_edit: None, }); } } @@ -120,6 +121,7 @@ fn main() { }, "", ], + text_edit: None, }, InlayHint { range: 147..154, @@ -140,6 +142,7 @@ fn main() { }, "", ], + text_edit: None, }, ] "#]], @@ -205,6 +208,7 @@ fn main() { }, "", ], + text_edit: None, }, InlayHint { range: 143..179, @@ -225,6 +229,7 @@ fn main() { }, "", ], + text_edit: None, }, ] "#]], @@ -274,6 +279,7 @@ fn main() { }, "", ], + text_edit: None, }, InlayHint { range: 143..179, @@ -294,6 +300,7 @@ fn main() { }, "", ], + text_edit: None, }, ] "#]], @@ -357,6 +364,7 @@ fn main() { }, ">", ], + text_edit: None, }, InlayHint { range: 246..265, @@ -390,6 +398,7 @@ fn main() { }, ">", ], + text_edit: None, }, ] "#]], @@ -455,6 +464,7 @@ fn main() { }, " = ()>", ], + text_edit: None, }, InlayHint { range: 174..224, @@ -488,6 +498,7 @@ fn main() { }, " = ()>", ], + text_edit: None, }, InlayHint { range: 174..206, @@ -521,6 +532,7 @@ fn main() { }, " = ()>", ], + text_edit: None, }, InlayHint { range: 174..189, @@ -541,6 +553,7 @@ fn main() { }, "", ], + text_edit: None, }, ] "#]], @@ -590,6 +603,7 @@ fn main() { }, "", ], + text_edit: None, }, InlayHint { range: 145..185, @@ -610,6 +624,7 @@ fn main() { }, "", ], + text_edit: None, }, InlayHint { range: 145..168, @@ -630,6 +645,7 @@ fn main() { }, "", ], + text_edit: None, }, InlayHint { range: 222..228, @@ -648,6 +664,7 @@ fn main() { tooltip: "", }, ], + text_edit: None, }, ] "#]], diff --git a/crates/ide/src/inlay_hints/closing_brace.rs b/crates/ide/src/inlay_hints/closing_brace.rs index 14c11be54ef..10b5acd064e 100644 --- a/crates/ide/src/inlay_hints/closing_brace.rs +++ b/crates/ide/src/inlay_hints/closing_brace.rs @@ -112,6 +112,7 @@ pub(super) fn hints( range: closing_token.text_range(), kind: InlayKind::ClosingBrace, label: InlayHintLabel::simple(label, None, linked_location), + text_edit: None, }); None diff --git a/crates/ide/src/inlay_hints/closure_ret.rs b/crates/ide/src/inlay_hints/closure_ret.rs index f03a18b8e96..eb5a464e7c8 100644 --- a/crates/ide/src/inlay_hints/closure_ret.rs +++ b/crates/ide/src/inlay_hints/closure_ret.rs @@ -43,6 +43,7 @@ pub(super) fn hints( range: param_list.syntax().text_range(), kind: InlayKind::ClosureReturnType, label: label_of_ty(famous_defs, config, ty)?, + text_edit: None, }); Some(()) } diff --git a/crates/ide/src/inlay_hints/discriminant.rs b/crates/ide/src/inlay_hints/discriminant.rs index 67eaa553ada..f9047efaf1a 100644 --- a/crates/ide/src/inlay_hints/discriminant.rs +++ b/crates/ide/src/inlay_hints/discriminant.rs @@ -75,6 +75,7 @@ fn variant_hints( })), None, ), + text_edit: None, }); Some(()) diff --git a/crates/ide/src/inlay_hints/fn_lifetime_fn.rs b/crates/ide/src/inlay_hints/fn_lifetime_fn.rs index b7182085b31..34eb5eb94c4 100644 --- a/crates/ide/src/inlay_hints/fn_lifetime_fn.rs +++ b/crates/ide/src/inlay_hints/fn_lifetime_fn.rs @@ -25,6 +25,7 @@ pub(super) fn hints( range: t.text_range(), kind: InlayKind::Lifetime, label: label.into(), + text_edit: None, }; let param_list = func.param_list()?; @@ -189,12 +190,14 @@ pub(super) fn hints( if is_empty { "" } else { ", " } ) .into(), + text_edit: None, }); } (None, allocated_lifetimes) => acc.push(InlayHint { range: func.name()?.syntax().text_range(), kind: InlayKind::GenericParamList, label: format!("<{}>", allocated_lifetimes.iter().format(", "),).into(), + text_edit: None, }), } Some(()) diff --git a/crates/ide/src/inlay_hints/implicit_static.rs b/crates/ide/src/inlay_hints/implicit_static.rs index 1122ee2e392..ba875649f79 100644 --- a/crates/ide/src/inlay_hints/implicit_static.rs +++ b/crates/ide/src/inlay_hints/implicit_static.rs @@ -34,6 +34,7 @@ pub(super) fn hints( range: t.text_range(), kind: InlayKind::Lifetime, label: "'static".to_owned().into(), + text_edit: None, }); } } diff --git a/crates/ide/src/inlay_hints/param_name.rs b/crates/ide/src/inlay_hints/param_name.rs index 9cdae632410..9729a43c220 100644 --- a/crates/ide/src/inlay_hints/param_name.rs +++ b/crates/ide/src/inlay_hints/param_name.rs @@ -57,6 +57,7 @@ pub(super) fn hints( range, kind: InlayKind::Parameter, label: InlayHintLabel::simple(param_name, None, linked_location), + text_edit: None, } }); diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs index 2b9dfecceff..cc72c2e10b5 100644 --- a/crates/rust-analyzer/src/to_proto.rs +++ b/crates/rust-analyzer/src/to_proto.rs @@ -510,7 +510,7 @@ pub(crate) fn inlay_hint( | InlayKind::AdjustmentPostfix | InlayKind::ClosingBrace => None, }, - text_edits: None, + text_edits: inlay_hint.text_edit.map(|it| text_edit_vec(line_index, it)), data: None, tooltip, label,