diff options
| author | Jeroen Vannevel <jer_vannevel@outlook.com> | 2022-02-01 00:36:50 +0000 |
|---|---|---|
| committer | Jeroen Vannevel <jer_vannevel@outlook.com> | 2022-02-01 00:36:50 +0000 |
| commit | 51c50dd5acd34fac006406a6fc24f51a624e208e (patch) | |
| tree | d27cfe4badb3f07750b96092f0ac8751b378d369 | |
| parent | e72ed9230a06d5bf89fe5ca465b9d1377a53fc3e (diff) | |
| download | rust-51c50dd5acd34fac006406a6fc24f51a624e208e.tar.gz rust-51c50dd5acd34fac006406a6fc24f51a624e208e.zip | |
don't tear body
| -rw-r--r-- | crates/ide_assists/src/handlers/extract_function.rs | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/crates/ide_assists/src/handlers/extract_function.rs b/crates/ide_assists/src/handlers/extract_function.rs index 640c3554096..afe0b221e50 100644 --- a/crates/ide_assists/src/handlers/extract_function.rs +++ b/crates/ide_assists/src/handlers/extract_function.rs @@ -482,8 +482,11 @@ impl FunctionBody { let full_body = parent.syntax().children_with_tokens(); let mut text_range = full_body - .map(|stmt| stmt.text_range()) - .filter(|&stmt| selected.intersect(stmt).filter(|it| !it.is_empty()).is_some()) + .filter(|it| { + matches!(it.kind().is_punct() || it.kind() == SyntaxKind::WHITESPACE, false) + }) + .map(|element| element.text_range()) + .filter(|&range| selected.intersect(range).filter(|it| !it.is_empty()).is_some()) .reduce(|acc, stmt| acc.cover(stmt)); if let Some(tail_range) = parent @@ -4127,6 +4130,27 @@ fn $0fun_name() { } #[test] + fn extract_does_not_tear_body_apart() { + check_assist( + extract_function, + r#" +fn foo() { + $0foo(); +}$0 +"#, + r#" +fn foo() { + fun_name(); +} + +fn $0fun_name() { + foo(); +} +"#, + ); + } + + #[test] fn extract_does_not_wrap_res_in_res() { check_assist( extract_function, |
