diff options
author | Kirill Bulatov <[email protected]> | 2020-03-22 22:19:55 +0000 |
---|---|---|
committer | Kirill Bulatov <[email protected]> | 2020-03-24 08:43:00 +0000 |
commit | d221ff4f9e0e270939a2944a2471bc3f027a674b (patch) | |
tree | 443bc8ad18e679fe12586153e9c2b35e3706628e /crates/ra_assists/src/handlers/auto_import.rs | |
parent | f9494f114798f66b5f2174cf518a2951a82571d3 (diff) |
Auto import macros
Diffstat (limited to 'crates/ra_assists/src/handlers/auto_import.rs')
-rw-r--r-- | crates/ra_assists/src/handlers/auto_import.rs | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/crates/ra_assists/src/handlers/auto_import.rs b/crates/ra_assists/src/handlers/auto_import.rs index bb280f633..49d8c4c3d 100644 --- a/crates/ra_assists/src/handlers/auto_import.rs +++ b/crates/ra_assists/src/handlers/auto_import.rs | |||
@@ -4,7 +4,7 @@ use hir::{ | |||
4 | AsAssocItem, AssocItemContainer, ModPath, Module, ModuleDef, PathResolution, Semantics, Trait, | 4 | AsAssocItem, AssocItemContainer, ModPath, Module, ModuleDef, PathResolution, Semantics, Trait, |
5 | Type, | 5 | Type, |
6 | }; | 6 | }; |
7 | use ra_ide_db::{imports_locator::ImportsLocator, RootDatabase}; | 7 | use ra_ide_db::{defs::Definition, imports_locator::ImportsLocator, RootDatabase}; |
8 | use ra_prof::profile; | 8 | use ra_prof::profile; |
9 | use ra_syntax::{ | 9 | use ra_syntax::{ |
10 | ast::{self, AstNode}, | 10 | ast::{self, AstNode}, |
@@ -127,14 +127,16 @@ impl AutoImportAssets { | |||
127 | ImportsLocator::new(db) | 127 | ImportsLocator::new(db) |
128 | .find_imports(&self.get_search_query()) | 128 | .find_imports(&self.get_search_query()) |
129 | .into_iter() | 129 | .into_iter() |
130 | .filter_map(|module_def| match &self.import_candidate { | 130 | .filter_map(|definition| match &self.import_candidate { |
131 | ImportCandidate::TraitAssocItem(assoc_item_type, _) => { | 131 | ImportCandidate::TraitAssocItem(assoc_item_type, _) => { |
132 | let located_assoc_item = match module_def { | 132 | let located_assoc_item = match definition { |
133 | ModuleDef::Function(located_function) => located_function | 133 | Definition::ModuleDef(ModuleDef::Function(located_function)) => { |
134 | .as_assoc_item(db) | 134 | located_function |
135 | .map(|assoc| assoc.container(db)) | 135 | .as_assoc_item(db) |
136 | .and_then(Self::assoc_to_trait), | 136 | .map(|assoc| assoc.container(db)) |
137 | ModuleDef::Const(located_const) => located_const | 137 | .and_then(Self::assoc_to_trait) |
138 | } | ||
139 | Definition::ModuleDef(ModuleDef::Const(located_const)) => located_const | ||
138 | .as_assoc_item(db) | 140 | .as_assoc_item(db) |
139 | .map(|assoc| assoc.container(db)) | 141 | .map(|assoc| assoc.container(db)) |
140 | .and_then(Self::assoc_to_trait), | 142 | .and_then(Self::assoc_to_trait), |
@@ -152,11 +154,13 @@ impl AutoImportAssets { | |||
152 | None, | 154 | None, |
153 | |_, assoc| Self::assoc_to_trait(assoc.container(db)), | 155 | |_, assoc| Self::assoc_to_trait(assoc.container(db)), |
154 | ) | 156 | ) |
155 | .map(ModuleDef::from) | 157 | .map(|located_trait| ModuleDef::from(located_trait).into()) |
156 | } | 158 | } |
157 | ImportCandidate::TraitMethod(function_callee, _) => { | 159 | ImportCandidate::TraitMethod(function_callee, _) => { |
158 | let located_assoc_item = | 160 | let located_assoc_item = |
159 | if let ModuleDef::Function(located_function) = module_def { | 161 | if let Definition::ModuleDef(ModuleDef::Function(located_function)) = |
162 | definition | ||
163 | { | ||
160 | located_function | 164 | located_function |
161 | .as_assoc_item(db) | 165 | .as_assoc_item(db) |
162 | .map(|assoc| assoc.container(db)) | 166 | .map(|assoc| assoc.container(db)) |
@@ -178,11 +182,15 @@ impl AutoImportAssets { | |||
178 | Self::assoc_to_trait(function.as_assoc_item(db)?.container(db)) | 182 | Self::assoc_to_trait(function.as_assoc_item(db)?.container(db)) |
179 | }, | 183 | }, |
180 | ) | 184 | ) |
181 | .map(ModuleDef::from) | 185 | .map(|located_trait| ModuleDef::from(located_trait).into()) |
182 | } | 186 | } |
183 | _ => Some(module_def), | 187 | _ => match definition { |
188 | Definition::ModuleDef(module_def) => Some(module_def.into()), | ||
189 | Definition::Macro(macro_def) => Some(macro_def.into()), | ||
190 | _ => None, | ||
191 | }, | ||
184 | }) | 192 | }) |
185 | .filter_map(|module_def| self.module_with_name_to_import.find_use_path(db, module_def)) | 193 | .filter_map(|item| self.module_with_name_to_import.find_use_path(db, item)) |
186 | .filter(|use_path| !use_path.segments.is_empty()) | 194 | .filter(|use_path| !use_path.segments.is_empty()) |
187 | .take(20) | 195 | .take(20) |
188 | .collect::<BTreeSet<_>>() | 196 | .collect::<BTreeSet<_>>() |