From 23b040962ff299feeef1f967bc2d5ba92b01c2bc Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 20 Dec 2018 22:13:16 +0300 Subject: [PATCH] fold curly blocks --- crates/ra_editor/src/folding_ranges.rs | 40 ++++++++++++------- .../ra_lsp_server/src/main_loop/handlers.rs | 7 ++-- crates/test_utils/src/lib.rs | 1 + 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/crates/ra_editor/src/folding_ranges.rs b/crates/ra_editor/src/folding_ranges.rs index a4add8702c..da542ecf08 100644 --- a/crates/ra_editor/src/folding_ranges.rs +++ b/crates/ra_editor/src/folding_ranges.rs @@ -10,6 +10,7 @@ use ra_syntax::{ pub enum FoldKind { Comment, Imports, + Block, } #[derive(Debug)] @@ -62,6 +63,8 @@ fn fold_kind(kind: SyntaxKind) -> Option { match kind { COMMENT => Some(FoldKind::Comment), USE_ITEM => Some(FoldKind::Imports), + NAMED_FIELD_DEF_LIST | FIELD_PAT_LIST | ITEM_LIST | EXTERN_ITEM_LIST | USE_TREE_LIST + | BLOCK | ENUM_VARIANT_LIST => Some(FoldKind::Block), _ => None, } } @@ -205,7 +208,7 @@ mod tests { // But this is not -fn main() { +fn main() { // We should // also // fold @@ -214,10 +217,11 @@ fn main() { //! because it has another flavor /* As does this multiline comment */ -}"#; +}"#; let fold_kinds = &[ FoldKind::Comment, + FoldKind::Block, FoldKind::Comment, FoldKind::Comment, FoldKind::Comment, @@ -228,16 +232,16 @@ fn main() { #[test] fn test_fold_imports() { let text = r#" -use std::{ +use std::{ str, vec, io as iop -}; +}; -fn main() { -}"#; +fn main() { +}"#; - let folds = &[FoldKind::Imports]; + let folds = &[FoldKind::Imports, FoldKind::Block, FoldKind::Block]; do_check(text, folds); } @@ -255,10 +259,10 @@ use std::collections::HashMap; // Some random comment use std::collections::VecDeque; -fn main() { -}"#; +fn main() { +}"#; - let folds = &[FoldKind::Imports, FoldKind::Imports]; + let folds = &[FoldKind::Imports, FoldKind::Imports, FoldKind::Block]; do_check(text, folds); } @@ -272,16 +276,22 @@ use std::io as iop; use std::mem; use std::f64; -use std::collections::{ +use std::collections::{ HashMap, VecDeque, -}; +}; // Some random comment -fn main() { -}"#; +fn main() { +}"#; - let folds = &[FoldKind::Imports, FoldKind::Imports, FoldKind::Imports]; + let folds = &[ + FoldKind::Imports, + FoldKind::Imports, + FoldKind::Imports, + FoldKind::Block, + FoldKind::Block, + ]; do_check(text, folds); } diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs index 572ae7fb53..801966304c 100644 --- a/crates/ra_lsp_server/src/main_loop/handlers.rs +++ b/crates/ra_lsp_server/src/main_loop/handlers.rs @@ -446,8 +446,9 @@ pub fn handle_folding_range( .into_iter() .map(|fold| { let kind = match fold.kind { - FoldKind::Comment => FoldingRangeKind::Comment, - FoldKind::Imports => FoldingRangeKind::Imports, + FoldKind::Comment => Some(FoldingRangeKind::Comment), + FoldKind::Imports => Some(FoldingRangeKind::Imports), + FoldKind::Block => None, }; let range = fold.range.conv_with(&line_index); FoldingRange { @@ -455,7 +456,7 @@ pub fn handle_folding_range( start_character: Some(range.start.character), end_line: range.end.line, end_character: Some(range.start.character), - kind: Some(kind), + kind, } }) .collect(), diff --git a/crates/test_utils/src/lib.rs b/crates/test_utils/src/lib.rs index 894a22769b..1ae800d7cc 100644 --- a/crates/test_utils/src/lib.rs +++ b/crates/test_utils/src/lib.rs @@ -98,6 +98,7 @@ pub fn extract_ranges(mut text: &str, tag: &str) -> (Vec, String) { } } assert!(stack.is_empty(), "unmatched <{}>", tag); + ranges.sort_by_key(|r| (r.start(), r.end())); (ranges, res) }