Unwrap a new feature each day 🎁
A special gift: an Advent Calendar of RustRover with the features you might not even know about, all designed to help you progress in Rust. We’ll post one feature per day for 12 days – stay tuned! 🎄🦀
JetBrains is proudly sponsoring Advent Of Code for the fifth year in a row! We’re calling all Rust developers to showcase your skills — take your time or race for a chance to win a USD 150 Amazon Gift Card! Read the blog post for more details 👉

RustRover gives you quick ways to view expanded macros:

Quickly turn JSON into Rust structs directly in RustRover:

RustRover fully supports moving between single-file modules (foo.rs) and directory-based modules (foo/mod.rs), ensuring your code layout remains clean and manageable.
Promote Module to Directory:
foo.rs) in the Project view.foo/) is created, foo.rs is moved to foo/mod.rs, and all use/mod declarations are updated automatically.Downgrade Module to File
foo/) containing mod.rs (or lib.rs).mod.rs (or lib.rs) is moved to foo.rs next to the folder, items are moved/merged, and references are fixed.Quick Access
You can access these refactoring actions quickly:
Important Notes

In RustRover, you can see Parallel Stacks that show all active call stacks across threads (and async tasks) at once, grouped to make concurrency easier to reason about.
With it, you can:
How to Use:
std/tokio/etc.) to focus on your code.Rust Specifics:
tokio/async-std). Enabling “Hide non-project frames” clarifies futures’ poll chains.debuginfo (the dev profile) for accurate symbols. Optimized builds can collapse or inline frames, making the graph less representative.
When you type mod foo; in Rust, you are declaring a module that should live in a separate file or folder. RustRover can create this module structure for you instantly.
Create the File/Folder in RustRover:
mod foo;, place the caret on foo and press Option + Enter.foo with mod.rs
RustRover can generate trait implementations for you, streamlining the process:

You can view disassembly while debugging in RustRover.
Enable and open Disassembly:
Best Practices for Clear Disassembly:
dev profile) or use flags like RUSTFLAGS="-C debuginfo=2" if necessary.dev profile or manually set opt-level = 0 in your build configuration. Higher optimization levels aggressively reorder and inline frames, which makes the generated assembly less representative of your source code.
RustRover has a built-in refactoring for converting tuple enum variants to struct variants.
How to Convert (Tuple → Struct):
Variant(T1, T2) to Variant { field0: T1, field1: T2 } (or prompt you for names).field0, field1, …) or type your own names.Reverse Direction (Struct → Tuple):
Alternative Access:
match arms, let destructuring, or construction) to trigger a preview of changes.Notes:
cargo check first for accurate usages.
unwrap()to ?Operator 🎁RustRover can automatically replace unwrap() with the ? operator and adjust the function signature if needed.
How to Use It:
unwrap() (or try/expect, where supported).What the IDE Does:
foo.unwrap() with foo?.Result, it offers to:Result<_, E> (inferred).Ok(...) around the final value if required.unwrap_err), it may suggest mapping the error via .map_err(...) or anyhow::Result if that crate is in use.Tips:
unwrap calls are in a block, you can apply the intention per occurrence or use Fix all for file (where available).map_err to convert, for example: call.try_something().map_err(MyError::from)?.
if let and match (and Vice Versa) 🎁RustRover provides an intention action to switch between if let and match.
Convert if let → match:
if let keyword (or pattern).match expression with the pattern arm and a fallback (_) arm, moving the else block into the fallback.Convert match → if let:
match keyword.match is a simple two-arm pattern with a catch-all (_) or None/Err arm.if let PATTERN = EXPR { … } else { … }Notes:
Result/Option matches with more than two arms or guards, conversion may be unavailable._ bindings if needed.
In RustRover, you can use Local History to view and restore changes without using VCS.
Access it:
From the editor (current file):
From the Project view (folder/file):
Use it:
Save, Refactor, Run, etc.).Notes:

In RustRover, you can add a turbofish using an intention/quick fix:
parse(), collect(), into()).How to apply:
::<...> after the function or method name, for example:"42".parse::()iter.collect::<Vec<_>>()
Tips:
From / Into:value.into() // Option+Enter → Add explicit type → value.into::()
_ for elided generics:foo::<_, usize>(...)
Check out the most useful and popular topics to get you started with RustRover.