|
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; |
5 |
| -use ide_db::famous_defs::FamousDefs; |
| 4 | +use hir::{DisplayTarget, HirDisplay}; |
| 5 | +use ide_db::{famous_defs::FamousDefs, text_edit::TextEdit}; |
6 | 6 | use syntax::ast::{self, AstNode};
|
7 | 7 |
|
8 | 8 | use crate::{
|
@@ -62,7 +62,28 @@ pub(super) fn hints(
|
62 | 62 | if arrow.is_none() { " -> " } else { "" },
|
63 | 63 | )
|
64 | 64 | } else {
|
65 |
| - None |
| 65 | + let body = closure.body()?; |
| 66 | + let body_range = body.syntax().text_range(); |
| 67 | + |
| 68 | + Some(config.lazy_text_edit(|| { |
| 69 | + let mut builder = TextEdit::builder(); |
| 70 | + let insert_pos = param_list.syntax().text_range().end(); |
| 71 | + |
| 72 | + let rendered = match sema.scope(closure.syntax()).and_then(|scope| { |
| 73 | + ty.display_source_code(scope.db, scope.module().into(), false).ok() |
| 74 | + }) { |
| 75 | + Some(rendered) => rendered, |
| 76 | + None => return TextEdit::builder().finish(), |
| 77 | + }; |
| 78 | + |
| 79 | + let arrow_text = if arrow.is_none() { " -> ".to_owned() } else { "".to_owned() }; |
| 80 | + builder.insert(insert_pos, arrow_text); |
| 81 | + builder.insert(insert_pos, rendered); |
| 82 | + builder.insert(body_range.start(), "{ ".to_owned()); |
| 83 | + builder.insert(body_range.end(), " }".to_owned()); |
| 84 | + |
| 85 | + builder.finish() |
| 86 | + })) |
66 | 87 | };
|
67 | 88 |
|
68 | 89 | acc.push(InlayHint {
|
|
0 commit comments