rust-lang / rust-analyzer

A Rust compiler front-end for IDEs
https://rust-analyzer.github.io/
Apache License 2.0
14.2k stars 1.6k forks source link

organize imports action #5131

Open GopherJ opened 4 years ago

GopherJ commented 4 years ago

It'll be good to have this feature so that we can remove unused imports

EDIT:

instructions

matklad commented 4 years ago

cc https://github.com/rust-analyzer/rust-analyzer/issues/3301

TonalidadeHidrica commented 3 years ago

Actually, there are several operations I expect for "organize import" feature:

branpk commented 3 years ago

It would also be nice if local imports could be canonicalized, so that it consistently uses relative or absolute paths (or has a rule for determining which to use).

dnut commented 3 years ago

I would follow the approach intellij uses, with imports grouped by standard library, external, and local, and alphabetized within each group.

aloucks commented 2 years ago

I like the suggestions here (merging and sorting), but removal of unused imports is by far the what I'm missing the most.

ocheret commented 1 year ago

Is there any ongoing work on this issue?

Ciel-MC commented 1 year ago

There is already diagnostic info and quick fix for unused imports, what is stopping this from happening?

Veykril commented 1 year ago

A person willing to implement this (also not r-a itself does not yet diagnose unused imports, that's coming from the cargo checks)

dnut commented 1 year ago

Clippy can remove unused imports:

cargo clippy --fix

There should be a way to bind this to a keyboard shortcut. Some ideas: https://stackoverflow.com/questions/52786022/shortcut-for-running-terminal-command-in-vs-code

Caveats:

To deal with the last issue, my typical approach is to stage all my changes, so they are isolated from any additional changes. Then I run cargo clippy --fix --allow-staged. Then I review the unstaged changes from clippy. If it looks bad, I can revert them in isolation.

It would be ideal if rust-analyzer could clean up unused imports, but at least we have an alternative for now.

Ciel-MC commented 1 year ago

Clippy can remove unused imports:

cargo clippy --fix

There should be a way to bind this to a keyboard shortcut. Some ideas: https://stackoverflow.com/questions/52786022/shortcut-for-running-terminal-command-in-vs-code

Caveats:

* applies to the entire workspace

* changes a bunch of things that rust-analyzer does not change

* does not work if you have local changes that have not been committed.

To deal with the last issue, my typical approach is to stage all my changes, so they are isolated from any additional changes. Then I run cargo clippy --fix --allow-staged. Then I review the unstaged changes from clippy. If it looks bad, I can revert them in isolation.

It would be ideal if rust-analyzer could clean up unused imports, but at least we have an alternative for now.

I am aware of cargo/clippy fix, but I don't want it to potentially nuke anything, but I couldn't figure out how to only fix a certain thing(unused imports), binding commands and stuff is the easiest part because... (neo)vim, lol.

matklad commented 1 year ago

Yeah, it feels like this should be doable. This is going to be a pretty large wad of code to add, but it seems to me that, at this point, we probably a reasonably precise analysis to make this worthwhile.

Some general pointers:

I think this feature can work in one of two ways:

Abstractly, I like the second approach much more, as it allows us to be significantly more lazy. For all unused imports, we can probably say that they are unused following the parse, and for used stuff it's enough to have just one confirmed used to rule out a false negative.

What makes me hesitant to try the second approach are macros. To textually find all uses, we have to expand the macros... But this is something our search infra has to deal with anyway.

So, yeah, my prior here is that building the feature on top of search is the way to go.

matklad commented 1 year ago

Ah, I realized that we already have a model of this workflow in the code, that's "remove unused param" assist:

https://github.com/rust-lang/rust-analyzer/blob/62c81d62932c458e23975191ecc124916be0b35e/crates/ide-assists/src/handlers/remove_unused_param.rs

So I think import optimization should have roughly the same skeleton, with just a tiny bit more meat on it :D

obsgolem commented 1 year ago

I want to give this one a shot. If it turns out to be beyond me or I don't have the time I will give an update.

obsgolem commented 1 year ago

MR up!

lem0nify commented 1 year ago

when?

igorakkerman commented 9 months ago

I understand that the action is not fully completed yet. But is there a way to remove (all) unused imports at this point already (in VS Code) from any cursor position in the code and without scrolling?

The least disruptive solution I found so far is to open the problems view and to apply the assist on each problem.

ospfranco commented 4 months ago

CleanShot 2024-06-04 at 08 54 10

TIL you can half-way get this functionality. You just need to select the entire imports and then do + . and select remove unused imports

nervenes commented 4 months ago

any update on this? I'm so used to doing cmd + shift + o (which is the shortcut to the vscode "Organize Imports" command) to organize my imports in other languages like python, in rust it seems like this is already happening when you format the document but ideally I'd like to have an option to separate these actions.