diff options
Diffstat (limited to 'crates/ra_hir/src/resolve.rs')
-rw-r--r-- | crates/ra_hir/src/resolve.rs | 42 |
1 files changed, 15 insertions, 27 deletions
diff --git a/crates/ra_hir/src/resolve.rs b/crates/ra_hir/src/resolve.rs index 707556ef8..3874e28bf 100644 --- a/crates/ra_hir/src/resolve.rs +++ b/crates/ra_hir/src/resolve.rs | |||
@@ -1,16 +1,12 @@ | |||
1 | //! Name resolution. | 1 | //! Name resolution. |
2 | use std::sync::Arc; | 2 | use std::sync::Arc; |
3 | 3 | ||
4 | use ra_syntax::ast; | 4 | use rustc_hash::{FxHashMap, FxHashSet}; |
5 | |||
6 | use rustc_hash::FxHashMap; | ||
7 | 5 | ||
8 | use crate::{ | 6 | use crate::{ |
9 | ModuleDef, Trait, | 7 | ModuleDef, Trait, |
10 | code_model_api::Crate, | 8 | code_model_api::Crate, |
11 | MacroCallId, | 9 | MacroDefId, |
12 | MacroCallLoc, | ||
13 | AstId, | ||
14 | db::HirDatabase, | 10 | db::HirDatabase, |
15 | name::{Name, KnownName}, | 11 | name::{Name, KnownName}, |
16 | nameres::{PerNs, CrateDefMap, CrateModuleId}, | 12 | nameres::{PerNs, CrateDefMap, CrateModuleId}, |
@@ -134,16 +130,9 @@ impl Resolver { | |||
134 | resolution | 130 | resolution |
135 | } | 131 | } |
136 | 132 | ||
137 | pub fn resolve_macro_call( | 133 | pub(crate) fn resolve_macro_call(&self, path: Option<Path>) -> Option<MacroDefId> { |
138 | &self, | ||
139 | db: &impl HirDatabase, | ||
140 | path: Option<Path>, | ||
141 | ast_id: AstId<ast::MacroCall>, | ||
142 | ) -> Option<MacroCallId> { | ||
143 | let name = path.and_then(|path| path.expand_macro_expr()).unwrap_or_else(Name::missing); | 134 | let name = path.and_then(|path| path.expand_macro_expr()).unwrap_or_else(Name::missing); |
144 | let def_id = self.module().and_then(|(module, _)| module.find_macro(&name))?; | 135 | self.module()?.0.find_macro(&name) |
145 | let call_loc = MacroCallLoc { def: *def_id, ast_id }.id(db); | ||
146 | Some(call_loc) | ||
147 | } | 136 | } |
148 | 137 | ||
149 | /// Returns the resolved path segments | 138 | /// Returns the resolved path segments |
@@ -193,19 +182,18 @@ impl Resolver { | |||
193 | names | 182 | names |
194 | } | 183 | } |
195 | 184 | ||
196 | pub(crate) fn traits_in_scope<'a>(&'a self) -> impl Iterator<Item = Trait> + 'a { | 185 | pub(crate) fn traits_in_scope(&self, db: &impl HirDatabase) -> FxHashSet<Trait> { |
197 | // FIXME prelude | 186 | let mut traits = FxHashSet::default(); |
198 | self.scopes | 187 | for scope in &self.scopes { |
199 | .iter() | 188 | if let Scope::ModuleScope(m) = scope { |
200 | .rev() | 189 | if let Some(prelude) = m.crate_def_map.prelude() { |
201 | .flat_map(|scope| { | 190 | let prelude_def_map = db.crate_def_map(prelude.krate); |
202 | match scope { | 191 | traits.extend(prelude_def_map[prelude.module_id].scope.traits()); |
203 | Scope::ModuleScope(m) => Some(m.crate_def_map[m.module_id].scope.traits()), | ||
204 | _ => None, | ||
205 | } | 192 | } |
206 | .into_iter() | 193 | traits.extend(m.crate_def_map[m.module_id].scope.traits()); |
207 | }) | 194 | } |
208 | .flatten() | 195 | } |
196 | traits | ||
209 | } | 197 | } |
210 | 198 | ||
211 | fn module(&self) -> Option<(&CrateDefMap, CrateModuleId)> { | 199 | fn module(&self) -> Option<(&CrateDefMap, CrateModuleId)> { |