From 5208c2aa930ae452e062dcdc2563c1bbb67d2e4a Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sat, 19 Jan 2019 21:23:26 +0100 Subject: Sketching the resolver API --- crates/ra_hir/src/source_binder.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'crates/ra_hir/src/source_binder.rs') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index a1b94ed9c..1fdd7d087 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -14,7 +14,7 @@ use ra_syntax::{ use crate::{ HirDatabase, Function, ModuleDef, Struct, Enum, - AsName, Module, HirFileId, Crate, Trait, + AsName, Module, HirFileId, Crate, Trait, Resolver, ids::{LocationCtx, SourceFileItemId}, }; @@ -201,3 +201,8 @@ pub fn macro_symbols(db: &impl HirDatabase, file_id: FileId) -> Vec<(SmolStr, Te res } + +#[allow(unused_variables)] +pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> Resolver { + unimplemented!() +} -- cgit v1.2.3 From 33ff7b56ff353410e7bcb7aed27004d4f0a57d8e Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sun, 27 Jan 2019 20:50:57 +0100 Subject: Use the new Resolver API in completion --- crates/ra_hir/src/source_binder.rs | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'crates/ra_hir/src/source_binder.rs') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 1fdd7d087..998158b3e 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -9,13 +9,14 @@ use ra_db::{FileId, FilePosition}; use ra_syntax::{ SmolStr, TextRange, SyntaxNode, ast::{self, AstNode, NameOwner}, - algo::find_node_at_offset, + algo::{find_node_at_offset, find_leaf_at_offset}, }; use crate::{ HirDatabase, Function, ModuleDef, Struct, Enum, AsName, Module, HirFileId, Crate, Trait, Resolver, ids::{LocationCtx, SourceFileItemId}, + expr }; /// Locates the module by `FileId`. Picks topmost module in the file. @@ -202,7 +203,29 @@ pub fn macro_symbols(db: &impl HirDatabase, file_id: FileId) -> Vec<(SmolStr, Te res } -#[allow(unused_variables)] -pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> Resolver { - unimplemented!() +pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> Resolver<'static> { + let file = db.parse(position.file_id); + find_leaf_at_offset(file.syntax(), position.offset) + .find_map(|node| { + node.ancestors().find_map(|node| { + if ast::Expr::cast(node).is_some() || ast::Block::cast(node).is_some() { + if let Some(func) = function_from_child_node(db, position.file_id, node) { + let scopes = func.scopes(db); + let scope = scopes.scope_for_offset(position.offset); + Some(expr::resolver_for_scope(func.body(db), db, scope)) + } else { + // TODO const/static/array length + None + } + } else if let Some(module) = ast::Module::cast(node) { + Some(module_from_declaration(db, position.file_id, module)?.resolver(db)) + } else if let Some(_) = ast::SourceFile::cast(node) { + Some(module_from_source(db, position.file_id.into(), None)?.resolver(db)) + } else { + // TODO add missing cases + None + } + }) + }) + .unwrap_or_default() } -- cgit v1.2.3 From afce8e442639fa9ed954b3659a2d1eccb7d80113 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Tue, 29 Jan 2019 20:49:31 +0100 Subject: Use the new Resolver API for goto def --- crates/ra_hir/src/source_binder.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'crates/ra_hir/src/source_binder.rs') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 998158b3e..621215bfb 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -229,3 +229,31 @@ pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> R }) .unwrap_or_default() } + +pub fn resolver_for_node( + db: &impl HirDatabase, + file_id: FileId, + node: &SyntaxNode, +) -> Resolver<'static> { + node.ancestors() + .find_map(|node| { + if ast::Expr::cast(node).is_some() || ast::Block::cast(node).is_some() { + if let Some(func) = function_from_child_node(db, file_id, node) { + let scopes = func.scopes(db); + let scope = scopes.scope_for(&node); + Some(expr::resolver_for_scope(func.body(db), db, scope)) + } else { + // TODO const/static/array length + None + } + } else if let Some(module) = ast::Module::cast(node) { + Some(module_from_declaration(db, file_id, module)?.resolver(db)) + } else if let Some(_) = ast::SourceFile::cast(node) { + Some(module_from_source(db, file_id.into(), None)?.resolver(db)) + } else { + // TODO add missing cases + None + } + }) + .unwrap_or_default() +} -- cgit v1.2.3 From d3df80dfe41e4e3ab7644ae576119a264ba0e7f1 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sun, 27 Jan 2019 17:23:49 +0100 Subject: Cleanup --- crates/ra_hir/src/source_binder.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'crates/ra_hir/src/source_binder.rs') diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index 621215bfb..ce929cf3e 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -203,7 +203,7 @@ pub fn macro_symbols(db: &impl HirDatabase, file_id: FileId) -> Vec<(SmolStr, Te res } -pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> Resolver<'static> { +pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> Resolver { let file = db.parse(position.file_id); find_leaf_at_offset(file.syntax(), position.offset) .find_map(|node| { @@ -230,11 +230,7 @@ pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> R .unwrap_or_default() } -pub fn resolver_for_node( - db: &impl HirDatabase, - file_id: FileId, - node: &SyntaxNode, -) -> Resolver<'static> { +pub fn resolver_for_node(db: &impl HirDatabase, file_id: FileId, node: &SyntaxNode) -> Resolver { node.ancestors() .find_map(|node| { if ast::Expr::cast(node).is_some() || ast::Block::cast(node).is_some() { -- cgit v1.2.3 From c5852f422ff45adaa21815c1a15e03b067a56a82 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Fri, 1 Feb 2019 23:06:57 +0100 Subject: Some cleanup and additional tests --- crates/ra_hir/src/source_binder.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'crates/ra_hir/src/source_binder.rs') 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 } pub fn resolver_for_position(db: &impl HirDatabase, position: FilePosition) -> Resolver { - let file = db.parse(position.file_id); + let file_id = position.file_id; + let file = db.parse(file_id); find_leaf_at_offset(file.syntax(), position.offset) .find_map(|node| { node.ancestors().find_map(|node| { if ast::Expr::cast(node).is_some() || ast::Block::cast(node).is_some() { - if let Some(func) = function_from_child_node(db, position.file_id, node) { + if let Some(func) = function_from_child_node(db, file_id, node) { let scopes = func.scopes(db); let scope = scopes.scope_for_offset(position.offset); 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 None } } else if let Some(module) = ast::Module::cast(node) { - Some(module_from_declaration(db, position.file_id, module)?.resolver(db)) + Some(module_from_declaration(db, file_id, module)?.resolver(db)) } else if let Some(_) = ast::SourceFile::cast(node) { - Some(module_from_source(db, position.file_id.into(), None)?.resolver(db)) + Some(module_from_source(db, file_id.into(), None)?.resolver(db)) + } else if let Some(s) = ast::StructDef::cast(node) { + let module = module_from_child_node(db, file_id, s.syntax())?; + Some(struct_from_module(db, module, s).resolver(db)) + } else if let Some(e) = ast::EnumDef::cast(node) { + let module = module_from_child_node(db, file_id, e.syntax())?; + Some(enum_from_module(db, module, e).resolver(db)) } else { // TODO add missing cases None @@ -246,6 +253,12 @@ pub fn resolver_for_node(db: &impl HirDatabase, file_id: FileId, node: &SyntaxNo Some(module_from_declaration(db, file_id, module)?.resolver(db)) } else if let Some(_) = ast::SourceFile::cast(node) { Some(module_from_source(db, file_id.into(), None)?.resolver(db)) + } else if let Some(s) = ast::StructDef::cast(node) { + let module = module_from_child_node(db, file_id, s.syntax())?; + Some(struct_from_module(db, module, s).resolver(db)) + } else if let Some(e) = ast::EnumDef::cast(node) { + let module = module_from_child_node(db, file_id, e.syntax())?; + Some(enum_from_module(db, module, e).resolver(db)) } else { // TODO add missing cases None -- cgit v1.2.3