diff options
Diffstat (limited to 'crates/ra_hir/src/expr')
-rw-r--r-- | crates/ra_hir/src/expr/scope.rs | 38 |
1 files changed, 9 insertions, 29 deletions
diff --git a/crates/ra_hir/src/expr/scope.rs b/crates/ra_hir/src/expr/scope.rs index 887ad8dd8..23f1c5e7f 100644 --- a/crates/ra_hir/src/expr/scope.rs +++ b/crates/ra_hir/src/expr/scope.rs | |||
@@ -62,25 +62,11 @@ impl ExprScopes { | |||
62 | &self.scopes[scope].entries | 62 | &self.scopes[scope].entries |
63 | } | 63 | } |
64 | 64 | ||
65 | pub fn scope_chain_for<'a>(&'a self, expr: ExprId) -> impl Iterator<Item = ScopeId> + 'a { | 65 | pub fn scope_chain_for<'a>( |
66 | generate(self.scope_for(expr), move |&scope| { | ||
67 | self.scopes[scope].parent | ||
68 | }) | ||
69 | } | ||
70 | |||
71 | pub fn resolve_local_name<'a>( | ||
72 | &'a self, | 66 | &'a self, |
73 | context_expr: ExprId, | 67 | scope: Option<ScopeId>, |
74 | name: Name, | 68 | ) -> impl Iterator<Item = ScopeId> + 'a { |
75 | ) -> Option<&'a ScopeEntry> { | 69 | generate(scope, move |&scope| self.scopes[scope].parent) |
76 | // TODO replace by Resolver::resolve_name | ||
77 | let mut shadowed = FxHashSet::default(); | ||
78 | let ret = self | ||
79 | .scope_chain_for(context_expr) | ||
80 | .flat_map(|scope| self.entries(scope).iter()) | ||
81 | .filter(|entry| shadowed.insert(entry.name())) | ||
82 | .find(|entry| entry.name() == &name); | ||
83 | ret | ||
84 | } | 70 | } |
85 | 71 | ||
86 | fn root_scope(&mut self) -> ScopeId { | 72 | fn root_scope(&mut self) -> ScopeId { |
@@ -123,7 +109,7 @@ impl ExprScopes { | |||
123 | self.scope_for.insert(node, scope); | 109 | self.scope_for.insert(node, scope); |
124 | } | 110 | } |
125 | 111 | ||
126 | fn scope_for(&self, expr: ExprId) -> Option<ScopeId> { | 112 | pub fn scope_for(&self, expr: ExprId) -> Option<ScopeId> { |
127 | self.scope_for.get(&expr).map(|&scope| scope) | 113 | self.scope_for.get(&expr).map(|&scope| scope) |
128 | } | 114 | } |
129 | } | 115 | } |
@@ -151,18 +137,14 @@ impl ScopeEntryWithSyntax { | |||
151 | } | 137 | } |
152 | 138 | ||
153 | impl ScopesWithSyntaxMapping { | 139 | impl ScopesWithSyntaxMapping { |
154 | pub fn scope_chain<'a>(&'a self, node: &SyntaxNode) -> impl Iterator<Item = ScopeId> + 'a { | 140 | fn scope_chain<'a>(&'a self, node: &SyntaxNode) -> impl Iterator<Item = ScopeId> + 'a { |
155 | generate(self.scope_for(node), move |&scope| { | 141 | generate(self.scope_for(node), move |&scope| { |
156 | self.scopes.scopes[scope].parent | 142 | self.scopes.scopes[scope].parent |
157 | }) | 143 | }) |
158 | } | 144 | } |
159 | 145 | ||
160 | pub fn scope_chain_for_offset<'a>( | 146 | pub fn scope_for_offset<'a>(&'a self, offset: TextUnit) -> Option<ScopeId> { |
161 | &'a self, | 147 | self.scopes |
162 | offset: TextUnit, | ||
163 | ) -> impl Iterator<Item = ScopeId> + 'a { | ||
164 | let scope = self | ||
165 | .scopes | ||
166 | .scope_for | 148 | .scope_for |
167 | .iter() | 149 | .iter() |
168 | .filter_map(|(id, scope)| Some((self.syntax_mapping.expr_syntax(*id)?, scope))) | 150 | .filter_map(|(id, scope)| Some((self.syntax_mapping.expr_syntax(*id)?, scope))) |
@@ -173,9 +155,7 @@ impl ScopesWithSyntaxMapping { | |||
173 | ptr.range().len(), | 155 | ptr.range().len(), |
174 | ) | 156 | ) |
175 | }) | 157 | }) |
176 | .map(|(ptr, scope)| self.adjust(ptr, *scope, offset)); | 158 | .map(|(ptr, scope)| self.adjust(ptr, *scope, offset)) |
177 | |||
178 | generate(scope, move |&scope| self.scopes.scopes[scope].parent) | ||
179 | } | 159 | } |
180 | 160 | ||
181 | // XXX: during completion, cursor might be outside of any particular | 161 | // XXX: during completion, cursor might be outside of any particular |