rust/docs/user/generated_assists.adoc

974 lines
12 KiB
Plaintext
Raw Normal View History

[discrete]
=== `add_custom_impl`
Adds impl block for derived trait.
.Before
```rust
#[derive(Deb┃ug, Display)]
struct S;
```
.After
```rust
#[derive(Display)]
struct S;
impl Debug for S {
2020-05-17 07:21:24 -05:00
$0
}
```
[discrete]
=== `add_derive`
2019-10-25 15:38:15 -05:00
Adds a new `#[derive()]` clause to a struct or enum.
.Before
2019-10-25 15:38:15 -05:00
```rust
struct Point {
x: u32,
2019-10-26 13:17:39 -05:00
y: u32,┃
2019-10-25 15:38:15 -05:00
}
```
2019-10-25 15:38:15 -05:00
.After
```rust
2020-05-17 07:21:24 -05:00
#[derive($0)]
2019-10-25 15:38:15 -05:00
struct Point {
x: u32,
y: u32,
}
```
[discrete]
=== `add_explicit_type`
2019-10-25 15:38:15 -05:00
2019-10-26 11:08:13 -05:00
Specify type for a let binding.
2019-10-25 15:38:15 -05:00
.Before
2019-10-25 15:38:15 -05:00
```rust
fn main() {
2019-10-26 13:17:39 -05:00
let x┃ = 92;
2019-10-25 15:38:15 -05:00
}
```
2019-10-25 15:38:15 -05:00
.After
```rust
2019-10-25 15:38:15 -05:00
fn main() {
let x: i32 = 92;
}
```
[discrete]
=== `add_from_impl_for_enum`
Adds a From impl for an enum variant with one tuple field.
.Before
```rust
enum A { ┃One(u32) }
```
.After
```rust
enum A { One(u32) }
impl From<u32> for A {
fn from(v: u32) -> Self {
A::One(v)
}
}
```
[discrete]
=== `add_function`
2020-03-26 14:59:35 -05:00
Adds a stub function with a signature matching the function under the cursor.
.Before
2020-03-26 14:59:35 -05:00
```rust
struct Baz;
fn baz() -> Baz { Baz }
fn foo() {
bar┃("", baz());
2020-03-26 14:59:35 -05:00
}
```
2020-03-26 14:59:35 -05:00
.After
```rust
2020-03-26 14:59:35 -05:00
struct Baz;
fn baz() -> Baz { Baz }
fn foo() {
bar("", baz());
2020-03-26 14:59:35 -05:00
}
fn bar(arg: &str, baz: Baz) {
2020-05-19 15:25:07 -05:00
${0:todo!()}
2020-03-26 14:59:35 -05:00
}
```
[discrete]
=== `add_hash`
2019-10-27 04:22:53 -05:00
Adds a hash to a raw string literal.
.Before
2019-10-27 04:22:53 -05:00
```rust
fn main() {
r#"Hello,┃ World!"#;
}
```
2019-10-27 04:22:53 -05:00
.After
```rust
2019-10-27 04:22:53 -05:00
fn main() {
r##"Hello, World!"##;
}
```
[discrete]
=== `add_impl`
2019-10-25 15:38:15 -05:00
2019-10-26 11:08:13 -05:00
Adds a new inherent impl for a type.
2019-10-25 15:38:15 -05:00
.Before
2019-10-25 15:38:15 -05:00
```rust
struct Ctx<T: Clone> {
2020-05-17 07:21:24 -05:00
data: T,┃
2019-10-25 15:38:15 -05:00
}
```
2019-10-25 15:38:15 -05:00
.After
```rust
2019-10-25 15:38:15 -05:00
struct Ctx<T: Clone> {
2020-05-17 07:21:24 -05:00
data: T,
2019-10-25 15:38:15 -05:00
}
impl<T: Clone> Ctx<T> {
2020-05-17 07:21:24 -05:00
$0
2019-10-25 15:38:15 -05:00
}
```
[discrete]
=== `add_impl_default_members`
2019-10-25 15:38:15 -05:00
2019-10-26 11:08:13 -05:00
Adds scaffold for overriding default impl members.
2019-10-25 15:38:15 -05:00
.Before
2019-10-25 15:38:15 -05:00
```rust
trait Trait {
2019-10-25 15:38:15 -05:00
Type X;
fn foo(&self);
fn bar(&self) {}
}
impl Trait for () {
2019-10-25 15:38:15 -05:00
Type X = ();
2019-10-26 13:17:39 -05:00
fn foo(&self) {}┃
2019-10-25 15:38:15 -05:00
}
```
2019-10-25 15:38:15 -05:00
.After
```rust
trait Trait {
2019-10-25 15:38:15 -05:00
Type X;
fn foo(&self);
fn bar(&self) {}
}
impl Trait for () {
2019-10-25 15:38:15 -05:00
Type X = ();
fn foo(&self) {}
2020-05-19 18:53:21 -05:00
$0fn bar(&self) {}
2019-10-25 15:38:15 -05:00
}
```
[discrete]
=== `add_impl_missing_members`
2019-10-25 15:38:15 -05:00
2019-10-26 11:08:13 -05:00
Adds scaffold for required impl members.
2019-10-25 15:38:15 -05:00
.Before
2019-10-25 15:38:15 -05:00
```rust
trait Trait<T> {
2019-10-25 15:38:15 -05:00
Type X;
fn foo(&self) -> T;
2019-10-25 15:38:15 -05:00
fn bar(&self) {}
}
impl Trait<u32> for () {┃
2019-10-25 15:38:15 -05:00
}
```
2019-10-25 15:38:15 -05:00
.After
```rust
trait Trait<T> {
2019-10-25 15:38:15 -05:00
Type X;
fn foo(&self) -> T;
2019-10-25 15:38:15 -05:00
fn bar(&self) {}
}
impl Trait<u32> for () {
fn foo(&self) -> u32 {
${0:todo!()}
}
2019-10-25 15:38:15 -05:00
}
```
[discrete]
=== `add_new`
Adds a new inherent impl for a type.
.Before
```rust
struct Ctx<T: Clone> {
data: T,┃
}
```
.After
```rust
struct Ctx<T: Clone> {
data: T,
}
impl<T: Clone> Ctx<T> {
2020-05-20 03:17:46 -05:00
fn $0new(data: T) -> Self { Self { data } }
}
```
[discrete]
=== `add_turbo_fish`
2020-05-19 17:07:00 -05:00
Adds `::<_>` to a call of a generic method or function.
.Before
2020-05-19 17:07:00 -05:00
```rust
fn make<T>() -> T { todo!() }
fn main() {
let x = make┃();
}
```
2020-05-19 17:07:00 -05:00
.After
```rust
2020-05-19 17:07:00 -05:00
fn make<T>() -> T { todo!() }
fn main() {
let x = make::<${0:_}>();
}
```
[discrete]
=== `apply_demorgan`
2019-10-25 15:38:15 -05:00
Apply [De Morgan's law](https://en.wikipedia.org/wiki/De_Morgan%27s_laws).
This transforms expressions of the form `!l || !r` into `!(l && r)`.
This also works with `&&`. This assist can only be applied with the cursor
on either `||` or `&&`, with both operands being a negation of some kind.
This means something of the form `!x` or `x != y`.
.Before
2019-10-25 15:38:15 -05:00
```rust
fn main() {
2019-10-26 13:17:39 -05:00
if x != 4 ||┃ !y {}
2019-10-25 15:38:15 -05:00
}
```
2019-10-25 15:38:15 -05:00
.After
```rust
2019-10-25 15:38:15 -05:00
fn main() {
if !(x == 4 && y) {}
}
```
[discrete]
=== `auto_import`
If the name is unresolved, provides all possible imports for it.
.Before
```rust
fn main() {
let map = HashMap┃::new();
}
```
.After
```rust
use std::collections::HashMap;
fn main() {
2020-02-06 11:10:25 -06:00
let map = HashMap::new();
}
```
[discrete]
=== `change_lifetime_anon_to_named`
2020-05-22 09:25:55 -05:00
Change an anonymous lifetime to a named lifetime.
.Before
2020-05-22 09:25:55 -05:00
```rust
impl Cursor<'_┃> {
fn node(self) -> &SyntaxNode {
match self {
Cursor::Replace(node) | Cursor::Before(node) => node,
}
}
}
```
2020-05-22 09:25:55 -05:00
.After
```rust
2020-05-22 09:25:55 -05:00
impl<'a> Cursor<'a> {
fn node(self) -> &SyntaxNode {
match self {
Cursor::Replace(node) | Cursor::Before(node) => node,
}
}
}
```
[discrete]
=== `change_return_type_to_result`
Change the function's return type to Result.
.Before
```rust
fn foo() -> i32┃ { 42i32 }
```
.After
```rust
fn foo() -> Result<i32, ${0:_}> { Ok(42i32) }
```
[discrete]
=== `change_visibility`
2019-10-26 09:37:04 -05:00
Adds or changes existing visibility specifier.
.Before
2019-10-26 09:37:04 -05:00
```rust
2019-10-26 13:17:39 -05:00
┃fn frobnicate() {}
```
2019-10-26 09:37:04 -05:00
.After
```rust
2019-10-26 09:37:04 -05:00
pub(crate) fn frobnicate() {}
```
[discrete]
=== `convert_to_guarded_return`
2019-10-25 06:16:46 -05:00
Replace a large conditional with a guarded return.
.Before
2019-10-25 06:16:46 -05:00
```rust
fn main() {
2019-10-26 13:17:39 -05:00
┃if cond {
2019-10-25 06:16:46 -05:00
foo();
bar();
}
}
```
2019-10-25 06:16:46 -05:00
.After
```rust
2019-10-25 06:16:46 -05:00
fn main() {
if !cond {
return;
}
foo();
bar();
}
```
2019-10-26 09:37:04 -05:00
[discrete]
=== `fill_match_arms`
2019-10-26 09:37:04 -05:00
Adds missing clauses to a `match` expression.
.Before
2019-10-26 09:37:04 -05:00
```rust
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
2019-10-26 13:17:39 -05:00
2019-10-26 09:37:04 -05:00
}
}
```
2019-10-26 09:37:04 -05:00
.After
```rust
2019-10-26 09:37:04 -05:00
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
2020-05-20 07:00:37 -05:00
$0Action::Move { distance } => {}
2020-03-24 06:45:07 -05:00
Action::Stop => {}
2019-10-26 09:37:04 -05:00
}
}
```
2019-10-26 11:08:13 -05:00
[discrete]
=== `fix_visibility`
Makes inaccessible item public.
.Before
```rust
mod m {
fn frobnicate() {}
}
fn main() {
m::frobnicate┃() {}
}
```
.After
```rust
mod m {
2020-05-20 07:13:17 -05:00
$0pub(crate) fn frobnicate() {}
}
fn main() {
m::frobnicate() {}
}
```
[discrete]
=== `flip_binexpr`
2019-10-26 11:08:13 -05:00
Flips operands of a binary expression.
.Before
2019-10-26 11:08:13 -05:00
```rust
fn main() {
2019-10-26 13:17:39 -05:00
let _ = 90 +┃ 2;
2019-10-26 11:08:13 -05:00
}
```
2019-10-26 11:08:13 -05:00
.After
```rust
2019-10-26 11:08:13 -05:00
fn main() {
let _ = 2 + 90;
}
```
[discrete]
=== `flip_comma`
2019-10-26 11:08:13 -05:00
Flips two comma-separated items.
.Before
2019-10-26 11:08:13 -05:00
```rust
fn main() {
2019-10-26 13:17:39 -05:00
((1, 2),┃ (3, 4));
2019-10-26 11:08:13 -05:00
}
```
2019-10-26 11:08:13 -05:00
.After
```rust
2019-10-26 11:08:13 -05:00
fn main() {
((3, 4), (1, 2));
}
```
[discrete]
=== `flip_trait_bound`
Flips two trait bounds.
.Before
```rust
fn foo<T: Clone +┃ Copy>() { }
```
.After
```rust
fn foo<T: Copy + Clone>() { }
```
[discrete]
=== `inline_local_variable`
2019-10-26 11:08:13 -05:00
Inlines local variable.
.Before
2019-10-26 11:08:13 -05:00
```rust
fn main() {
2019-10-26 13:17:39 -05:00
let x┃ = 1 + 2;
2019-10-26 11:08:13 -05:00
x * 4;
}
```
2019-10-26 11:08:13 -05:00
.After
```rust
2019-10-26 11:08:13 -05:00
fn main() {
(1 + 2) * 4;
}
```
2019-10-26 11:58:18 -05:00
[discrete]
=== `introduce_variable`
2019-10-26 11:58:18 -05:00
Extracts subexpression into a variable.
.Before
2019-10-26 11:58:18 -05:00
```rust
fn main() {
2019-10-26 13:17:39 -05:00
┃(1 + 2)┃ * 4;
2019-10-26 11:58:18 -05:00
}
```
2019-10-26 11:58:18 -05:00
.After
```rust
2019-10-26 11:58:18 -05:00
fn main() {
2020-05-20 16:07:17 -05:00
let $0var_name = (1 + 2);
2019-10-26 11:58:18 -05:00
var_name * 4;
}
```
2019-10-27 03:26:46 -05:00
[discrete]
=== `invert_if`
2019-11-21 12:51:40 -06:00
Apply invert_if
This transforms if expressions of the form `if !x {A} else {B}` into `if x {B} else {A}`
This also works with `!=`. This assist can only be applied with the cursor
on `if`.
.Before
2019-11-21 12:51:40 -06:00
```rust
fn main() {
2019-11-23 23:14:57 -06:00
if┃ !y { A } else { B }
2019-11-21 12:51:40 -06:00
}
```
2019-11-21 12:51:40 -06:00
.After
```rust
2019-11-21 12:51:40 -06:00
fn main() {
2019-11-23 23:14:57 -06:00
if y { B } else { A }
2019-11-21 12:51:40 -06:00
}
```
[discrete]
=== `make_raw_string`
2019-10-27 04:22:53 -05:00
Adds `r#` to a plain string literal.
.Before
2019-10-27 04:22:53 -05:00
```rust
fn main() {
"Hello,┃ World!";
}
```
2019-10-27 04:22:53 -05:00
.After
```rust
2019-10-27 04:22:53 -05:00
fn main() {
r#"Hello, World!"#;
}
```
[discrete]
=== `make_usual_string`
2019-10-27 04:22:53 -05:00
Turns a raw string into a plain string.
.Before
2019-10-27 04:22:53 -05:00
```rust
fn main() {
r#"Hello,┃ "World!""#;
}
```
2019-10-27 04:22:53 -05:00
.After
```rust
2019-10-27 04:22:53 -05:00
fn main() {
"Hello, \"World!\"";
}
```
[discrete]
=== `merge_imports`
Merges two imports with a common prefix.
.Before
```rust
use std::┃fmt::Formatter;
use std::io;
```
.After
```rust
use std::{fmt::Formatter, io};
```
[discrete]
=== `merge_match_arms`
2019-10-27 03:26:46 -05:00
Merges identical match arms.
.Before
2019-10-27 03:26:46 -05:00
```rust
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
┃Action::Move(..) => foo(),
Action::Stop => foo(),
}
}
```
2019-10-27 03:26:46 -05:00
.After
```rust
2019-10-27 03:26:46 -05:00
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move(..) | Action::Stop => foo(),
}
}
```
[discrete]
=== `move_arm_cond_to_match_guard`
2019-10-27 03:26:46 -05:00
Moves if expression from match arm body into a guard.
.Before
2019-10-27 03:26:46 -05:00
```rust
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move { distance } => ┃if distance > 10 { foo() },
_ => (),
}
}
```
2019-10-27 03:26:46 -05:00
.After
```rust
2019-10-27 03:26:46 -05:00
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move { distance } if distance > 10 => foo(),
_ => (),
}
}
```
[discrete]
=== `move_bounds_to_where_clause`
2019-10-27 03:26:46 -05:00
Moves inline type bounds to a where clause.
.Before
2019-10-27 03:26:46 -05:00
```rust
fn apply<T, U, ┃F: FnOnce(T) -> U>(f: F, x: T) -> U {
f(x)
}
```
2019-10-27 03:26:46 -05:00
.After
```rust
2019-10-27 03:26:46 -05:00
fn apply<T, U, F>(f: F, x: T) -> U where F: FnOnce(T) -> U {
f(x)
}
```
[discrete]
=== `move_guard_to_arm_body`
2019-10-27 03:26:46 -05:00
Moves match guard into match arm body.
.Before
2019-10-27 03:26:46 -05:00
```rust
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move { distance } ┃if distance > 10 => foo(),
_ => (),
}
}
```
2019-10-27 03:26:46 -05:00
.After
```rust
2019-10-27 03:26:46 -05:00
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move { distance } => if distance > 10 { foo() },
_ => (),
}
}
```
2019-10-27 04:22:53 -05:00
[discrete]
=== `remove_dbg`
2019-10-27 04:22:53 -05:00
Removes `dbg!()` macro call.
.Before
2019-10-27 04:22:53 -05:00
```rust
fn main() {
┃dbg!(92);
}
```
2019-10-27 04:22:53 -05:00
.After
```rust
2019-10-27 04:22:53 -05:00
fn main() {
92;
}
```
[discrete]
=== `remove_hash`
2019-10-27 04:22:53 -05:00
Removes a hash from a raw string literal.
.Before
2019-10-27 04:22:53 -05:00
```rust
fn main() {
r#"Hello,┃ World!"#;
}
```
2019-10-27 04:22:53 -05:00
.After
```rust
2019-10-27 04:22:53 -05:00
fn main() {
r"Hello, World!";
}
```
[discrete]
=== `remove_mut`
2020-02-19 05:44:20 -06:00
Removes the `mut` keyword.
.Before
2020-02-19 05:44:20 -06:00
```rust
impl Walrus {
fn feed(&mut┃ self, amount: u32) {}
}
```
2020-02-19 05:44:20 -06:00
.After
```rust
2020-02-19 05:44:20 -06:00
impl Walrus {
fn feed(&self, amount: u32) {}
}
```
[discrete]
=== `reorder_fields`
2020-04-11 13:32:58 -05:00
Reorder the fields of record literals and record patterns in the same order as in
the definition.
.Before
2020-04-11 13:32:58 -05:00
```rust
struct Foo {foo: i32, bar: i32};
const test: Foo = ┃Foo {bar: 0, foo: 1}
```
2020-04-11 13:32:58 -05:00
.After
```rust
2020-04-11 13:32:58 -05:00
struct Foo {foo: i32, bar: i32};
const test: Foo = Foo {foo: 1, bar: 0}
```
[discrete]
=== `replace_if_let_with_match`
2019-10-27 04:22:53 -05:00
Replaces `if let` with an else branch with a `match` expression.
.Before
2019-10-27 04:22:53 -05:00
```rust
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
┃if let Action::Move { distance } = action {
foo(distance)
} else {
bar()
}
}
```
2019-10-27 04:22:53 -05:00
.After
```rust
2019-10-27 04:22:53 -05:00
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move { distance } => foo(distance),
_ => bar(),
}
}
```
[discrete]
=== `replace_let_with_if_let`
2020-03-27 06:12:17 -05:00
2020-03-27 07:10:40 -05:00
Replaces `let` with an `if-let`.
2020-03-27 06:12:17 -05:00
.Before
2020-03-27 06:12:17 -05:00
```rust
fn main(action: Action) {
┃let x = compute();
}
fn compute() -> Option<i32> { None }
```
2020-03-27 06:12:17 -05:00
.After
```rust
2020-03-27 06:12:17 -05:00
fn main(action: Action) {
if let Some(x) = compute() {
}
}
fn compute() -> Option<i32> { None }
```
[discrete]
=== `replace_qualified_name_with_use`
2020-02-07 15:35:34 -06:00
Adds a use statement for a given fully-qualified name.
.Before
2020-02-07 15:35:34 -06:00
```rust
fn process(map: std::collections::┃HashMap<String, String>) {}
```
2020-02-07 15:35:34 -06:00
.After
```rust
2020-02-07 15:35:34 -06:00
use std::collections::HashMap;
fn process(map: HashMap<String, String>) {}
```
[discrete]
=== `replace_unwrap_with_match`
2020-03-26 04:16:10 -05:00
Replaces `unwrap` a `match` expression. Works for Result and Option.
.Before
2020-03-26 04:16:10 -05:00
```rust
enum Result<T, E> { Ok(T), Err(E) }
fn main() {
let x: Result<i32, i32> = Result::Ok(92);
let y = x.┃unwrap();
}
```
2020-03-26 04:16:10 -05:00
.After
```rust
2020-03-26 04:16:10 -05:00
enum Result<T, E> { Ok(T), Err(E) }
fn main() {
let x: Result<i32, i32> = Result::Ok(92);
let y = match x {
Ok(a) => a,
2020-05-20 17:01:08 -05:00
$0_ => unreachable!(),
2020-03-26 04:16:10 -05:00
};
}
```
[discrete]
=== `split_import`
2019-10-27 04:22:53 -05:00
Wraps the tail of import into braces.
.Before
2019-10-27 04:22:53 -05:00
```rust
use std::┃collections::HashMap;
```
2019-10-27 04:22:53 -05:00
.After
```rust
2019-10-27 04:22:53 -05:00
use std::{collections::HashMap};
```
[discrete]
=== `unwrap_block`
This assist removes if...else, for, while and loop control statements to just keep the body.
.Before
```rust
fn foo() {
if true {┃
println!("foo");
}
}
```
.After
```rust
fn foo() {
println!("foo");
}
```