@@ -143,7 +143,7 @@ fn hover_text_from_name_kind(db: &RootDatabase, def: Definition) -> Option<Strin
143143 ModuleDef :: TypeAlias ( it) => from_def_source ( db, it, mod_path) ,
144144 ModuleDef :: BuiltinType ( it) => Some ( it. to_string ( ) ) ,
145145 } ,
146- Definition :: Local ( it) => Some ( rust_code_markup ( & it. ty ( db) . display_truncated ( db, None ) ) ) ,
146+ Definition :: Local ( it) => Some ( rust_code_markup ( & it. ty ( db) . display ( db) ) ) ,
147147 Definition :: TypeParam ( _) | Definition :: SelfType ( _) => {
148148 // FIXME: Hover for generic param
149149 None
@@ -279,6 +279,47 @@ mod tests {
279279 assert_eq ! ( trim_markup_opt( hover. info. first( ) ) , Some ( "u32" ) ) ;
280280 }
281281
282+ #[ test]
283+ fn hover_shows_long_type_of_an_expression ( ) {
284+ check_hover_result (
285+ r#"
286+ //- /main.rs
287+ struct Scan<A, B, C> {
288+ a: A,
289+ b: B,
290+ c: C,
291+ }
292+
293+ struct FakeIter<I> {
294+ inner: I,
295+ }
296+
297+ struct OtherStruct<T> {
298+ i: T,
299+ }
300+
301+ enum FakeOption<T> {
302+ Some(T),
303+ None,
304+ }
305+
306+ fn scan<A, B, C>(a: A, b: B, c: C) -> FakeIter<Scan<OtherStruct<A>, B, C>> {
307+ FakeIter { inner: Scan { a, b, c } }
308+ }
309+
310+ fn main() {
311+ let num: i32 = 55;
312+ let closure = |memo: &mut u32, value: &u32, _another: &mut u32| -> FakeOption<u32> {
313+ FakeOption::Some(*memo + value)
314+ };
315+ let number = 5u32;
316+ let mut iter<|> = scan(OtherStruct { i: num }, closure, number);
317+ }
318+ "# ,
319+ & [ "FakeIter<Scan<OtherStruct<OtherStruct<i32>>, |&mut u32, &u32, &mut u32| -> FakeOption<u32>, u32>>" ] ,
320+ ) ;
321+ }
322+
282323 #[ test]
283324 fn hover_shows_fn_signature ( ) {
284325 // Single file with result
0 commit comments