|
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