In the past couple of months, we have worked on adding over 40 issues to the Rust Analyzer, with a significant number of them supporting Autofix.
With the coming update, the Rust Analyzer checks for the fs::remove_dir_all
****vulnerability in the standard library, and also adds support for destructuring syntax introduced in Rust 1.58.
Newly added Issues:
RS-W1035: Found occurrence of .inspect(..).for_each(..)
Checks for calls to inspect
followed by for_each
.
The computation performed inside inspect
could be moved into the
beginning of the closure in for_each
.
/// Bad Practice
[1, 2, 3, 4, 5]
.iter()
.inspect(|x| println!("inspecting: {:?}", x))
.for_each(|x| {
// do_stuff
});
/// Recommended
[1, 2, 3, 4, 5]
.iter()
.for_each(|x| {
println!("inspecting: {:?}", x)
// do_stuff
});
RS-W1050: Found occurrence of &Box<T>
or &mut Box<T>
&Box<T>
or &mut Box<T>
are often better written as &T
or &mut T
.
Any function that accepts &T
as an argument, will also accept &Box<T>
.
Box<T>
implements Deref<Target = T>
, which allows any &Box<T>
to
automatically dereference to a &T
.
/// Bad Practice
fn function(box_foo : &Box<Foo>) { ... }
/// Recommended
fn function(foo : &Foo) {}
RS-E1007: Found erasing operation
Checks for operations that evaluate to zero, such as 0 / y
. This is most
likely unintentional.
/// Bad Practice
x * 0;
x & 0;
0 / x;
/// Recommended
0; // x * 0;
0; // x & 0;
0; // 0 / x;
RS-E1003: Found occurrence of .step_by(0)
Calling .step_by(0)
on an iterator panics.
/// Bad Practice
[1, 2, 3].iter().step_by(0);
for _ in (0..100).step_by(0) {
// ...
}
Newly added Autofixes:
RS-E1005: Found empty range expression
Ranges such as x..y
where x
is greater than y
results in an empty range. Iterating over such ranges is a no-op. The likely intention would be iterating in reverse, in which case, (x..y).rev()
must be used.
Autofix: Fix empty range with .rev()
fn function() {
++++ Fix empty range with `.rev()`
< for x in 10..0 { ... }
> for x in (0..10).rev() { ... }
++++ Fix empty range with `.rev()`
< for x in 10..=0 { ... }
> for x in (0..=10).rev() { ... }
}
RS-E1006: Found incorrect usage of #[inline]
attribute
The #[inline]
attribute has no effect when used on associated functions in
trait definitions. Only implementations may be inlined.
Autofix: Remove redundant #[inline]
attribute
trait Foo {
++++ Remove redundant `#[inline]` attribute
< #[inline] fn function();
> fn function();
}
RS-W1036: Found occurrence of .skip(..).next()
.skip(..).next()
is equivalent to .nth(..)
, which is more readable.
Autofix: Simplify .skip(..).next()
with .nth(..)
fn function() {
++++ Simplify `.skip(..).next()` with `.nth(..)`
< let x = a.skip(5).next();
> let x = a.nth(5);
++++ Simplify `.skip(..).next()` with `.nth(..)`
< let x = a
< .iter()
< .skip(5)
< .next();
> let x = a
> .iter()
> .nth(5);
}
…and many more! Check out the full list of Issues and Autofixes supported by the Rust Analyzer over at the Directory.