Source: add_explicit_type.rs
Specify type for a let binding.
fn main() {
let x┃ = 92;
}fn main() {
let x: i32 = 92;
}Source: raw_string.rs
Adds a hash to a raw string literal.
fn main() {
r#"Hello,┃ World!"#;
}fn main() {
r##"Hello, World!"##;
}Source: add_missing_impl_members.rs
Adds scaffold for overriding default impl members.
trait Trait {
type X;
fn foo(&self);
fn bar(&self) {}
}
impl Trait for () {
type X = ();
fn foo(&self) {}┃
}trait Trait {
type X;
fn foo(&self);
fn bar(&self) {}
}
impl Trait for () {
type X = ();
fn foo(&self) {}
┃fn bar(&self) {}
}Source: add_missing_impl_members.rs
Adds scaffold for required impl members.
trait Trait<T> {
type X;
fn foo(&self) -> T;
fn bar(&self) {}
}
impl Trait<u32> for () {┃
}trait Trait<T> {
type X;
fn foo(&self) -> T;
fn bar(&self) {}
}
impl Trait<u32> for () {
┃type X;
fn foo(&self) -> u32 {
todo!()
}
}Source: add_lifetime_to_type.rs
Adds a new lifetime to a struct, enum or union.
struct Point {
x: &┃u32,
y: u32,
}struct Point<'a> {
x: &'a u32,
y: u32,
}Source: add_missing_match_arms.rs
Adds missing clauses to a match expression.
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
┃
}
}enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
┃Action::Move { distance } => todo!(),
Action::Stop => todo!(),
}
}Source: add_return_type.rs
Adds the return type to a function or closure inferred from its tail expression if it doesn’t have a return type specified. This assists is useable in a functions or closures tail expression or return type position.
fn foo() { 4┃2i32 }fn foo() -> i32 { 42i32 }Source: add_turbo_fish.rs
Adds ::<_> to a call of a generic method or function.
fn make<T>() -> T { todo!() }
fn main() {
let x = make┃();
}fn make<T>() -> T { todo!() }
fn main() {
let x = make::<${0:_}>();
}Source: apply_demorgan.rs
Apply De Morgan’s law.
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 &&.
fn main() {
if x != 4 ||┃ y < 3.14 {}
}fn main() {
if !(x == 4 && y >= 3.14) {}
}Source: auto_import.rs
If the name is unresolved, provides all possible imports for it.
fn main() {
let map = HashMap┃::new();
}use std::collections::HashMap;
fn main() {
let map = HashMap::new();
}Source: change_visibility.rs
Adds or changes existing visibility specifier.
┃fn frobnicate() {}pub(crate) fn frobnicate() {}Source: convert_bool_then.rs
Converts a bool::then method call to an equivalent if expression.
fn main() {
(0 == 0).then┃(|| val)
}fn main() {
if 0 == 0 {
Some(val)
} else {
None
}
}Source: convert_iter_for_each_to_for.rs
Converts a for loop into a for_each loop on the Iterator.
fn main() {
let x = vec![1, 2, 3];
for┃ v in x {
let y = v * 2;
}
}fn main() {
let x = vec![1, 2, 3];
x.into_iter().for_each(|v| {
let y = v * 2;
});
}Source: convert_bool_then.rs
Converts an if expression into a corresponding bool::then call.
fn main() {
if┃ cond {
Some(val)
} else {
None
}
}fn main() {
cond.then(|| val)
}Source: convert_integer_literal.rs
Converts the base of integer literals to other bases.
const _: i32 = 10┃;const _: i32 = 0b1010;Source: convert_into_to_from.rs
Converts an Into impl to an equivalent From impl.
impl ┃Into<Thing> for usize {
fn into(self) -> Thing {
Thing {
b: self.to_string(),
a: self
}
}
}impl From<usize> for Thing {
fn from(val: usize) -> Self {
Thing {
b: val.to_string(),
a: val
}
}
}Source: convert_iter_for_each_to_for.rs
Converts an Iterator::for_each function into a for loop.
fn main() {
let iter = iter::repeat((9, 2));
iter.for_each┃(|(x, y)| {
println!("x: {}, y: {}", x, y);
});
}fn main() {
let iter = iter::repeat((9, 2));
for (x, y) in iter {
println!("x: {}, y: {}", x, y);
}
}Source: convert_to_guarded_return.rs
Replace a large conditional with a guarded return.
fn main() {
┃if cond {
foo();
bar();
}
}fn main() {
if !cond {
return;
}
foo();
bar();
}Converts tuple struct to struct with named fields, and analogously for tuple enum variants.
struct Point┃(f32, f32);
impl Point {
pub fn new(x: f32, y: f32) -> Self {
Point(x, y)
}
pub fn x(&self) -> f32 {
self.0
}
pub fn y(&self) -> f32 {
self.1
}
}struct Point { field1: f32, field2: f32 }
impl Point {
pub fn new(x: f32, y: f32) -> Self {
Point { field1: x, field2: y }
}
pub fn x(&self) -> f32 {
self.field1
}
pub fn y(&self) -> f32 {
self.field2
}
}Source: convert_while_to_loop.rs
Replace a while with a loop.
fn main() {
┃while cond {
foo();
}
}fn main() {
loop {
if !cond {
break;
}
foo();
}
}Source: destructure_tuple_binding.rs
Destructures a tuple binding in place.
fn main() {
let ┃t = (1,2);
let v = t.0;
}fn main() {
let (┃_0, _1) = (1,2);
let v = _0;
}Source: expand_glob_import.rs
Expands glob imports.
mod foo {
pub struct Bar;
pub struct Baz;
}
use foo::*┃;
fn qux(bar: Bar, baz: Baz) {}mod foo {
pub struct Bar;
pub struct Baz;
}
use foo::{Baz, Bar};
fn qux(bar: Bar, baz: Baz) {}Source: extract_function.rs
Extracts selected statements into new function.
fn main() {
let n = 1;
┃let m = n + 2;
let k = m + n;┃
let g = 3;
}fn main() {
let n = 1;
fun_name(n);
let g = 3;
}
fn ┃fun_name(n: i32) {
let m = n + 2;
let k = m + n;
}Source: extract_module.rs
Extracts a selected region as seperate module. All the references, visibility and imports are resolved.
┃fn foo(name: i32) -> i32 {
name + 1
}┃
fn bar(name: i32) -> i32 {
name + 2
}mod modname {
pub(crate) fn foo(name: i32) -> i32 {
name + 1
}
}
fn bar(name: i32) -> i32 {
name + 2
}Extracts a struct from enum variant.
enum A { ┃One(u32, u32) }struct One(u32, u32);
enum A { One(One) }Source: extract_type_alias.rs
Extracts the selected type as a type alias.
struct S {
field: ┃(u8, u8, u8)┃,
}type ┃Type = (u8, u8, u8);
struct S {
field: Type,
}Source: extract_variable.rs
Extracts subexpression into a variable.
fn main() {
┃(1 + 2)┃ * 4;
}fn main() {
let ┃var_name = (1 + 2);
var_name * 4;
}Source: fix_visibility.rs
Makes inaccessible item public.
mod m {
fn frobnicate() {}
}
fn main() {
m::frobnicate┃() {}
}mod m {
┃pub(crate) fn frobnicate() {}
}
fn main() {
m::frobnicate() {}
}Source: flip_binexpr.rs
Flips operands of a binary expression.
fn main() {
let _ = 90 +┃ 2;
}fn main() {
let _ = 2 + 90;
}Source: flip_comma.rs
Flips two comma-separated items.
fn main() {
((1, 2),┃ (3, 4));
}fn main() {
((3, 4), (1, 2));
}Source: flip_trait_bound.rs
Flips two trait bounds.
fn foo<T: Clone +┃ Copy>() { }fn foo<T: Copy + Clone>() { }Source: generate_constant.rs
Generate a named constant.
struct S { i: usize }
impl S { pub fn new(n: usize) {} }
fn main() {
let v = S::new(CAPA┃CITY);
}struct S { i: usize }
impl S { pub fn new(n: usize) {} }
fn main() {
const CAPACITY: usize = ┃;
let v = S::new(CAPACITY);
}Adds a Default impl for an enum using a variant.
enum Version {
Undefined,
Minor┃,
Major,
}enum Version {
Undefined,
Minor,
Major,
}
impl Default for Version {
fn default() -> Self {
Self::Minor
}
}Source: generate_default_from_new.rs
Generates default implementation from new method.
struct Example { _inner: () }
impl Example {
pub fn n┃ew() -> Self {
Self { _inner: () }
}
}struct Example { _inner: () }
impl Example {
pub fn new() -> Self {
Self { _inner: () }
}
}
impl Default for Example {
fn default() -> Self {
Self::new()
}
}Source: generate_delegate_methods.rs
Generate delegate methods.
struct Age(u8);
impl Age {
fn age(&self) -> u8 {
self.0
}
}
struct Person {
ag┃e: Age,
}struct Age(u8);
impl Age {
fn age(&self) -> u8 {
self.0
}
}
struct Person {
age: Age,
}
impl Person {
┃fn age(&self) -> u8 {
self.age.age()
}
}Source: generate_deref.rs
Generate Deref impl using the given struct field.
struct A;
struct B {
┃a: A
}struct A;
struct B {
a: A
}
impl std::ops::Deref for B {
type Target = A;
fn deref(&self) -> &Self::Target {
&self.a
}
}Source: generate_derive.rs
Adds a new #[derive()] clause to a struct or enum.
struct Point {
x: u32,
y: u32,┃
}#[derive(┃)]
struct Point {
x: u32,
y: u32,
}Generate an as_ method for an enum variant.
enum Value {
Number(i32),
Text(String)┃,
}enum Value {
Number(i32),
Text(String),
}
impl Value {
fn as_text(&self) -> Option<&String> {
if let Self::Text(v) = self {
Some(v)
} else {
None
}
}
}Source: generate_enum_is_method.rs
Generate an is_ method for an enum variant.
enum Version {
Undefined,
Minor┃,
Major,
}enum Version {
Undefined,
Minor,
Major,
}
impl Version {
/// Returns `true` if the version is [`Minor`].
///
/// [`Minor`]: Version::Minor
fn is_minor(&self) -> bool {
matches!(self, Self::Minor)
}
}Generate an try_into_ method for an enum variant.
enum Value {
Number(i32),
Text(String)┃,
}enum Value {
Number(i32),
Text(String),
}
impl Value {
fn try_into_text(self) -> Result<String, Self> {
if let Self::Text(v) = self {
Ok(v)
} else {
Err(self)
}
}
}Source: generate_from_impl_for_enum.rs
Adds a From impl for an enum variant with one tuple field.
enum A { ┃One(u32) }enum A { One(u32) }
impl From<u32> for A {
fn from(v: u32) -> Self {
Self::One(v)
}
}Source: generate_function.rs
Adds a stub function with a signature matching the function under the cursor.
struct Baz;
fn baz() -> Baz { Baz }
fn foo() {
bar┃("", baz());
}struct Baz;
fn baz() -> Baz { Baz }
fn foo() {
bar("", baz());
}
fn bar(arg: &str, baz: Baz) ${0:-> _} {
todo!()
}Source: generate_getter.rs
Generate a getter method.
struct Person {
nam┃e: String,
}struct Person {
name: String,
}
impl Person {
/// Get a reference to the person's name.
fn ┃name(&self) -> &str {
self.name.as_ref()
}
}Source: generate_getter.rs
Generate a mut getter method.
struct Person {
nam┃e: String,
}struct Person {
name: String,
}
impl Person {
/// Get a mutable reference to the person's name.
fn ┃name_mut(&mut self) -> &mut String {
&mut self.name
}
}Source: generate_impl.rs
Adds a new inherent impl for a type.
struct Ctx<T: Clone> {
data: T,┃
}struct Ctx<T: Clone> {
data: T,
}
impl<T: Clone> Ctx<T> {
┃
}Source: generate_is_empty_from_len.rs
Generates is_empty implementation from the len method.
struct MyStruct { data: Vec<String> }
impl MyStruct {
p┃ub fn len(&self) -> usize {
self.data.len()
}
}struct MyStruct { data: Vec<String> }
impl MyStruct {
pub fn len(&self) -> usize {
self.data.len()
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}Source: generate_new.rs
Adds a new inherent impl for a type.
struct Ctx<T: Clone> {
data: T,┃
}struct Ctx<T: Clone> {
data: T,
}
impl<T: Clone> Ctx<T> {
fn ┃new(data: T) -> Self { Self { data } }
}Source: generate_setter.rs
Generate a setter method.
struct Person {
nam┃e: String,
}struct Person {
name: String,
}
impl Person {
/// Set the person's name.
fn set_name(&mut self, name: String) {
self.name = name;
}
}Source: inline_call.rs
Inlines a function or method body creating a let statement per parameter unless the parameter
can be inlined. The parameter will be inlined either if it the supplied argument is a simple local
or if the parameter is only accessed inside the function body once.
fn foo(name: Option<&str>) {
let name = name.unwrap┃();
}fn foo(name: Option<&str>) {
let name = match name {
Some(val) => val,
None => panic!("called `Option::unwrap()` on a `None` value"),
};
}Source: inline_call.rs
Inline a function or method body into all of its callers where possible, creating a let statement per parameter
unless the parameter can be inlined. The parameter will be inlined either if it the supplied argument is a simple local
or if the parameter is only accessed inside the function body once.
If all calls can be inlined the function will be removed.
fn print(_: &str) {}
fn foo┃(word: &str) {
if !word.is_empty() {
print(word);
}
}
fn bar() {
foo("안녕하세요");
foo("여러분");
}fn print(_: &str) {}
fn bar() {
{
let word = "안녕하세요";
if !word.is_empty() {
print(word);
}
};
{
let word = "여러분";
if !word.is_empty() {
print(word);
}
};
}Source: inline_local_variable.rs
Inlines a local variable.
fn main() {
let x┃ = 1 + 2;
x * 4;
}fn main() {
(1 + 2) * 4;
}Source: introduce_named_generic.rs
Replaces impl Trait function argument with the named generic.
fn foo(bar: ┃impl Bar) {}fn foo<B: Bar>(bar: B) {}Source: introduce_named_lifetime.rs
Change an anonymous lifetime to a named lifetime.
impl Cursor<'_┃> {
fn node(self) -> &SyntaxNode {
match self {
Cursor::Replace(node) | Cursor::Before(node) => node,
}
}
}impl<'a> Cursor<'a> {
fn node(self) -> &SyntaxNode {
match self {
Cursor::Replace(node) | Cursor::Before(node) => node,
}
}
}Source: invert_if.rs
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.
fn main() {
if┃ !y { A } else { B }
}fn main() {
if y { B } else { A }
}Source: convert_comment_block.rs
Converts comments between block and single-line form.
// Multi-line┃
// comment /*
Multi-line
comment
*/Source: raw_string.rs
Adds r# to a plain string literal.
fn main() {
"Hello,┃ World!";
}fn main() {
r#"Hello, World!"#;
}Source: raw_string.rs
Turns a raw string into a plain string.
fn main() {
r#"Hello,┃ "World!""#;
}fn main() {
"Hello, \"World!\"";
}Source: merge_imports.rs
Merges two imports with a common prefix.
use std::┃fmt::Formatter;
use std::io;use std::{fmt::Formatter, io};Source: merge_match_arms.rs
Merges the current match arm with the following if their bodies are identical.
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
┃Action::Move(..) => foo(),
Action::Stop => foo(),
}
}enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move(..) | Action::Stop => foo(),
}
}Source: move_guard.rs
Moves if expression from match arm body into a guard.
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move { distance } => ┃if distance > 10 { foo() },
_ => (),
}
}enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move { distance } if distance > 10 => foo(),
_ => (),
}
}Source: move_bounds.rs
Moves inline type bounds to a where clause.
fn apply<T, U, ┃F: FnOnce(T) -> U>(f: F, x: T) -> U {
f(x)
}fn apply<T, U, F>(f: F, x: T) -> U where F: FnOnce(T) -> U {
f(x)
}Source: move_from_mod_rs.rs
Moves xxx/mod.rs to xxx.rs.
//- /main.rs
mod a;
//- /a/mod.rs
┃fn t() {}┃fn t() {}Source: move_guard.rs
Moves match guard into match arm body.
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move { distance } ┃if distance > 10 => foo(),
_ => (),
}
}enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move { distance } => if distance > 10 {
foo()
},
_ => (),
}
}Source: move_module_to_file.rs
Moves inline module’s contents to a separate file.
mod ┃foo {
fn t() {}
}mod foo;Source: move_to_mod_rs.rs
Moves xxx.rs to xxx/mod.rs.
//- /main.rs
mod a;
//- /a.rs
┃fn t() {}┃fn t() {}Source: promote_local_to_const.rs
Promotes a local variable to a const item changing its name to a SCREAMING_SNAKE_CASE variant
if the local uses no non-const expressions.
fn main() {
let foo┃ = true;
if foo {
println!("It's true");
} else {
println!("It's false");
}
}fn main() {
const ┃FOO: bool = true;
if FOO {
println!("It's true");
} else {
println!("It's false");
}
}Source: pull_assignment_up.rs
Extracts variable assignment to outside an if or match statement.
fn main() {
let mut foo = 6;
if true {
┃foo = 5;
} else {
foo = 4;
}
}fn main() {
let mut foo = 6;
foo = if true {
5
} else {
4
};
}Source: qualify_method_call.rs
Replaces the method call with a qualified function call.
struct Foo;
impl Foo {
fn foo(&self) {}
}
fn main() {
let foo = Foo;
foo.fo┃o();
}struct Foo;
impl Foo {
fn foo(&self) {}
}
fn main() {
let foo = Foo;
Foo::foo(&foo);
}Source: qualify_path.rs
If the name is unresolved, provides all possible qualified paths for it.
fn main() {
let map = HashMap┃::new();
}fn main() {
let map = std::collections::HashMap::new();
}Source: remove_dbg.rs
Removes dbg!() macro call.
fn main() {
┃dbg!(92);
}fn main() {
92;
}Source: raw_string.rs
Removes a hash from a raw string literal.
fn main() {
r#"Hello,┃ World!"#;
}fn main() {
r"Hello, World!";
}Source: remove_mut.rs
Removes the mut keyword.
impl Walrus {
fn feed(&mut┃ self, amount: u32) {}
}impl Walrus {
fn feed(&self, amount: u32) {}
}Source: remove_unused_param.rs
Removes unused function parameter.
fn frobnicate(x: i32┃) {}
fn main() {
frobnicate(92);
}fn frobnicate() {}
fn main() {
frobnicate();
}Source: reorder_fields.rs
Reorder the fields of record literals and record patterns in the same order as in the definition.
struct Foo {foo: i32, bar: i32};
const test: Foo = ┃Foo {bar: 0, foo: 1}struct Foo {foo: i32, bar: i32};
const test: Foo = Foo {foo: 1, bar: 0}Source: reorder_impl.rs
Reorder the methods of an impl Trait. The methods will be ordered
in the same order as in the trait definition.
trait Foo {
fn a() {}
fn b() {}
fn c() {}
}
struct Bar;
┃impl Foo for Bar {
fn b() {}
fn c() {}
fn a() {}
}trait Foo {
fn a() {}
fn b() {}
fn c() {}
}
struct Bar;
impl Foo for Bar {
fn a() {}
fn b() {}
fn c() {}
}Source: replace_string_with_char.rs
Replace a char literal with a string literal.
fn main() {
find('{┃');
}fn main() {
find("{");
}Converts a derive impl into a manual one.
#[derive(Deb┃ug, Display)]
struct S;#[derive(Display)]
struct S;
impl Debug for S {
┃fn fmt(&self, f: &mut Formatter) -> Result<()> {
f.debug_struct("S").finish()
}
}Source: replace_if_let_with_match.rs
Replaces a if let expression with a match expression.
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
┃if let Action::Move { distance } = action {
foo(distance)
} else {
bar()
}
}enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
match action {
Action::Move { distance } => foo(distance),
_ => bar(),
}
}Source: replace_let_with_if_let.rs
Replaces let with an if let.
fn main(action: Action) {
┃let x = compute();
}
fn compute() -> Option<i32> { None }fn main(action: Action) {
if let Some(x) = compute() {
}
}
fn compute() -> Option<i32> { None }Source: replace_if_let_with_match.rs
Replaces a binary match with a wildcard pattern and no guards with an if let expression.
enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
┃match action {
Action::Move { distance } => foo(distance),
_ => bar(),
}
}enum Action { Move { distance: u32 }, Stop }
fn handle(action: Action) {
if let Action::Move { distance } = action {
foo(distance)
} else {
bar()
}
}Adds a use statement for a given fully-qualified name.
fn process(map: std::collections::┃HashMap<String, String>) {}use std::collections::HashMap;
fn process(map: HashMap<String, String>) {}Source: replace_string_with_char.rs
Replace string literal with char literal.
fn main() {
find("{┃");
}fn main() {
find('{');
}Source: replace_try_expr_with_match.rs
Replaces a try expression with a match expression.
fn handle() {
let pat = Some(true)┃?;
}fn handle() {
let pat = match Some(true) {
Some(it) => it,
None => return None,
};
}Converts ::<_> to an explicit type assignment.
fn make<T>() -> T { ) }
fn main() {
let a = make┃::<i32>();
}fn make<T>() -> T { ) }
fn main() {
let a: i32 = make();
}Source: sort_items.rs
Sorts item members alphabetically: fields, enum variants and methods.
struct ┃Foo┃ { second: u32, first: String }struct Foo { first: String, second: u32 }trait ┃Bar┃ {
fn second(&self) -> u32;
fn first(&self) -> String;
}trait Bar {
fn first(&self) -> String;
fn second(&self) -> u32;
}struct Baz;
impl ┃Baz┃ {
fn second(&self) -> u32;
fn first(&self) -> String;
}struct Baz;
impl Baz {
fn first(&self) -> String;
fn second(&self) -> u32;
}There is a difference between sorting enum variants:
enum ┃Animal┃ {
Dog(String, f64),
Cat { weight: f64, name: String },
}enum Animal {
Cat { weight: f64, name: String },
Dog(String, f64),
}and sorting a single enum struct variant:
enum Animal {
Dog(String, f64),
Cat ┃{ weight: f64, name: String }┃,
}enum Animal {
Dog(String, f64),
Cat { name: String, weight: f64 },
}Source: split_import.rs
Wraps the tail of import into braces.
use std::┃collections::HashMap;use std::{collections::HashMap};Source: toggle_ignore.rs
Adds #[ignore] attribute to the test.
┃#[test]
fn arithmetics {
assert_eq!(2 + 2, 5);
}#[test]
#[ignore]
fn arithmetics {
assert_eq!(2 + 2, 5);
}Source: unmerge_use.rs
Extracts single use item from use list.
use std::fmt::{Debug, Display┃};use std::fmt::{Debug};
use std::fmt::Display;Source: unwrap_block.rs
This assist removes if…else, for, while and loop control statements to just keep the body.
fn foo() {
if true {┃
println!("foo");
}
}fn foo() {
println!("foo");
}Source: unwrap_result_return_type.rs
Unwrap the function’s return type.
fn foo() -> Result<i32>┃ { Ok(42i32) }fn foo() -> i32 { 42i32 }Source: wrap_return_type_in_result.rs
Wrap the function’s return type into Result.
fn foo() -> i32┃ { 42i32 }fn foo() -> Result<i32, ${0:_}> { Ok(42i32) }