aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/source_analyzer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/source_analyzer.rs')
-rw-r--r--crates/ra_hir/src/source_analyzer.rs32
1 files changed, 8 insertions, 24 deletions
diff --git a/crates/ra_hir/src/source_analyzer.rs b/crates/ra_hir/src/source_analyzer.rs
index bff1ecd14..b655e2c32 100644
--- a/crates/ra_hir/src/source_analyzer.rs
+++ b/crates/ra_hir/src/source_analyzer.rs
@@ -25,8 +25,8 @@ use ra_syntax::{
25}; 25};
26 26
27use crate::{ 27use crate::{
28 db::HirDatabase, Adt, Const, EnumVariant, Function, Local, MacroDef, Name, Path, Static, 28 db::HirDatabase, Adt, Const, EnumVariant, Function, Local, MacroDef, Path, Static, Struct,
29 Struct, Trait, Type, TypeAlias, TypeParam, 29 Trait, Type, TypeAlias, TypeParam,
30}; 30};
31 31
32/// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of 32/// `SourceAnalyzer` is a convenience wrapper which exposes HIR API in terms of
@@ -53,22 +53,6 @@ pub enum PathResolution {
53 AssocItem(crate::AssocItem), 53 AssocItem(crate::AssocItem),
54} 54}
55 55
56#[derive(Debug, Clone, PartialEq, Eq)]
57pub struct ScopeEntryWithSyntax {
58 pub(crate) name: Name,
59 pub(crate) ptr: Either<AstPtr<ast::Pat>, AstPtr<ast::SelfParam>>,
60}
61
62impl ScopeEntryWithSyntax {
63 pub fn name(&self) -> &Name {
64 &self.name
65 }
66
67 pub fn ptr(&self) -> Either<AstPtr<ast::Pat>, AstPtr<ast::SelfParam>> {
68 self.ptr
69 }
70}
71
72#[derive(Debug)] 56#[derive(Debug)]
73pub struct ReferenceDescriptor { 57pub struct ReferenceDescriptor {
74 pub range: TextRange, 58 pub range: TextRange,
@@ -235,16 +219,16 @@ impl SourceAnalyzer {
235 resolve_hir_path(db, &self.resolver, &hir_path) 219 resolve_hir_path(db, &self.resolver, &hir_path)
236 } 220 }
237 221
238 fn resolve_local_name(&self, name_ref: &ast::NameRef) -> Option<ScopeEntryWithSyntax> { 222 fn resolve_local_name(
223 &self,
224 name_ref: &ast::NameRef,
225 ) -> Option<Either<AstPtr<ast::Pat>, AstPtr<ast::SelfParam>>> {
239 let name = name_ref.as_name(); 226 let name = name_ref.as_name();
240 let source_map = self.body_source_map.as_ref()?; 227 let source_map = self.body_source_map.as_ref()?;
241 let scopes = self.scopes.as_ref()?; 228 let scopes = self.scopes.as_ref()?;
242 let scope = scope_for(scopes, source_map, InFile::new(self.file_id, name_ref.syntax()))?; 229 let scope = scope_for(scopes, source_map, InFile::new(self.file_id, name_ref.syntax()))?;
243 let entry = scopes.resolve_name_in_scope(scope, &name)?; 230 let entry = scopes.resolve_name_in_scope(scope, &name)?;
244 Some(ScopeEntryWithSyntax { 231 Some(source_map.pat_syntax(entry.pat())?.value)
245 name: entry.name().clone(),
246 ptr: source_map.pat_syntax(entry.pat())?.value,
247 })
248 } 232 }
249 233
250 // FIXME: we only use this in `inline_local_variable` assist, ideally, we 234 // FIXME: we only use this in `inline_local_variable` assist, ideally, we
@@ -258,7 +242,7 @@ impl SourceAnalyzer {
258 .filter_map(ast::NameRef::cast) 242 .filter_map(ast::NameRef::cast)
259 .filter(|name_ref| match self.resolve_local_name(&name_ref) { 243 .filter(|name_ref| match self.resolve_local_name(&name_ref) {
260 None => false, 244 None => false,
261 Some(entry) => entry.ptr() == ptr, 245 Some(d_ptr) => d_ptr == ptr,
262 }) 246 })
263 .map(|name_ref| ReferenceDescriptor { 247 .map(|name_ref| ReferenceDescriptor {
264 name: name_ref.text().to_string(), 248 name: name_ref.text().to_string(),