aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-10-27 08:26:46 +0000
committerAleksey Kladov <[email protected]>2019-10-27 08:26:46 +0000
commita490ba06fa635ecb34b5ce0b7205621eefaee603 (patch)
tree3793da47dbe724189842cabeb5a7cef91ad592ef
parent85984b09e182adca4b03d9f7efab20d48b5b632a (diff)
document some more assists
-rw-r--r--crates/ra_assists/src/assists/merge_match_arms.rs26
-rw-r--r--crates/ra_assists/src/assists/move_bounds.rs17
-rw-r--r--crates/ra_assists/src/assists/move_guard.rs52
-rw-r--r--crates/ra_assists/src/doc_tests/generated.rs97
-rw-r--r--docs/user/assists.md93
-rw-r--r--docs/user/features.md84
6 files changed, 279 insertions, 90 deletions
diff --git a/crates/ra_assists/src/assists/merge_match_arms.rs b/crates/ra_assists/src/assists/merge_match_arms.rs
index 17baa98f9..f5ddd7159 100644
--- a/crates/ra_assists/src/assists/merge_match_arms.rs
+++ b/crates/ra_assists/src/assists/merge_match_arms.rs
@@ -1,9 +1,31 @@
1//! FIXME: write short doc here
2
3use crate::{Assist, AssistCtx, AssistId, TextRange, TextUnit}; 1use crate::{Assist, AssistCtx, AssistId, TextRange, TextUnit};
4use hir::db::HirDatabase; 2use hir::db::HirDatabase;
5use ra_syntax::ast::{AstNode, MatchArm}; 3use ra_syntax::ast::{AstNode, MatchArm};
6 4
5// Assist: merge_match_arms
6//
7// Merges identical match arms.
8//
9// ```
10// enum Action { Move { distance: u32 }, Stop }
11//
12// fn handle(action: Action) {
13// match action {
14// <|>Action::Move(..) => foo(),
15// Action::Stop => foo(),
16// }
17// }
18// ```
19// ->
20// ```
21// enum Action { Move { distance: u32 }, Stop }
22//
23// fn handle(action: Action) {
24// match action {
25// Action::Move(..) | Action::Stop => foo(),
26// }
27// }
28// ```
7pub(crate) fn merge_match_arms(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> { 29pub(crate) fn merge_match_arms(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
8 let current_arm = ctx.node_at_offset::<MatchArm>()?; 30 let current_arm = ctx.node_at_offset::<MatchArm>()?;
9 31
diff --git a/crates/ra_assists/src/assists/move_bounds.rs b/crates/ra_assists/src/assists/move_bounds.rs
index d2444b6b9..f96e19a9f 100644
--- a/crates/ra_assists/src/assists/move_bounds.rs
+++ b/crates/ra_assists/src/assists/move_bounds.rs
@@ -1,5 +1,3 @@
1//! FIXME: write short doc here
2
3use hir::db::HirDatabase; 1use hir::db::HirDatabase;
4use ra_syntax::{ 2use ra_syntax::{
5 ast::{self, edit, make, AstNode, NameOwner, TypeBoundsOwner}, 3 ast::{self, edit, make, AstNode, NameOwner, TypeBoundsOwner},
@@ -9,6 +7,21 @@ use ra_syntax::{
9 7
10use crate::{Assist, AssistCtx, AssistId}; 8use crate::{Assist, AssistCtx, AssistId};
11 9
10// Assist: move_bounds_to_where_clause
11//
12// Moves inline type bounds to a where clause.
13//
14// ```
15// fn apply<T, U, <|>F: FnOnce(T) -> U>(f: F, x: T) -> U {
16// f(x)
17// }
18// ```
19// ->
20// ```
21// fn apply<T, U, F>(f: F, x: T) -> U where F: FnOnce(T) -> U {
22// f(x)
23// }
24// ```
12pub(crate) fn move_bounds_to_where_clause(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> { 25pub(crate) fn move_bounds_to_where_clause(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
13 let type_param_list = ctx.node_at_offset::<ast::TypeParamList>()?; 26 let type_param_list = ctx.node_at_offset::<ast::TypeParamList>()?;
14 27
diff --git a/crates/ra_assists/src/assists/move_guard.rs b/crates/ra_assists/src/assists/move_guard.rs
index 51aea6334..36c95128d 100644
--- a/crates/ra_assists/src/assists/move_guard.rs
+++ b/crates/ra_assists/src/assists/move_guard.rs
@@ -1,5 +1,3 @@
1//! FIXME: write short doc here
2
3use hir::db::HirDatabase; 1use hir::db::HirDatabase;
4use ra_syntax::{ 2use ra_syntax::{
5 ast, 3 ast,
@@ -9,6 +7,31 @@ use ra_syntax::{
9 7
10use crate::{Assist, AssistCtx, AssistId}; 8use crate::{Assist, AssistCtx, AssistId};
11 9
10// Assist: move_guard_to_arm_body
11//
12// Moves match guard into match arm body.
13//
14// ```
15// enum Action { Move { distance: u32 }, Stop }
16//
17// fn handle(action: Action) {
18// match action {
19// Action::Move { distance } <|>if distance > 10 => foo(),
20// _ => (),
21// }
22// }
23// ```
24// ->
25// ```
26// enum Action { Move { distance: u32 }, Stop }
27//
28// fn handle(action: Action) {
29// match action {
30// Action::Move { distance } => if distance > 10 { foo() },
31// _ => (),
32// }
33// }
34// ```
12pub(crate) fn move_guard_to_arm_body(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> { 35pub(crate) fn move_guard_to_arm_body(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
13 let match_arm = ctx.node_at_offset::<MatchArm>()?; 36 let match_arm = ctx.node_at_offset::<MatchArm>()?;
14 let guard = match_arm.guard()?; 37 let guard = match_arm.guard()?;
@@ -42,6 +65,31 @@ pub(crate) fn move_guard_to_arm_body(mut ctx: AssistCtx<impl HirDatabase>) -> Op
42 ctx.build() 65 ctx.build()
43} 66}
44 67
68// Assist: move_arm_cond_to_match_guard
69//
70// Moves if expression from match arm body into a guard.
71//
72// ```
73// enum Action { Move { distance: u32 }, Stop }
74//
75// fn handle(action: Action) {
76// match action {
77// Action::Move { distance } => <|>if distance > 10 { foo() },
78// _ => (),
79// }
80// }
81// ```
82// ->
83// ```
84// enum Action { Move { distance: u32 }, Stop }
85//
86// fn handle(action: Action) {
87// match action {
88// Action::Move { distance } if distance > 10 => foo(),
89// _ => (),
90// }
91// }
92// ```
45pub(crate) fn move_arm_cond_to_match_guard(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> { 93pub(crate) fn move_arm_cond_to_match_guard(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist> {
46 let match_arm: MatchArm = ctx.node_at_offset::<MatchArm>()?; 94 let match_arm: MatchArm = ctx.node_at_offset::<MatchArm>()?;
47 let last_match_pat = match_arm.pats().last()?; 95 let last_match_pat = match_arm.pats().last()?;
diff --git a/crates/ra_assists/src/doc_tests/generated.rs b/crates/ra_assists/src/doc_tests/generated.rs
index b96d5772e..09677af68 100644
--- a/crates/ra_assists/src/doc_tests/generated.rs
+++ b/crates/ra_assists/src/doc_tests/generated.rs
@@ -273,3 +273,100 @@ fn main() {
273"#####, 273"#####,
274 ) 274 )
275} 275}
276
277#[test]
278fn doctest_merge_match_arms() {
279 check(
280 "merge_match_arms",
281 r#####"
282enum Action { Move { distance: u32 }, Stop }
283
284fn handle(action: Action) {
285 match action {
286 <|>Action::Move(..) => foo(),
287 Action::Stop => foo(),
288 }
289}
290"#####,
291 r#####"
292enum Action { Move { distance: u32 }, Stop }
293
294fn handle(action: Action) {
295 match action {
296 Action::Move(..) | Action::Stop => foo(),
297 }
298}
299"#####,
300 )
301}
302
303#[test]
304fn doctest_move_arm_cond_to_match_guard() {
305 check(
306 "move_arm_cond_to_match_guard",
307 r#####"
308enum Action { Move { distance: u32 }, Stop }
309
310fn handle(action: Action) {
311 match action {
312 Action::Move { distance } => <|>if distance > 10 { foo() },
313 _ => (),
314 }
315}
316"#####,
317 r#####"
318enum Action { Move { distance: u32 }, Stop }
319
320fn handle(action: Action) {
321 match action {
322 Action::Move { distance } if distance > 10 => foo(),
323 _ => (),
324 }
325}
326"#####,
327 )
328}
329
330#[test]
331fn doctest_move_bounds_to_where_clause() {
332 check(
333 "move_bounds_to_where_clause",
334 r#####"
335fn apply<T, U, <|>F: FnOnce(T) -> U>(f: F, x: T) -> U {
336 f(x)
337}
338"#####,
339 r#####"
340fn apply<T, U, F>(f: F, x: T) -> U where F: FnOnce(T) -> U {
341 f(x)
342}
343"#####,
344 )
345}
346
347#[test]
348fn doctest_move_guard_to_arm_body() {
349 check(
350 "move_guard_to_arm_body",
351 r#####"
352enum Action { Move { distance: u32 }, Stop }
353
354fn handle(action: Action) {
355 match action {
356 Action::Move { distance } <|>if distance > 10 => foo(),
357 _ => (),
358 }
359}
360"#####,
361 r#####"
362enum Action { Move { distance: u32 }, Stop }
363
364fn handle(action: Action) {
365 match action {
366 Action::Move { distance } => if distance > 10 { foo() },
367 _ => (),
368 }
369}
370"#####,
371 )
372}
diff --git a/docs/user/assists.md b/docs/user/assists.md
index ee1cfa142..34a95696c 100644
--- a/docs/user/assists.md
+++ b/docs/user/assists.md
@@ -265,3 +265,96 @@ fn main() {
265 var_name * 4; 265 var_name * 4;
266} 266}
267``` 267```
268
269## `merge_match_arms`
270
271Merges identical match arms.
272
273```rust
274// BEFORE
275enum Action { Move { distance: u32 }, Stop }
276
277fn handle(action: Action) {
278 match action {
279 ┃Action::Move(..) => foo(),
280 Action::Stop => foo(),
281 }
282}
283
284// AFTER
285enum Action { Move { distance: u32 }, Stop }
286
287fn handle(action: Action) {
288 match action {
289 Action::Move(..) | Action::Stop => foo(),
290 }
291}
292```
293
294## `move_arm_cond_to_match_guard`
295
296Moves if expression from match arm body into a guard.
297
298```rust
299// BEFORE
300enum Action { Move { distance: u32 }, Stop }
301
302fn handle(action: Action) {
303 match action {
304 Action::Move { distance } => ┃if distance > 10 { foo() },
305 _ => (),
306 }
307}
308
309// AFTER
310enum Action { Move { distance: u32 }, Stop }
311
312fn handle(action: Action) {
313 match action {
314 Action::Move { distance } if distance > 10 => foo(),
315 _ => (),
316 }
317}
318```
319
320## `move_bounds_to_where_clause`
321
322Moves inline type bounds to a where clause.
323
324```rust
325// BEFORE
326fn apply<T, U, ┃F: FnOnce(T) -> U>(f: F, x: T) -> U {
327 f(x)
328}
329
330// AFTER
331fn apply<T, U, F>(f: F, x: T) -> U where F: FnOnce(T) -> U {
332 f(x)
333}
334```
335
336## `move_guard_to_arm_body`
337
338Moves match guard into match arm body.
339
340```rust
341// BEFORE
342enum Action { Move { distance: u32 }, Stop }
343
344fn handle(action: Action) {
345 match action {
346 Action::Move { distance } ┃if distance > 10 => foo(),
347 _ => (),
348 }
349}
350
351// AFTER
352enum Action { Move { distance: u32 }, Stop }
353
354fn handle(action: Action) {
355 match action {
356 Action::Move { distance } => if distance > 10 { foo() },
357 _ => (),
358 }
359}
360```
diff --git a/docs/user/features.md b/docs/user/features.md
index 39dab710d..2e213e34c 100644
--- a/docs/user/features.md
+++ b/docs/user/features.md
@@ -154,45 +154,6 @@ fn main() {
154} 154}
155``` 155```
156 156
157- Flip `,`
158
159```rust
160// before:
161fn foo(x: usize,<|> dim: (usize, usize)) {}
162// after:
163fn foo(dim: (usize, usize), x: usize) {}
164```
165
166- Introduce variable:
167
168```rust
169// before:
170fn foo() {
171 foo(<|>1 + 1<|>);
172}
173
174// after:
175fn foo() {
176 let var_name = 1 + 1;
177 foo(var_name);
178}
179```
180
181- Inline local variable:
182
183```rust
184// before:
185fn foo() {
186 let a<|> = 1 + 1;
187 let b = a * 10;
188}
189
190// after:
191fn foo() {
192 let b = (1 + 1) * 10;
193}
194```
195
196- Remove `dbg!` 157- Remove `dbg!`
197 158
198```rust 159```rust
@@ -245,41 +206,6 @@ use crate:<|>:db::{RootDatabase, FileSymbol};
245use crate::{<|>db::{RootDatabase, FileSymbol}}; 206use crate::{<|>db::{RootDatabase, FileSymbol}};
246``` 207```
247 208
248- Flip binary expression
249
250```rust
251// before:
252fn foo() {
253 if 1 <<|> 2 {
254 println!("Who would have thought?");
255 }
256}
257// after:
258fn foo() {
259 if 2 ><|> 1 {
260 println!("Who would have thought?");
261 }
262}
263```
264
265- Move guard expression to match arm body
266```rust
267// before:
268fn f() {
269 match x {
270 <|>y @ 4 | y @ 5 if y > 5 => true,
271 _ => false
272 }
273}
274// after:
275fn f() {
276 match x {
277 y @ 4 | y @ 5 => if y > 5 { <|>true },
278 _ => false
279 }
280}
281```
282
283- Move if condition to match arm guard 209- Move if condition to match arm guard
284```rust 210```rust
285// before: 211// before:
@@ -309,16 +235,6 @@ fn f() {
309} 235}
310``` 236```
311 237
312- Move type bounds to where clause
313
314```rust
315// before:
316fn foo<T: u32, F: FnOnce(T) -> T>() {}
317
318// after:
319fn foo<T, F>() where T: u32, F: FnOnce(T) -> T {}
320```
321
322- Make raw string unescaped 238- Make raw string unescaped
323 239
324```rust 240```rust