diff options
Diffstat (limited to 'crates/ra_ide_api/src/join_lines.rs')
-rw-r--r-- | crates/ra_ide_api/src/join_lines.rs | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/crates/ra_ide_api/src/join_lines.rs b/crates/ra_ide_api/src/join_lines.rs index e20cb1370..50bcfb5b7 100644 --- a/crates/ra_ide_api/src/join_lines.rs +++ b/crates/ra_ide_api/src/join_lines.rs | |||
@@ -27,7 +27,7 @@ pub fn join_lines(file: &SourceFile, range: TextRange) -> TextEdit { | |||
27 | SyntaxElement::Token(token) => token.parent(), | 27 | SyntaxElement::Token(token) => token.parent(), |
28 | }; | 28 | }; |
29 | let mut edit = TextEditBuilder::default(); | 29 | let mut edit = TextEditBuilder::default(); |
30 | for token in node.descendants_with_tokens().filter_map(|it| it.as_token()) { | 30 | for token in node.descendants_with_tokens().filter_map(|it| it.as_token().cloned()) { |
31 | let range = match range.intersection(&token.range()) { | 31 | let range = match range.intersection(&token.range()) { |
32 | Some(range) => range, | 32 | Some(range) => range, |
33 | None => continue, | 33 | None => continue, |
@@ -37,7 +37,7 @@ pub fn join_lines(file: &SourceFile, range: TextRange) -> TextEdit { | |||
37 | let pos: TextUnit = (pos as u32).into(); | 37 | let pos: TextUnit = (pos as u32).into(); |
38 | let off = token.range().start() + range.start() + pos; | 38 | let off = token.range().start() + range.start() + pos; |
39 | if !edit.invalidates_offset(off) { | 39 | if !edit.invalidates_offset(off) { |
40 | remove_newline(&mut edit, token, off); | 40 | remove_newline(&mut edit, &token, off); |
41 | } | 41 | } |
42 | } | 42 | } |
43 | } | 43 | } |
@@ -45,7 +45,7 @@ pub fn join_lines(file: &SourceFile, range: TextRange) -> TextEdit { | |||
45 | edit.finish() | 45 | edit.finish() |
46 | } | 46 | } |
47 | 47 | ||
48 | fn remove_newline(edit: &mut TextEditBuilder, token: SyntaxToken, offset: TextUnit) { | 48 | fn remove_newline(edit: &mut TextEditBuilder, token: &SyntaxToken, offset: TextUnit) { |
49 | if token.kind() != WHITESPACE || token.text().bytes().filter(|&b| b == b'\n').count() != 1 { | 49 | if token.kind() != WHITESPACE || token.text().bytes().filter(|&b| b == b'\n').count() != 1 { |
50 | // The node is either the first or the last in the file | 50 | // The node is either the first or the last in the file |
51 | let suff = &token.text()[TextRange::from_to( | 51 | let suff = &token.text()[TextRange::from_to( |
@@ -98,9 +98,10 @@ fn remove_newline(edit: &mut TextEditBuilder, token: SyntaxToken, offset: TextUn | |||
98 | TextRange::from_to(prev.range().start(), token.range().end()), | 98 | TextRange::from_to(prev.range().start(), token.range().end()), |
99 | space.to_string(), | 99 | space.to_string(), |
100 | ); | 100 | ); |
101 | } else if let (Some(_), Some(next)) = | 101 | } else if let (Some(_), Some(next)) = ( |
102 | (prev.as_token().and_then(ast::Comment::cast), next.as_token().and_then(ast::Comment::cast)) | 102 | prev.as_token().cloned().and_then(ast::Comment::cast), |
103 | { | 103 | next.as_token().cloned().and_then(ast::Comment::cast), |
104 | ) { | ||
104 | // Removes: newline (incl. surrounding whitespace), start of the next comment | 105 | // Removes: newline (incl. surrounding whitespace), start of the next comment |
105 | edit.delete(TextRange::from_to( | 106 | edit.delete(TextRange::from_to( |
106 | token.range().start(), | 107 | token.range().start(), |
@@ -113,16 +114,16 @@ fn remove_newline(edit: &mut TextEditBuilder, token: SyntaxToken, offset: TextUn | |||
113 | } | 114 | } |
114 | 115 | ||
115 | fn has_comma_after(node: &SyntaxNode) -> bool { | 116 | fn has_comma_after(node: &SyntaxNode) -> bool { |
116 | match non_trivia_sibling(node.into(), Direction::Next) { | 117 | match non_trivia_sibling(node.clone().into(), Direction::Next) { |
117 | Some(n) => n.kind() == T![,], | 118 | Some(n) => n.kind() == T![,], |
118 | _ => false, | 119 | _ => false, |
119 | } | 120 | } |
120 | } | 121 | } |
121 | 122 | ||
122 | fn join_single_expr_block(edit: &mut TextEditBuilder, token: SyntaxToken) -> Option<()> { | 123 | fn join_single_expr_block(edit: &mut TextEditBuilder, token: &SyntaxToken) -> Option<()> { |
123 | let block = ast::Block::cast(token.parent())?; | 124 | let block = ast::Block::cast(token.parent())?; |
124 | let block_expr = ast::BlockExpr::cast(block.syntax().parent()?)?; | 125 | let block_expr = ast::BlockExpr::cast(block.syntax().parent()?)?; |
125 | let expr = extract_trivial_expression(block)?; | 126 | let expr = extract_trivial_expression(&block)?; |
126 | 127 | ||
127 | let block_range = block_expr.syntax().range(); | 128 | let block_range = block_expr.syntax().range(); |
128 | let mut buf = expr.syntax().text().to_string(); | 129 | let mut buf = expr.syntax().text().to_string(); |
@@ -139,7 +140,7 @@ fn join_single_expr_block(edit: &mut TextEditBuilder, token: SyntaxToken) -> Opt | |||
139 | Some(()) | 140 | Some(()) |
140 | } | 141 | } |
141 | 142 | ||
142 | fn join_single_use_tree(edit: &mut TextEditBuilder, token: SyntaxToken) -> Option<()> { | 143 | fn join_single_use_tree(edit: &mut TextEditBuilder, token: &SyntaxToken) -> Option<()> { |
143 | let use_tree_list = ast::UseTreeList::cast(token.parent())?; | 144 | let use_tree_list = ast::UseTreeList::cast(token.parent())?; |
144 | let (tree,) = use_tree_list.use_trees().collect_tuple()?; | 145 | let (tree,) = use_tree_list.use_trees().collect_tuple()?; |
145 | edit.replace(use_tree_list.syntax().range(), tree.syntax().text().to_string()); | 146 | edit.replace(use_tree_list.syntax().range(), tree.syntax().text().to_string()); |
@@ -504,7 +505,7 @@ fn foo() { | |||
504 | fn check_join_lines_sel(before: &str, after: &str) { | 505 | fn check_join_lines_sel(before: &str, after: &str) { |
505 | let (sel, before) = extract_range(before); | 506 | let (sel, before) = extract_range(before); |
506 | let parse = SourceFile::parse(&before); | 507 | let parse = SourceFile::parse(&before); |
507 | let result = join_lines(parse.tree(), sel); | 508 | let result = join_lines(&parse.tree(), sel); |
508 | let actual = result.apply(&before); | 509 | let actual = result.apply(&before); |
509 | assert_eq_text!(after, &actual); | 510 | assert_eq_text!(after, &actual); |
510 | } | 511 | } |