aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/source_binder.rs
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2019-02-01 22:06:57 +0000
committerFlorian Diebold <[email protected]>2019-02-01 22:24:26 +0000
commitc5852f422ff45adaa21815c1a15e03b067a56a82 (patch)
treec53ff3531cbbad182e821eb92fa9ad201d2bff0c /crates/ra_hir/src/source_binder.rs
parentd571d26955148befd6986008a5112fff3a901c43 (diff)
Some cleanup and additional tests
Diffstat (limited to 'crates/ra_hir/src/source_binder.rs')
-rw-r--r--crates/ra_hir/src/source_binder.rs21
1 files changed, 17 insertions, 4 deletions
diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs
index ce929cf3e..59f782277 100644
--- a/crates/ra_hir/src/source_binder.rs
+++ b/crates/ra_hir/src/source_binder.rs
@@ -204,12 +204,13 @@ pub fn macro_symbols(db: &impl HirDatabase, file_id: FileId) -> Vec<(SmolStr, Te
204} 204}
205 205
206pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> Resolver { 206pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> Resolver {
207 let file = db.parse(position.file_id); 207 let file_id = position.file_id;
208 let file = db.parse(file_id);
208 find_leaf_at_offset(file.syntax(), position.offset) 209 find_leaf_at_offset(file.syntax(), position.offset)
209 .find_map(|node| { 210 .find_map(|node| {
210 node.ancestors().find_map(|node| { 211 node.ancestors().find_map(|node| {
211 if ast::Expr::cast(node).is_some() || ast::Block::cast(node).is_some() { 212 if ast::Expr::cast(node).is_some() || ast::Block::cast(node).is_some() {
212 if let Some(func) = function_from_child_node(db, position.file_id, node) { 213 if let Some(func) = function_from_child_node(db, file_id, node) {
213 let scopes = func.scopes(db); 214 let scopes = func.scopes(db);
214 let scope = scopes.scope_for_offset(position.offset); 215 let scope = scopes.scope_for_offset(position.offset);
215 Some(expr::resolver_for_scope(func.body(db), db, scope)) 216 Some(expr::resolver_for_scope(func.body(db), db, scope))
@@ -218,9 +219,15 @@ pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> R
218 None 219 None
219 } 220 }
220 } else if let Some(module) = ast::Module::cast(node) { 221 } else if let Some(module) = ast::Module::cast(node) {
221 Some(module_from_declaration(db, position.file_id, module)?.resolver(db)) 222 Some(module_from_declaration(db, file_id, module)?.resolver(db))
222 } else if let Some(_) = ast::SourceFile::cast(node) { 223 } else if let Some(_) = ast::SourceFile::cast(node) {
223 Some(module_from_source(db, position.file_id.into(), None)?.resolver(db)) 224 Some(module_from_source(db, file_id.into(), None)?.resolver(db))
225 } else if let Some(s) = ast::StructDef::cast(node) {
226 let module = module_from_child_node(db, file_id, s.syntax())?;
227 Some(struct_from_module(db, module, s).resolver(db))
228 } else if let Some(e) = ast::EnumDef::cast(node) {
229 let module = module_from_child_node(db, file_id, e.syntax())?;
230 Some(enum_from_module(db, module, e).resolver(db))
224 } else { 231 } else {
225 // TODO add missing cases 232 // TODO add missing cases
226 None 233 None
@@ -246,6 +253,12 @@ pub fn resolver_for_node(db: &impl HirDatabase, file_id: FileId, node: &SyntaxNo
246 Some(module_from_declaration(db, file_id, module)?.resolver(db)) 253 Some(module_from_declaration(db, file_id, module)?.resolver(db))
247 } else if let Some(_) = ast::SourceFile::cast(node) { 254 } else if let Some(_) = ast::SourceFile::cast(node) {
248 Some(module_from_source(db, file_id.into(), None)?.resolver(db)) 255 Some(module_from_source(db, file_id.into(), None)?.resolver(db))
256 } else if let Some(s) = ast::StructDef::cast(node) {
257 let module = module_from_child_node(db, file_id, s.syntax())?;
258 Some(struct_from_module(db, module, s).resolver(db))
259 } else if let Some(e) = ast::EnumDef::cast(node) {
260 let module = module_from_child_node(db, file_id, e.syntax())?;
261 Some(enum_from_module(db, module, e).resolver(db))
249 } else { 262 } else {
250 // TODO add missing cases 263 // TODO add missing cases
251 None 264 None