diff options
Diffstat (limited to 'crates/ssr')
-rw-r--r-- | crates/ssr/src/resolving.rs | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/crates/ssr/src/resolving.rs b/crates/ssr/src/resolving.rs index 020fd7994..4441fb426 100644 --- a/crates/ssr/src/resolving.rs +++ b/crates/ssr/src/resolving.rs | |||
@@ -10,7 +10,6 @@ use test_utils::mark; | |||
10 | 10 | ||
11 | pub(crate) struct ResolutionScope<'db> { | 11 | pub(crate) struct ResolutionScope<'db> { |
12 | scope: hir::SemanticsScope<'db>, | 12 | scope: hir::SemanticsScope<'db>, |
13 | hygiene: hir::Hygiene, | ||
14 | node: SyntaxNode, | 13 | node: SyntaxNode, |
15 | } | 14 | } |
16 | 15 | ||
@@ -201,11 +200,7 @@ impl<'db> ResolutionScope<'db> { | |||
201 | .unwrap_or_else(|| file.syntax().clone()); | 200 | .unwrap_or_else(|| file.syntax().clone()); |
202 | let node = pick_node_for_resolution(node); | 201 | let node = pick_node_for_resolution(node); |
203 | let scope = sema.scope(&node); | 202 | let scope = sema.scope(&node); |
204 | ResolutionScope { | 203 | ResolutionScope { scope, node } |
205 | scope, | ||
206 | hygiene: hir::Hygiene::new(sema.db, resolve_context.file_id.into()), | ||
207 | node, | ||
208 | } | ||
209 | } | 204 | } |
210 | 205 | ||
211 | /// Returns the function in which SSR was invoked, if any. | 206 | /// Returns the function in which SSR was invoked, if any. |
@@ -214,24 +209,31 @@ impl<'db> ResolutionScope<'db> { | |||
214 | } | 209 | } |
215 | 210 | ||
216 | fn resolve_path(&self, path: &ast::Path) -> Option<hir::PathResolution> { | 211 | fn resolve_path(&self, path: &ast::Path) -> Option<hir::PathResolution> { |
217 | let hir_path = hir::Path::from_src(path.clone(), &self.hygiene)?; | ||
218 | // First try resolving the whole path. This will work for things like | 212 | // First try resolving the whole path. This will work for things like |
219 | // `std::collections::HashMap`, but will fail for things like | 213 | // `std::collections::HashMap`, but will fail for things like |
220 | // `std::collections::HashMap::new`. | 214 | // `std::collections::HashMap::new`. |
221 | if let Some(resolution) = self.scope.resolve_hir_path(&hir_path) { | 215 | if let Some(resolution) = self.scope.resolve_hypothetical(&path) { |
222 | return Some(resolution); | 216 | return Some(resolution); |
223 | } | 217 | } |
224 | // Resolution failed, try resolving the qualifier (e.g. `std::collections::HashMap` and if | 218 | // Resolution failed, try resolving the qualifier (e.g. `std::collections::HashMap` and if |
225 | // that succeeds, then iterate through the candidates on the resolved type with the provided | 219 | // that succeeds, then iterate through the candidates on the resolved type with the provided |
226 | // name. | 220 | // name. |
227 | let resolved_qualifier = self.scope.resolve_hir_path_qualifier(&hir_path.qualifier()?)?; | 221 | let resolved_qualifier = self.scope.resolve_hypothetical(&path.qualifier()?)?; |
228 | if let hir::PathResolution::Def(hir::ModuleDef::Adt(adt)) = resolved_qualifier { | 222 | if let hir::PathResolution::Def(hir::ModuleDef::Adt(adt)) = resolved_qualifier { |
223 | let name = path.segment()?.name_ref()?; | ||
229 | adt.ty(self.scope.db).iterate_path_candidates( | 224 | adt.ty(self.scope.db).iterate_path_candidates( |
230 | self.scope.db, | 225 | self.scope.db, |
231 | self.scope.module()?.krate(), | 226 | self.scope.module()?.krate(), |
232 | &self.scope.traits_in_scope(), | 227 | &self.scope.traits_in_scope(), |
233 | Some(hir_path.segments().last()?.name), | 228 | None, |
234 | |_ty, assoc_item| Some(hir::PathResolution::AssocItem(assoc_item)), | 229 | |_ty, assoc_item| { |
230 | let item_name = assoc_item.name(self.scope.db)?; | ||
231 | if item_name.to_string().as_str() == name.text().as_str() { | ||
232 | Some(hir::PathResolution::AssocItem(assoc_item)) | ||
233 | } else { | ||
234 | None | ||
235 | } | ||
236 | }, | ||
235 | ) | 237 | ) |
236 | } else { | 238 | } else { |
237 | None | 239 | None |