aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-02-17 01:24:25 +0000
committerGitHub <[email protected]>2021-02-17 01:24:25 +0000
commitb3c848ee286ddb643fb2d857060cd618a7dc25a7 (patch)
treee8873ede9e5579085b59dfa716d23438b3f54efc /crates
parent94f56ebccf2e558c178d2d73161fe78803b6f3e2 (diff)
parente0eb80eaee9451fa91e16333f31e5b049179b483 (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')
-rw-r--r--crates/ide/src/inlay_hints.rs38
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;
983fn main() { 988fn 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"#,