diff options
Diffstat (limited to 'crates/ra_ide_api/src/folding_ranges.rs')
-rw-r--r-- | crates/ra_ide_api/src/folding_ranges.rs | 48 |
1 files changed, 24 insertions, 24 deletions
diff --git a/crates/ra_ide_api/src/folding_ranges.rs b/crates/ra_ide_api/src/folding_ranges.rs index 9d4855a64..c2b981aed 100644 --- a/crates/ra_ide_api/src/folding_ranges.rs +++ b/crates/ra_ide_api/src/folding_ranges.rs | |||
@@ -30,7 +30,7 @@ pub(crate) fn folding_ranges(file: &SourceFile) -> Vec<Fold> { | |||
30 | for element in file.syntax().descendants_with_tokens() { | 30 | for element in file.syntax().descendants_with_tokens() { |
31 | // Fold items that span multiple lines | 31 | // Fold items that span multiple lines |
32 | if let Some(kind) = fold_kind(element.kind()) { | 32 | if let Some(kind) = fold_kind(element.kind()) { |
33 | let is_multiline = match element { | 33 | let is_multiline = match &element { |
34 | SyntaxElement::Node(node) => node.text().contains('\n'), | 34 | SyntaxElement::Node(node) => node.text().contains('\n'), |
35 | SyntaxElement::Token(token) => token.text().contains('\n'), | 35 | SyntaxElement::Token(token) => token.text().contains('\n'), |
36 | }; | 36 | }; |
@@ -56,7 +56,7 @@ pub(crate) fn folding_ranges(file: &SourceFile) -> Vec<Fold> { | |||
56 | SyntaxElement::Node(node) => { | 56 | SyntaxElement::Node(node) => { |
57 | // Fold groups of imports | 57 | // Fold groups of imports |
58 | if node.kind() == USE_ITEM && !visited_imports.contains(&node) { | 58 | if node.kind() == USE_ITEM && !visited_imports.contains(&node) { |
59 | if let Some(range) = contiguous_range_for_group(node, &mut visited_imports) { | 59 | if let Some(range) = contiguous_range_for_group(&node, &mut visited_imports) { |
60 | res.push(Fold { range, kind: FoldKind::Imports }) | 60 | res.push(Fold { range, kind: FoldKind::Imports }) |
61 | } | 61 | } |
62 | } | 62 | } |
@@ -65,7 +65,7 @@ pub(crate) fn folding_ranges(file: &SourceFile) -> Vec<Fold> { | |||
65 | if node.kind() == MODULE && !has_visibility(&node) && !visited_mods.contains(&node) | 65 | if node.kind() == MODULE && !has_visibility(&node) && !visited_mods.contains(&node) |
66 | { | 66 | { |
67 | if let Some(range) = | 67 | if let Some(range) = |
68 | contiguous_range_for_group_unless(node, has_visibility, &mut visited_mods) | 68 | contiguous_range_for_group_unless(&node, has_visibility, &mut visited_mods) |
69 | { | 69 | { |
70 | res.push(Fold { range, kind: FoldKind::Mods }) | 70 | res.push(Fold { range, kind: FoldKind::Mods }) |
71 | } | 71 | } |
@@ -88,24 +88,24 @@ fn fold_kind(kind: SyntaxKind) -> Option<FoldKind> { | |||
88 | } | 88 | } |
89 | 89 | ||
90 | fn has_visibility(node: &SyntaxNode) -> bool { | 90 | fn has_visibility(node: &SyntaxNode) -> bool { |
91 | ast::Module::cast(node).and_then(|m| m.visibility()).is_some() | 91 | ast::Module::cast(node.clone()).and_then(|m| m.visibility()).is_some() |
92 | } | 92 | } |
93 | 93 | ||
94 | fn contiguous_range_for_group<'a>( | 94 | fn contiguous_range_for_group( |
95 | first: &'a SyntaxNode, | 95 | first: &SyntaxNode, |
96 | visited: &mut FxHashSet<&'a SyntaxNode>, | 96 | visited: &mut FxHashSet<SyntaxNode>, |
97 | ) -> Option<TextRange> { | 97 | ) -> Option<TextRange> { |
98 | contiguous_range_for_group_unless(first, |_| false, visited) | 98 | contiguous_range_for_group_unless(first, |_| false, visited) |
99 | } | 99 | } |
100 | 100 | ||
101 | fn contiguous_range_for_group_unless<'a>( | 101 | fn contiguous_range_for_group_unless( |
102 | first: &'a SyntaxNode, | 102 | first: &SyntaxNode, |
103 | unless: impl Fn(&'a SyntaxNode) -> bool, | 103 | unless: impl Fn(&SyntaxNode) -> bool, |
104 | visited: &mut FxHashSet<&'a SyntaxNode>, | 104 | visited: &mut FxHashSet<SyntaxNode>, |
105 | ) -> Option<TextRange> { | 105 | ) -> Option<TextRange> { |
106 | visited.insert(first); | 106 | visited.insert(first.clone()); |
107 | 107 | ||
108 | let mut last = first; | 108 | let mut last = first.clone(); |
109 | for element in first.siblings_with_tokens(Direction::Next) { | 109 | for element in first.siblings_with_tokens(Direction::Next) { |
110 | let node = match element { | 110 | let node = match element { |
111 | SyntaxElement::Token(token) => { | 111 | SyntaxElement::Token(token) => { |
@@ -123,15 +123,15 @@ fn contiguous_range_for_group_unless<'a>( | |||
123 | }; | 123 | }; |
124 | 124 | ||
125 | // Stop if we find a node that doesn't belong to the group | 125 | // Stop if we find a node that doesn't belong to the group |
126 | if node.kind() != first.kind() || unless(node) { | 126 | if node.kind() != first.kind() || unless(&node) { |
127 | break; | 127 | break; |
128 | } | 128 | } |
129 | 129 | ||
130 | visited.insert(node); | 130 | visited.insert(node.clone()); |
131 | last = node; | 131 | last = node; |
132 | } | 132 | } |
133 | 133 | ||
134 | if first != last { | 134 | if first != &last { |
135 | Some(TextRange::from_to(first.range().start(), last.range().end())) | 135 | Some(TextRange::from_to(first.range().start(), last.range().end())) |
136 | } else { | 136 | } else { |
137 | // The group consists of only one element, therefore it cannot be folded | 137 | // The group consists of only one element, therefore it cannot be folded |
@@ -139,11 +139,11 @@ fn contiguous_range_for_group_unless<'a>( | |||
139 | } | 139 | } |
140 | } | 140 | } |
141 | 141 | ||
142 | fn contiguous_range_for_comment<'a>( | 142 | fn contiguous_range_for_comment( |
143 | first: ast::Comment<'a>, | 143 | first: ast::Comment, |
144 | visited: &mut FxHashSet<ast::Comment<'a>>, | 144 | visited: &mut FxHashSet<ast::Comment>, |
145 | ) -> Option<TextRange> { | 145 | ) -> Option<TextRange> { |
146 | visited.insert(first); | 146 | visited.insert(first.clone()); |
147 | 147 | ||
148 | // Only fold comments of the same flavor | 148 | // Only fold comments of the same flavor |
149 | let group_kind = first.kind(); | 149 | let group_kind = first.kind(); |
@@ -151,11 +151,11 @@ fn contiguous_range_for_comment<'a>( | |||
151 | return None; | 151 | return None; |
152 | } | 152 | } |
153 | 153 | ||
154 | let mut last = first; | 154 | let mut last = first.clone(); |
155 | for element in first.syntax().siblings_with_tokens(Direction::Next) { | 155 | for element in first.syntax().siblings_with_tokens(Direction::Next) { |
156 | match element { | 156 | match element { |
157 | SyntaxElement::Token(token) => { | 157 | SyntaxElement::Token(token) => { |
158 | if let Some(ws) = ast::Whitespace::cast(token) { | 158 | if let Some(ws) = ast::Whitespace::cast(token.clone()) { |
159 | if !ws.spans_multiple_lines() { | 159 | if !ws.spans_multiple_lines() { |
160 | // Ignore whitespace without blank lines | 160 | // Ignore whitespace without blank lines |
161 | continue; | 161 | continue; |
@@ -163,7 +163,7 @@ fn contiguous_range_for_comment<'a>( | |||
163 | } | 163 | } |
164 | if let Some(c) = ast::Comment::cast(token) { | 164 | if let Some(c) = ast::Comment::cast(token) { |
165 | if c.kind() == group_kind { | 165 | if c.kind() == group_kind { |
166 | visited.insert(c); | 166 | visited.insert(c.clone()); |
167 | last = c; | 167 | last = c; |
168 | continue; | 168 | continue; |
169 | } | 169 | } |
@@ -193,7 +193,7 @@ mod tests { | |||
193 | fn do_check(text: &str, fold_kinds: &[FoldKind]) { | 193 | fn do_check(text: &str, fold_kinds: &[FoldKind]) { |
194 | let (ranges, text) = extract_ranges(text, "fold"); | 194 | let (ranges, text) = extract_ranges(text, "fold"); |
195 | let parse = SourceFile::parse(&text); | 195 | let parse = SourceFile::parse(&text); |
196 | let folds = folding_ranges(parse.tree()); | 196 | let folds = folding_ranges(&parse.tree()); |
197 | 197 | ||
198 | assert_eq!( | 198 | assert_eq!( |
199 | folds.len(), | 199 | folds.len(), |