aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/handlers/auto_import.rs
diff options
context:
space:
mode:
authorKirill Bulatov <[email protected]>2020-03-22 22:19:55 +0000
committerKirill Bulatov <[email protected]>2020-03-24 08:43:00 +0000
commitd221ff4f9e0e270939a2944a2471bc3f027a674b (patch)
tree443bc8ad18e679fe12586153e9c2b35e3706628e /crates/ra_assists/src/handlers/auto_import.rs
parentf9494f114798f66b5f2174cf518a2951a82571d3 (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.rs34
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};
7use ra_ide_db::{imports_locator::ImportsLocator, RootDatabase}; 7use ra_ide_db::{defs::Definition, imports_locator::ImportsLocator, RootDatabase};
8use ra_prof::profile; 8use ra_prof::profile;
9use ra_syntax::{ 9use 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<_>>()