diff options
-rw-r--r-- | crates/ra_assists/src/ast_transform.rs | 15 | ||||
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir/src/source_binder.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir_def/src/db.rs | 7 | ||||
-rw-r--r-- | crates/ra_hir_def/src/find_path.rs | 17 | ||||
-rw-r--r-- | crates/ra_hir_def/src/item_scope.rs | 5 | ||||
-rw-r--r-- | crates/ra_hir_def/src/path.rs | 14 | ||||
-rw-r--r-- | crates/ra_hir_def/src/resolver.rs | 14 | ||||
-rw-r--r-- | crates/ra_hir_expand/src/name.rs | 4 |
9 files changed, 35 insertions, 47 deletions
diff --git a/crates/ra_assists/src/ast_transform.rs b/crates/ra_assists/src/ast_transform.rs index 846661587..ace59f290 100644 --- a/crates/ra_assists/src/ast_transform.rs +++ b/crates/ra_assists/src/ast_transform.rs | |||
@@ -60,6 +60,8 @@ impl<'a, DB: HirDatabase> SubstituteTypeParams<'a, DB> { | |||
60 | previous: Box::new(NullTransformer), | 60 | previous: Box::new(NullTransformer), |
61 | }; | 61 | }; |
62 | 62 | ||
63 | // FIXME: It would probably be nicer if we could get this via HIR (i.e. get the | ||
64 | // trait ref, and then go from the types in the substs back to the syntax) | ||
63 | fn get_syntactic_substs(impl_block: ast::ImplBlock) -> Option<Vec<ast::TypeRef>> { | 65 | fn get_syntactic_substs(impl_block: ast::ImplBlock) -> Option<Vec<ast::TypeRef>> { |
64 | let target_trait = impl_block.target_trait()?; | 66 | let target_trait = impl_block.target_trait()?; |
65 | let path_type = match target_trait { | 67 | let path_type = match target_trait { |
@@ -131,12 +133,12 @@ impl<'a, DB: HirDatabase> QualifyPaths<'a, DB> { | |||
131 | let resolution = analyzer.resolve_path(self.db, &p)?; | 133 | let resolution = analyzer.resolve_path(self.db, &p)?; |
132 | match resolution { | 134 | match resolution { |
133 | PathResolution::Def(def) => { | 135 | PathResolution::Def(def) => { |
134 | let found_path = from.find_path(self.db, def)?; | 136 | let found_path = from.find_use_path(self.db, def)?; |
135 | let args = p | 137 | let args = p |
136 | .segment() | 138 | .segment() |
137 | .and_then(|s| s.type_arg_list()) | 139 | .and_then(|s| s.type_arg_list()) |
138 | .map(|arg_list| apply(self, node.with_value(arg_list))); | 140 | .map(|arg_list| apply(self, node.with_value(arg_list))); |
139 | Some(make::path_with_type_arg_list(found_path.to_ast(), args).syntax().clone()) | 141 | Some(make::path_with_type_arg_list(path_to_ast(found_path), args).syntax().clone()) |
140 | } | 142 | } |
141 | PathResolution::Local(_) | 143 | PathResolution::Local(_) |
142 | | PathResolution::TypeParam(_) | 144 | | PathResolution::TypeParam(_) |
@@ -171,8 +173,7 @@ impl<'a, DB: HirDatabase> AstTransform<'a> for QualifyPaths<'a, DB> { | |||
171 | } | 173 | } |
172 | } | 174 | } |
173 | 175 | ||
174 | // FIXME: It would probably be nicer if we could get this via HIR (i.e. get the | 176 | fn path_to_ast(path: hir::ModPath) -> ast::Path { |
175 | // trait ref, and then go from the types in the substs back to the syntax) | 177 | let parse = ast::SourceFile::parse(&path.to_string()); |
176 | // FIXME: This should be a general utility (not even just for assists) | 178 | parse.tree().syntax().descendants().find_map(ast::Path::cast).unwrap() |
177 | 179 | } | |
178 | // FIXME: This should be a general utility (not even just for assists) | ||
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 4da3db0d6..df9c151e5 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -228,7 +228,9 @@ impl Module { | |||
228 | Module::new(self.krate(), module_id) | 228 | Module::new(self.krate(), module_id) |
229 | } | 229 | } |
230 | 230 | ||
231 | pub fn find_path( | 231 | /// Finds a path that can be used to refer to the given item from within |
232 | /// this module, if possible. | ||
233 | pub fn find_use_path( | ||
232 | self, | 234 | self, |
233 | db: &impl DefDatabase, | 235 | db: &impl DefDatabase, |
234 | item: ModuleDef, | 236 | item: ModuleDef, |
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 71339565f..a2a9d968c 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs | |||
@@ -206,7 +206,7 @@ impl SourceAnalyzer { | |||
206 | } | 206 | } |
207 | 207 | ||
208 | pub fn module(&self) -> Option<crate::code_model::Module> { | 208 | pub fn module(&self) -> Option<crate::code_model::Module> { |
209 | Some(crate::code_model::Module { id: self.resolver.module_id()? }) | 209 | Some(crate::code_model::Module { id: self.resolver.module()? }) |
210 | } | 210 | } |
211 | 211 | ||
212 | fn expr_id(&self, expr: &ast::Expr) -> Option<ExprId> { | 212 | fn expr_id(&self, expr: &ast::Expr) -> Option<ExprId> { |
diff --git a/crates/ra_hir_def/src/db.rs b/crates/ra_hir_def/src/db.rs index 0c00627b5..da273eb11 100644 --- a/crates/ra_hir_def/src/db.rs +++ b/crates/ra_hir_def/src/db.rs | |||
@@ -107,13 +107,6 @@ pub trait DefDatabase: InternDatabase + AstDatabase { | |||
107 | // Remove this query completely, in favor of `Attrs::docs` method | 107 | // Remove this query completely, in favor of `Attrs::docs` method |
108 | #[salsa::invoke(Documentation::documentation_query)] | 108 | #[salsa::invoke(Documentation::documentation_query)] |
109 | fn documentation(&self, def: AttrDefId) -> Option<Documentation>; | 109 | fn documentation(&self, def: AttrDefId) -> Option<Documentation>; |
110 | |||
111 | #[salsa::invoke(crate::find_path::importable_locations_in_crate_query)] | ||
112 | fn importable_locations_in_crate( | ||
113 | &self, | ||
114 | item: crate::item_scope::ItemInNs, | ||
115 | krate: CrateId, | ||
116 | ) -> Arc<[(ModuleId, hir_expand::name::Name, crate::visibility::Visibility)]>; | ||
117 | } | 110 | } |
118 | 111 | ||
119 | fn crate_def_map(db: &impl DefDatabase, krate: CrateId) -> Arc<CrateDefMap> { | 112 | fn crate_def_map(db: &impl DefDatabase, krate: CrateId) -> Arc<CrateDefMap> { |
diff --git a/crates/ra_hir_def/src/find_path.rs b/crates/ra_hir_def/src/find_path.rs index 69cdfc943..f7dc8acb7 100644 --- a/crates/ra_hir_def/src/find_path.rs +++ b/crates/ra_hir_def/src/find_path.rs | |||
@@ -34,7 +34,7 @@ fn find_path_inner( | |||
34 | // - if the item is already in scope, return the name under which it is | 34 | // - if the item is already in scope, return the name under which it is |
35 | let def_map = db.crate_def_map(from.krate); | 35 | let def_map = db.crate_def_map(from.krate); |
36 | let from_scope: &crate::item_scope::ItemScope = &def_map.modules[from.local_id].scope; | 36 | let from_scope: &crate::item_scope::ItemScope = &def_map.modules[from.local_id].scope; |
37 | if let Some((name, _)) = from_scope.reverse_get(item) { | 37 | if let Some((name, _)) = from_scope.name_of(item) { |
38 | return Some(ModPath::from_simple_segments(PathKind::Plain, vec![name.clone()])); | 38 | return Some(ModPath::from_simple_segments(PathKind::Plain, vec![name.clone()])); |
39 | } | 39 | } |
40 | 40 | ||
@@ -77,7 +77,7 @@ fn find_path_inner( | |||
77 | let prelude_def_map = db.crate_def_map(prelude_module.krate); | 77 | let prelude_def_map = db.crate_def_map(prelude_module.krate); |
78 | let prelude_scope: &crate::item_scope::ItemScope = | 78 | let prelude_scope: &crate::item_scope::ItemScope = |
79 | &prelude_def_map.modules[prelude_module.local_id].scope; | 79 | &prelude_def_map.modules[prelude_module.local_id].scope; |
80 | if let Some((name, vis)) = prelude_scope.reverse_get(item) { | 80 | if let Some((name, vis)) = prelude_scope.name_of(item) { |
81 | if vis.is_visible_from(db, from) { | 81 | if vis.is_visible_from(db, from) { |
82 | return Some(ModPath::from_simple_segments(PathKind::Plain, vec![name.clone()])); | 82 | return Some(ModPath::from_simple_segments(PathKind::Plain, vec![name.clone()])); |
83 | } | 83 | } |
@@ -146,7 +146,7 @@ fn find_importable_locations( | |||
146 | .chain(crate_graph.dependencies(from.krate).map(|dep| dep.crate_id)) | 146 | .chain(crate_graph.dependencies(from.krate).map(|dep| dep.crate_id)) |
147 | { | 147 | { |
148 | result.extend( | 148 | result.extend( |
149 | db.importable_locations_in_crate(item, krate) | 149 | importable_locations_in_crate(db, item, krate) |
150 | .iter() | 150 | .iter() |
151 | .filter(|(_, _, vis)| vis.is_visible_from(db, from)) | 151 | .filter(|(_, _, vis)| vis.is_visible_from(db, from)) |
152 | .map(|(m, n, _)| (*m, n.clone())), | 152 | .map(|(m, n, _)| (*m, n.clone())), |
@@ -160,17 +160,16 @@ fn find_importable_locations( | |||
160 | /// non-private `use`s. | 160 | /// non-private `use`s. |
161 | /// | 161 | /// |
162 | /// Note that the crate doesn't need to be the one in which the item is defined; | 162 | /// Note that the crate doesn't need to be the one in which the item is defined; |
163 | /// it might be re-exported in other crates. We cache this as a query since we | 163 | /// it might be re-exported in other crates. |
164 | /// need to walk the whole def map for it. | 164 | fn importable_locations_in_crate( |
165 | pub(crate) fn importable_locations_in_crate_query( | ||
166 | db: &impl DefDatabase, | 165 | db: &impl DefDatabase, |
167 | item: ItemInNs, | 166 | item: ItemInNs, |
168 | krate: CrateId, | 167 | krate: CrateId, |
169 | ) -> std::sync::Arc<[(ModuleId, Name, Visibility)]> { | 168 | ) -> Vec<(ModuleId, Name, Visibility)> { |
170 | let def_map = db.crate_def_map(krate); | 169 | let def_map = db.crate_def_map(krate); |
171 | let mut result = Vec::new(); | 170 | let mut result = Vec::new(); |
172 | for (local_id, data) in def_map.modules.iter() { | 171 | for (local_id, data) in def_map.modules.iter() { |
173 | if let Some((name, vis)) = data.scope.reverse_get(item) { | 172 | if let Some((name, vis)) = data.scope.name_of(item) { |
174 | let is_private = if let Visibility::Module(private_to) = vis { | 173 | let is_private = if let Visibility::Module(private_to) = vis { |
175 | private_to.local_id == local_id | 174 | private_to.local_id == local_id |
176 | } else { | 175 | } else { |
@@ -192,7 +191,7 @@ pub(crate) fn importable_locations_in_crate_query( | |||
192 | result.push((ModuleId { krate, local_id }, name.clone(), vis)); | 191 | result.push((ModuleId { krate, local_id }, name.clone(), vis)); |
193 | } | 192 | } |
194 | } | 193 | } |
195 | result.into() | 194 | result |
196 | } | 195 | } |
197 | 196 | ||
198 | #[cfg(test)] | 197 | #[cfg(test)] |
diff --git a/crates/ra_hir_def/src/item_scope.rs b/crates/ra_hir_def/src/item_scope.rs index 87c50b34f..d74a1cef2 100644 --- a/crates/ra_hir_def/src/item_scope.rs +++ b/crates/ra_hir_def/src/item_scope.rs | |||
@@ -104,7 +104,7 @@ impl ItemScope { | |||
104 | } | 104 | } |
105 | } | 105 | } |
106 | 106 | ||
107 | pub(crate) fn reverse_get(&self, item: ItemInNs) -> Option<(&Name, Visibility)> { | 107 | pub(crate) fn name_of(&self, item: ItemInNs) -> Option<(&Name, Visibility)> { |
108 | for (name, per_ns) in &self.visible { | 108 | for (name, per_ns) in &self.visible { |
109 | if let Some(vis) = item.match_with(*per_ns) { | 109 | if let Some(vis) = item.match_with(*per_ns) { |
110 | return Some((name, vis)); | 110 | return Some((name, vis)); |
@@ -207,8 +207,7 @@ impl ItemInNs { | |||
207 | 207 | ||
208 | pub fn as_module_def_id(self) -> Option<ModuleDefId> { | 208 | pub fn as_module_def_id(self) -> Option<ModuleDefId> { |
209 | match self { | 209 | match self { |
210 | ItemInNs::Types(t) => Some(t), | 210 | ItemInNs::Types(id) | ItemInNs::Values(id) => Some(id), |
211 | ItemInNs::Values(v) => Some(v), | ||
212 | ItemInNs::Macros(_) => None, | 211 | ItemInNs::Macros(_) => None, |
213 | } | 212 | } |
214 | } | 213 | } |
diff --git a/crates/ra_hir_def/src/path.rs b/crates/ra_hir_def/src/path.rs index 7dd1939b9..9f93a5424 100644 --- a/crates/ra_hir_def/src/path.rs +++ b/crates/ra_hir_def/src/path.rs | |||
@@ -1,7 +1,11 @@ | |||
1 | //! A desugared representation of paths like `crate::foo` or `<Type as Trait>::bar`. | 1 | //! A desugared representation of paths like `crate::foo` or `<Type as Trait>::bar`. |
2 | mod lower; | 2 | mod lower; |
3 | 3 | ||
4 | use std::{fmt::Display, iter, sync::Arc}; | 4 | use std::{ |
5 | fmt::{self, Display}, | ||
6 | iter, | ||
7 | sync::Arc, | ||
8 | }; | ||
5 | 9 | ||
6 | use hir_expand::{ | 10 | use hir_expand::{ |
7 | hygiene::Hygiene, | 11 | hygiene::Hygiene, |
@@ -78,12 +82,6 @@ impl ModPath { | |||
78 | } | 82 | } |
79 | self.segments.first() | 83 | self.segments.first() |
80 | } | 84 | } |
81 | |||
82 | pub fn to_ast(&self) -> ast::Path { | ||
83 | use ast::AstNode; | ||
84 | let parse = ast::SourceFile::parse(&self.to_string()); | ||
85 | parse.tree().syntax().descendants().find_map(ast::Path::cast).unwrap() | ||
86 | } | ||
87 | } | 85 | } |
88 | 86 | ||
89 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 87 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
@@ -255,7 +253,7 @@ impl From<Name> for ModPath { | |||
255 | } | 253 | } |
256 | 254 | ||
257 | impl Display for ModPath { | 255 | impl Display for ModPath { |
258 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | 256 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
259 | let mut first_segment = true; | 257 | let mut first_segment = true; |
260 | let mut add_segment = |s| { | 258 | let mut add_segment = |s| { |
261 | if !first_segment { | 259 | if !first_segment { |
diff --git a/crates/ra_hir_def/src/resolver.rs b/crates/ra_hir_def/src/resolver.rs index 40d0cb588..f7bac5801 100644 --- a/crates/ra_hir_def/src/resolver.rs +++ b/crates/ra_hir_def/src/resolver.rs | |||
@@ -128,7 +128,7 @@ impl Resolver { | |||
128 | path: &ModPath, | 128 | path: &ModPath, |
129 | shadow: BuiltinShadowMode, | 129 | shadow: BuiltinShadowMode, |
130 | ) -> PerNs { | 130 | ) -> PerNs { |
131 | let (item_map, module) = match self.module() { | 131 | let (item_map, module) = match self.module_scope() { |
132 | Some(it) => it, | 132 | Some(it) => it, |
133 | None => return PerNs::none(), | 133 | None => return PerNs::none(), |
134 | }; | 134 | }; |
@@ -239,7 +239,7 @@ impl Resolver { | |||
239 | ) -> Option<Visibility> { | 239 | ) -> Option<Visibility> { |
240 | match visibility { | 240 | match visibility { |
241 | RawVisibility::Module(_) => { | 241 | RawVisibility::Module(_) => { |
242 | let (item_map, module) = match self.module() { | 242 | let (item_map, module) = match self.module_scope() { |
243 | Some(it) => it, | 243 | Some(it) => it, |
244 | None => return None, | 244 | None => return None, |
245 | }; | 245 | }; |
@@ -379,7 +379,7 @@ impl Resolver { | |||
379 | db: &impl DefDatabase, | 379 | db: &impl DefDatabase, |
380 | path: &ModPath, | 380 | path: &ModPath, |
381 | ) -> Option<MacroDefId> { | 381 | ) -> Option<MacroDefId> { |
382 | let (item_map, module) = self.module()?; | 382 | let (item_map, module) = self.module_scope()?; |
383 | item_map.resolve_path(db, module, &path, BuiltinShadowMode::Other).0.take_macros() | 383 | item_map.resolve_path(db, module, &path, BuiltinShadowMode::Other).0.take_macros() |
384 | } | 384 | } |
385 | 385 | ||
@@ -403,7 +403,7 @@ impl Resolver { | |||
403 | traits | 403 | traits |
404 | } | 404 | } |
405 | 405 | ||
406 | fn module(&self) -> Option<(&CrateDefMap, LocalModuleId)> { | 406 | fn module_scope(&self) -> Option<(&CrateDefMap, LocalModuleId)> { |
407 | self.scopes.iter().rev().find_map(|scope| match scope { | 407 | self.scopes.iter().rev().find_map(|scope| match scope { |
408 | Scope::ModuleScope(m) => Some((&*m.crate_def_map, m.module_id)), | 408 | Scope::ModuleScope(m) => Some((&*m.crate_def_map, m.module_id)), |
409 | 409 | ||
@@ -411,13 +411,13 @@ impl Resolver { | |||
411 | }) | 411 | }) |
412 | } | 412 | } |
413 | 413 | ||
414 | pub fn module_id(&self) -> Option<ModuleId> { | 414 | pub fn module(&self) -> Option<ModuleId> { |
415 | let (def_map, local_id) = self.module()?; | 415 | let (def_map, local_id) = self.module_scope()?; |
416 | Some(ModuleId { krate: def_map.krate, local_id }) | 416 | Some(ModuleId { krate: def_map.krate, local_id }) |
417 | } | 417 | } |
418 | 418 | ||
419 | pub fn krate(&self) -> Option<CrateId> { | 419 | pub fn krate(&self) -> Option<CrateId> { |
420 | self.module().map(|t| t.0.krate) | 420 | self.module_scope().map(|t| t.0.krate) |
421 | } | 421 | } |
422 | 422 | ||
423 | pub fn where_predicates_in_scope<'a>( | 423 | pub fn where_predicates_in_scope<'a>( |
diff --git a/crates/ra_hir_expand/src/name.rs b/crates/ra_hir_expand/src/name.rs index a4d912b99..b3fa1efba 100644 --- a/crates/ra_hir_expand/src/name.rs +++ b/crates/ra_hir_expand/src/name.rs | |||
@@ -37,10 +37,6 @@ impl Name { | |||
37 | Name(Repr::TupleField(idx)) | 37 | Name(Repr::TupleField(idx)) |
38 | } | 38 | } |
39 | 39 | ||
40 | pub fn for_crate_dependency(dep: &ra_db::Dependency) -> Name { | ||
41 | Name::new_text(dep.name.clone()) | ||
42 | } | ||
43 | |||
44 | /// Shortcut to create inline plain text name | 40 | /// Shortcut to create inline plain text name |
45 | const fn new_inline_ascii(text: &[u8]) -> Name { | 41 | const fn new_inline_ascii(text: &[u8]) -> Name { |
46 | Name::new_text(SmolStr::new_inline_from_ascii(text.len(), text)) | 42 | Name::new_text(SmolStr::new_inline_from_ascii(text.len(), text)) |