Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/inlay_hints.rs')
-rw-r--r--crates/ide/src/inlay_hints.rs32
1 files changed, 23 insertions, 9 deletions
diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs
index bd37ab8896..a7cb1a599f 100644
--- a/crates/ide/src/inlay_hints.rs
+++ b/crates/ide/src/inlay_hints.rs
@@ -19,7 +19,7 @@ pub struct InlayHintsConfig {
pub type_hints: bool,
pub parameter_hints: bool,
pub chaining_hints: bool,
- pub reborrow_hints: bool,
+ pub reborrow_hints: ReborrowHints,
pub closure_return_type_hints: bool,
pub lifetime_elision_hints: LifetimeElisionHints,
pub param_names_for_lifetime_elision_hints: bool,
@@ -35,6 +35,13 @@ pub enum LifetimeElisionHints {
}
#[derive(Clone, Debug, PartialEq, Eq)]
+pub enum ReborrowHints {
+ Always,
+ MutableOnly,
+ Never,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq)]
pub enum InlayKind {
ChainingHint,
ClosureReturnTypeHint,
@@ -372,18 +379,20 @@ fn reborrow_hints(
config: &InlayHintsConfig,
expr: &ast::Expr,
) -> Option<()> {
- if !config.reborrow_hints {
+ if config.reborrow_hints == ReborrowHints::Never {
return None;
}
let mutability = sema.is_implicit_reborrow(expr)?;
+ let label = match mutability {
+ hir::Mutability::Shared if config.reborrow_hints != ReborrowHints::MutableOnly => "&*",
+ hir::Mutability::Mut => "&mut *",
+ _ => return None,
+ };
acc.push(InlayHint {
range: expr.syntax().text_range(),
kind: InlayKind::ImplicitReborrow,
- label: match mutability {
- hir::Mutability::Shared => SmolStr::new_inline("&*"),
- hir::Mutability::Mut => SmolStr::new_inline("&mut *"),
- },
+ label: SmolStr::new_inline(label),
});
Some(())
}
@@ -848,6 +857,7 @@ mod tests {
use syntax::{TextRange, TextSize};
use test_utils::extract_annotations;
+ use crate::inlay_hints::ReborrowHints;
use crate::{fixture, inlay_hints::InlayHintsConfig, LifetimeElisionHints};
const DISABLED_CONFIG: InlayHintsConfig = InlayHintsConfig {
@@ -858,7 +868,7 @@ mod tests {
lifetime_elision_hints: LifetimeElisionHints::Never,
hide_named_constructor_hints: false,
closure_return_type_hints: false,
- reborrow_hints: false,
+ reborrow_hints: ReborrowHints::Always,
param_names_for_lifetime_elision_hints: false,
max_length: None,
};
@@ -866,7 +876,7 @@ mod tests {
type_hints: true,
parameter_hints: true,
chaining_hints: true,
- reborrow_hints: true,
+ reborrow_hints: ReborrowHints::Always,
closure_return_type_hints: true,
lifetime_elision_hints: LifetimeElisionHints::Always,
..DISABLED_CONFIG
@@ -2146,7 +2156,11 @@ impl () {
#[test]
fn hints_implicit_reborrow() {
check_with_config(
- InlayHintsConfig { reborrow_hints: true, parameter_hints: true, ..DISABLED_CONFIG },
+ InlayHintsConfig {
+ reborrow_hints: ReborrowHints::Always,
+ parameter_hints: true,
+ ..DISABLED_CONFIG
+ },
r#"
fn __() {
let unique = &mut ();