diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-02-17 01:24:25 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-02-17 01:24:25 +0000 |
commit | b3c848ee286ddb643fb2d857060cd618a7dc25a7 (patch) | |
tree | e8873ede9e5579085b59dfa716d23438b3f54efc /crates/ide | |
parent | 94f56ebccf2e558c178d2d73161fe78803b6f3e2 (diff) | |
parent | e0eb80eaee9451fa91e16333f31e5b049179b483 (diff) |
Merge #7703
7703: Allow comments between newlines in chaining hints r=Veykril a=unratito
Currently, chaining hints are not generated if there are comments between newlines, which is a very common pattern:
```rust
let vec = (0..10)
// Multiply by 2
.map(|x| x * 2)
// Add 3
.map(|x| x + 3)
.collect::<Vec<i32>>();
```
Besides, it seems a bit weird that this piece of code generates a chaining hint:
```rust
let vec = (0..10)
.collect::<Vec<i32>>();
```
But this one doesn't:
```rust
let vec = (0..10)
// This is a comment
.collect::<Vec<i32>>();
```
Co-authored-by: Paco SoberĂ³n <[email protected]>
Diffstat (limited to 'crates/ide')
-rw-r--r-- | crates/ide/src/inlay_hints.rs | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/crates/ide/src/inlay_hints.rs b/crates/ide/src/inlay_hints.rs index 42d0a38e8..4ceb20742 100644 --- a/crates/ide/src/inlay_hints.rs +++ b/crates/ide/src/inlay_hints.rs | |||
@@ -109,26 +109,31 @@ fn get_chaining_hints( | |||
109 | // Chaining can be defined as an expression whose next sibling tokens are newline and dot | 109 | // Chaining can be defined as an expression whose next sibling tokens are newline and dot |
110 | // Ignoring extra whitespace and comments | 110 | // Ignoring extra whitespace and comments |
111 | let next = tokens.next()?.kind(); | 111 | let next = tokens.next()?.kind(); |
112 | let next_next = tokens.next()?.kind(); | 112 | if next == SyntaxKind::WHITESPACE { |
113 | if next == SyntaxKind::WHITESPACE && next_next == T![.] { | 113 | let mut next_next = tokens.next()?.kind(); |
114 | let ty = sema.type_of_expr(&expr)?; | 114 | while next_next == SyntaxKind::WHITESPACE { |
115 | if ty.is_unknown() { | 115 | next_next = tokens.next()?.kind(); |
116 | return None; | ||
117 | } | 116 | } |
118 | if matches!(expr, ast::Expr::PathExpr(_)) { | 117 | if next_next == T![.] { |
119 | if let Some(hir::Adt::Struct(st)) = ty.as_adt() { | 118 | let ty = sema.type_of_expr(&expr)?; |
120 | if st.fields(sema.db).is_empty() { | 119 | if ty.is_unknown() { |
121 | return None; | 120 | return None; |
121 | } | ||
122 | if matches!(expr, ast::Expr::PathExpr(_)) { | ||
123 | if let Some(hir::Adt::Struct(st)) = ty.as_adt() { | ||
124 | if st.fields(sema.db).is_empty() { | ||
125 | return None; | ||
126 | } | ||
122 | } | 127 | } |
123 | } | 128 | } |
129 | acc.push(InlayHint { | ||
130 | range: expr.syntax().text_range(), | ||
131 | kind: InlayKind::ChainingHint, | ||
132 | label: hint_iterator(sema, &famous_defs, config, &ty).unwrap_or_else(|| { | ||
133 | ty.display_truncated(sema.db, config.max_length).to_string().into() | ||
134 | }), | ||
135 | }); | ||
124 | } | 136 | } |
125 | acc.push(InlayHint { | ||
126 | range: expr.syntax().text_range(), | ||
127 | kind: InlayKind::ChainingHint, | ||
128 | label: hint_iterator(sema, &famous_defs, config, &ty).unwrap_or_else(|| { | ||
129 | ty.display_truncated(sema.db, config.max_length).to_string().into() | ||
130 | }), | ||
131 | }); | ||
132 | } | 137 | } |
133 | Some(()) | 138 | Some(()) |
134 | } | 139 | } |
@@ -983,6 +988,7 @@ struct C; | |||
983 | fn main() { | 988 | fn main() { |
984 | let c = A(B(C)) | 989 | let c = A(B(C)) |
985 | .into_b() // This is a comment | 990 | .into_b() // This is a comment |
991 | // This is another comment | ||
986 | .into_c(); | 992 | .into_c(); |
987 | } | 993 | } |
988 | "#, | 994 | "#, |