|
1 | 1 | //! Implementation of "closure return type" inlay hints. |
2 | 2 | //! |
3 | 3 | //! Tests live in [`bind_pat`][super::bind_pat] module. |
4 | | -use hir::{DisplayTarget, HirDisplay}; |
5 | | -use ide_db::{famous_defs::FamousDefs, text_edit::TextEdit}; |
| 4 | +use hir::DisplayTarget; |
| 5 | +use ide_db::{famous_defs::FamousDefs, text_edit::TextEditBuilder}; |
6 | 6 | use syntax::ast::{self, AstNode}; |
7 | 7 |
|
8 | 8 | use crate::{ |
@@ -49,45 +49,30 @@ pub(super) fn hints( |
49 | 49 | if arrow.is_none() { |
50 | 50 | label.prepend_str(" -> "); |
51 | 51 | } |
52 | | - let text_edit = if has_block_body { |
53 | | - ty_to_text_edit( |
54 | | - sema, |
55 | | - config, |
56 | | - descended_closure.syntax(), |
57 | | - &ty, |
58 | | - arrow |
59 | | - .as_ref() |
60 | | - .map_or_else(|| param_list.syntax().text_range(), |t| t.text_range()) |
61 | | - .end(), |
62 | | - if arrow.is_none() { " -> " } else { "" }, |
63 | | - ) |
64 | | - } else { |
65 | | - Some(config.lazy_text_edit(|| { |
66 | | - let body = closure.body(); |
67 | | - let body_range = match body { |
68 | | - Some(body) => body.syntax().text_range(), |
69 | | - None => return TextEdit::builder().finish(), |
70 | | - }; |
71 | | - let mut builder = TextEdit::builder(); |
72 | | - let insert_pos = param_list.syntax().text_range().end(); |
73 | 52 |
|
74 | | - let rendered = match sema.scope(descended_closure.syntax()).and_then(|scope| { |
75 | | - ty.display_source_code(scope.db, scope.module().into(), false).ok() |
76 | | - }) { |
77 | | - Some(rendered) => rendered, |
78 | | - None => return TextEdit::builder().finish(), |
79 | | - }; |
| 53 | + let offset_to_insert_ty = |
| 54 | + arrow.as_ref().map_or_else(|| param_list.syntax().text_range(), |t| t.text_range()).end(); |
80 | 55 |
|
81 | | - let arrow_text = if arrow.is_none() { " -> ".to_owned() } else { "".to_owned() }; |
82 | | - builder.insert(insert_pos, arrow_text); |
83 | | - builder.insert(insert_pos, rendered); |
84 | | - builder.insert(body_range.start(), "{ ".to_owned()); |
85 | | - builder.insert(body_range.end(), " }".to_owned()); |
86 | | - |
87 | | - builder.finish() |
88 | | - })) |
| 56 | + // Insert braces if necessary |
| 57 | + let insert_braces = |builder: &mut TextEditBuilder| { |
| 58 | + if !has_block_body { |
| 59 | + if let Some(range) = closure.body().map(|b| b.syntax().text_range()) { |
| 60 | + builder.insert(range.start(), "{ ".to_owned()); |
| 61 | + builder.insert(range.end(), " }".to_owned()); |
| 62 | + } |
| 63 | + } |
89 | 64 | }; |
90 | 65 |
|
| 66 | + let text_edit = ty_to_text_edit( |
| 67 | + sema, |
| 68 | + config, |
| 69 | + descended_closure.syntax(), |
| 70 | + &ty, |
| 71 | + offset_to_insert_ty, |
| 72 | + &insert_braces, |
| 73 | + if arrow.is_none() { " -> " } else { "" }, |
| 74 | + ); |
| 75 | + |
91 | 76 | acc.push(InlayHint { |
92 | 77 | range: param_list.syntax().text_range(), |
93 | 78 | kind: InlayKind::Type, |
|
0 commit comments