From f7c7f89c3cfb5c1d8d9fc136561e96e3d9572fe4 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sat, 31 Jul 2021 15:24:21 +0200 Subject: [PATCH] Annotate type hints for pattern name ranges instead of the pattern itself --- crates/ide/src/inlay_hints.rs | 38 +++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs index 5efdc4f3eccf..8c533d641b22 100644 --- a/crates/ide/src/inlay_hints.rs +++ b/crates/ide/src/inlay_hints.rs @@ -194,8 +194,12 @@ fn get_bind_pat_hints( if should_not_display_type_hint(sema, &pat, &ty) { return None; } + acc.push(InlayHint { - range: pat.syntax().text_range(), + range: match pat.name() { + Some(name) => name.syntax().text_range(), + None => pat.syntax().text_range(), + }, kind: InlayKind::TypeHint, label: hint_iterator(sema, &famous_defs, config, &ty) .unwrap_or_else(|| ty.display_truncated(sema.db, config.max_length).to_string().into()), @@ -799,6 +803,28 @@ fn main() { ); } + #[test] + fn type_hints_bindings_after_at() { + check_types( + r#" +//- minicore: option +fn main() { + let ref foo @ bar @ ref mut baz = 0; + //^^^ &i32 + //^^^ i32 + //^^^ &mut i32 + let [x @ ..] = [0]; + //^ [i32; 1] + if let x @ Some(_) = Some(0) {} + //^ Option + let foo @ (bar, baz) = (3, 3); + //^^^ (i32, i32) + //^^^ i32 + //^^^ i32 +}"#, + ); + } + #[test] fn default_generic_types_should_not_be_displayed() { check( @@ -839,7 +865,7 @@ impl Iterator for SomeIter { fn main() { let mut some_iter = SomeIter::new(); - //^^^^^^^^^^^^^ SomeIter>> + //^^^^^^^^^ SomeIter>> some_iter.push(iter::repeat(2).take(2)); let iter_of_iters = some_iter.take(2); //^^^^^^^^^^^^^ impl Iterator> @@ -938,7 +964,7 @@ fn main() { //^^^^ i32 let test: i32 = 33; let mut test = 33; - //^^^^^^^^ i32 + //^^^^ i32 let _ = 22; let test = "test"; //^^^^ &str @@ -1048,7 +1074,7 @@ impl IntoIterator for Vec { fn main() { let mut data = Vec::new(); - //^^^^^^^^ Vec<&str> + //^^^^ Vec<&str> data.push("foo"); for i in @@ -1076,7 +1102,7 @@ impl IntoIterator for Vec { fn main() { let mut data = Vec::new(); - //^^^^^^^^ Vec<&str> + //^^^^ Vec<&str> data.push("foo"); for i in data { //^ &str @@ -1153,7 +1179,7 @@ fn main() { r#" fn main() { let mut start = 0; - //^^^^^^^^^ i32 + //^^^^^ i32 (0..2).for_each(|increment| { start += increment; }); //^^^^^^^^^ i32