aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_assists/src/utils.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_assists/src/utils.rs')
-rw-r--r--crates/ra_assists/src/utils.rs35
1 files changed, 28 insertions, 7 deletions
diff --git a/crates/ra_assists/src/utils.rs b/crates/ra_assists/src/utils.rs
index 9af27180b..0038a9764 100644
--- a/crates/ra_assists/src/utils.rs
+++ b/crates/ra_assists/src/utils.rs
@@ -3,7 +3,7 @@ pub(crate) mod insert_use;
3 3
4use std::{iter, ops}; 4use std::{iter, ops};
5 5
6use hir::{Adt, Crate, Semantics, Trait, Type}; 6use hir::{Adt, Crate, Enum, ScopeDef, Semantics, Trait, Type};
7use ra_ide_db::RootDatabase; 7use ra_ide_db::RootDatabase;
8use ra_syntax::{ 8use ra_syntax::{
9 ast::{self, make, NameOwner}, 9 ast::{self, make, NameOwner},
@@ -200,13 +200,19 @@ impl FamousDefs<'_, '_> {
200 #[cfg(test)] 200 #[cfg(test)]
201 pub(crate) const FIXTURE: &'static str = r#" 201 pub(crate) const FIXTURE: &'static str = r#"
202//- /libcore.rs crate:core 202//- /libcore.rs crate:core
203pub mod convert{ 203pub mod convert {
204 pub trait From<T> { 204 pub trait From<T> {
205 fn from(T) -> Self; 205 fn from(T) -> Self;
206 } 206 }
207} 207}
208 208
209pub mod prelude { pub use crate::convert::From } 209pub mod option {
210 pub enum Option<T> { None, Some(T)}
211}
212
213pub mod prelude {
214 pub use crate::{convert::From, option::Option::{self, *}};
215}
210#[prelude_import] 216#[prelude_import]
211pub use prelude::*; 217pub use prelude::*;
212"#; 218"#;
@@ -215,7 +221,25 @@ pub use prelude::*;
215 self.find_trait("core:convert:From") 221 self.find_trait("core:convert:From")
216 } 222 }
217 223
224 pub(crate) fn core_option_Option(&self) -> Option<Enum> {
225 self.find_enum("core:option:Option")
226 }
227
218 fn find_trait(&self, path: &str) -> Option<Trait> { 228 fn find_trait(&self, path: &str) -> Option<Trait> {
229 match self.find_def(path)? {
230 hir::ScopeDef::ModuleDef(hir::ModuleDef::Trait(it)) => Some(it),
231 _ => None,
232 }
233 }
234
235 fn find_enum(&self, path: &str) -> Option<Enum> {
236 match self.find_def(path)? {
237 hir::ScopeDef::ModuleDef(hir::ModuleDef::Adt(hir::Adt::Enum(it))) => Some(it),
238 _ => None,
239 }
240 }
241
242 fn find_def(&self, path: &str) -> Option<ScopeDef> {
219 let db = self.0.db; 243 let db = self.0.db;
220 let mut path = path.split(':'); 244 let mut path = path.split(':');
221 let trait_ = path.next_back()?; 245 let trait_ = path.next_back()?;
@@ -240,9 +264,6 @@ pub use prelude::*;
240 } 264 }
241 let def = 265 let def =
242 module.scope(db, None).into_iter().find(|(name, _def)| &name.to_string() == trait_)?.1; 266 module.scope(db, None).into_iter().find(|(name, _def)| &name.to_string() == trait_)?.1;
243 match def { 267 Some(def)
244 hir::ScopeDef::ModuleDef(hir::ModuleDef::Trait(it)) => Some(it),
245 _ => None,
246 }
247 } 268 }
248} 269}