aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rwxr-xr-x[-rw-r--r--]crates/ide/src/folding_ranges.rs45
-rw-r--r--crates/rust-analyzer/src/to_proto.rs1
2 files changed, 46 insertions, 0 deletions
diff --git a/crates/ide/src/folding_ranges.rs b/crates/ide/src/folding_ranges.rs
index 2b9ed123c..a03988778 100644..100755
--- a/crates/ide/src/folding_ranges.rs
+++ b/crates/ide/src/folding_ranges.rs
@@ -20,6 +20,7 @@ pub enum FoldKind {
20 Consts, 20 Consts,
21 Statics, 21 Statics,
22 Array, 22 Array,
23 WhereClause,
23} 24}
24 25
25#[derive(Debug)] 26#[derive(Debug)]
@@ -109,6 +110,13 @@ pub(crate) fn folding_ranges(file: &SourceFile) -> Vec<Fold> {
109 res.push(Fold { range, kind: FoldKind::Statics }) 110 res.push(Fold { range, kind: FoldKind::Statics })
110 } 111 }
111 } 112 }
113
114 // Fold where clause
115 if node.kind() == WHERE_CLAUSE {
116 if let Some(range) = fold_range_for_where_clause(&node) {
117 res.push(Fold { range, kind: FoldKind::WhereClause })
118 }
119 }
112 } 120 }
113 } 121 }
114 } 122 }
@@ -241,6 +249,23 @@ fn contiguous_range_for_comment(
241 } 249 }
242} 250}
243 251
252fn fold_range_for_where_clause(node: &SyntaxNode) -> Option<TextRange> {
253 let first_where_pred = node.first_child();
254 let last_where_pred = node.last_child();
255
256 if first_where_pred != last_where_pred {
257 let mut it = node.descendants_with_tokens();
258 if let (Some(_where_clause), Some(where_kw), Some(last_comma)) =
259 (it.next(), it.next(), it.last())
260 {
261 let start = where_kw.text_range().end();
262 let end = last_comma.text_range().end();
263 return Some(TextRange::new(start, end));
264 }
265 }
266 None
267}
268
244#[cfg(test)] 269#[cfg(test)]
245mod tests { 270mod tests {
246 use test_utils::extract_tags; 271 use test_utils::extract_tags;
@@ -272,6 +297,7 @@ mod tests {
272 FoldKind::Consts => "consts", 297 FoldKind::Consts => "consts",
273 FoldKind::Statics => "statics", 298 FoldKind::Statics => "statics",
274 FoldKind::Array => "array", 299 FoldKind::Array => "array",
300 FoldKind::WhereClause => "whereclause",
275 }; 301 };
276 assert_eq!(kind, &attr.unwrap()); 302 assert_eq!(kind, &attr.unwrap());
277 } 303 }
@@ -513,4 +539,23 @@ static SECOND_STATIC: &str = "second";</fold>
513 "#, 539 "#,
514 ) 540 )
515 } 541 }
542
543 #[test]
544 fn fold_where_clause() {
545 // fold multi-line and don't fold single line.
546 check(
547 r#"
548fn foo()
549where<fold whereclause>
550 A: Foo,
551 B: Foo,
552 C: Foo,
553 D: Foo,</fold> {}
554
555fn bar()
556where
557 A: Bar, {}
558"#,
559 )
560 }
516} 561}
diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs
index 1d27aa7b3..ecf6fd12f 100644
--- a/crates/rust-analyzer/src/to_proto.rs
+++ b/crates/rust-analyzer/src/to_proto.rs
@@ -524,6 +524,7 @@ pub(crate) fn folding_range(
524 | FoldKind::ArgList 524 | FoldKind::ArgList
525 | FoldKind::Consts 525 | FoldKind::Consts
526 | FoldKind::Statics 526 | FoldKind::Statics
527 | FoldKind::WhereClause
527 | FoldKind::Array => None, 528 | FoldKind::Array => None,
528 }; 529 };
529 530