diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-01-27 13:04:53 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2020-01-27 13:04:53 +0000 |
commit | 4f9506416c95bbf4fbd46c6dafb13bb30bb2feee (patch) | |
tree | 38e8d121c8a9790d2e3f2ab83c8dcb0a778681cd /docs/user | |
parent | a108f22d835c8d67c93c66758d89371fff179b9a (diff) | |
parent | 9be1ab7ff948d89334a8acbc309c8235d4ab374f (diff) |
Merge #2887
2887: Initial auto import action implementation r=matklad a=SomeoneToIgnore
Closes https://github.com/rust-analyzer/rust-analyzer/issues/2180
Adds an auto import action implementation.
This implementation is not ideal and has a few limitations:
* The import search functionality should be moved into a separate crate accessible from ra_assists.
This requires a lot of changes and a preliminary design.
Currently the functionality is provided as a trait impl, more on that here: https://github.com/rust-analyzer/rust-analyzer/issues/2180#issuecomment-575690942
* Due to the design desicion from the previous item, no doctests are run for the new aciton (look for a new FIXME in the PR)
* For the same reason, I have to create the mock trait implementaion to test the assist
* Ideally, I think we should have this feature as a diagnostics (that detects an absense of an import) that has a corresponding quickfix action that gets evaluated on demand.
Curretly we perform the import search every time we resolve the import which looks suboptimal.
This requires `classify_name_ref` to be moved from ra_ide, so not done currently.
A few improvements to the imports mechanism to be considered later:
* Constants like `ra_syntax::SyntaxKind::NAME` are not imported, because they are not present in the database
* Method usages are not imported, they are found in the database, but `find_use_path` does not return any import paths for them
* Some import paths returned by the `find_use_path` method end up in `core::` or `alloc::` instead of `std:`, for example: `core::fmt::Debug` instead of `std::fmt::Debug`.
This is not an error techically, but still looks weird.
* No detection of cases where a trait should be imported in order to be able to call a method
* Improve `auto_import_text_edit` functionality: refactor it and move away from the place it is now, add better logic for merging the new import with already existing imports
Co-authored-by: Kirill Bulatov <[email protected]>
Diffstat (limited to 'docs/user')
-rw-r--r-- | docs/user/assists.md | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/docs/user/assists.md b/docs/user/assists.md index ecf206f71..c36c5df6a 100644 --- a/docs/user/assists.md +++ b/docs/user/assists.md | |||
@@ -209,6 +209,24 @@ fn main() { | |||
209 | } | 209 | } |
210 | ``` | 210 | ``` |
211 | 211 | ||
212 | ## `auto_import` | ||
213 | |||
214 | If the name is unresolved, provides all possible imports for it. | ||
215 | |||
216 | ```rust | ||
217 | // BEFORE | ||
218 | fn main() { | ||
219 | let map = HashMap┃::new(); | ||
220 | } | ||
221 | |||
222 | // AFTER | ||
223 | use std::collections::HashMap; | ||
224 | |||
225 | fn main() { | ||
226 | let map = HashMap┃::new(); | ||
227 | } | ||
228 | ``` | ||
229 | |||
212 | ## `change_visibility` | 230 | ## `change_visibility` |
213 | 231 | ||
214 | Adds or changes existing visibility specifier. | 232 | Adds or changes existing visibility specifier. |