From e0660506719476a0546e10bee816d7220be85440 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 27 Dec 2018 21:21:10 +0300 Subject: use names everywhere --- crates/ra_hir/src/source_binder.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 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 a0165aef2..a0d1daf71 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -8,14 +8,14 @@ use ra_db::{FileId, FilePosition, Cancelable}; use ra_editor::find_node_at_offset; use ra_syntax::{ - ast::{self, AstNode}, + ast::{self, AstNode, NameOwner}, SyntaxNodeRef, }; use crate::{ HirDatabase, Module, Function, SourceItemId, module::ModuleSource, - DefKind, DefLoc + DefKind, DefLoc, AsName, }; /// Locates the module by `FileId`. Picks topmost module in the file. @@ -24,6 +24,25 @@ pub fn module_from_file_id(db: &impl HirDatabase, file_id: FileId) -> Cancelable module_from_source(db, module_source) } +/// Locates the child module by `mod child;` declaration. +pub fn module_from_declaration( + db: &impl HirDatabase, + file_id: FileId, + decl: ast::Module, +) -> Cancelable> { + let parent_module = module_from_file_id(db, file_id)?; + let child_name = decl.name(); + match (parent_module, child_name) { + (Some(parent_module), Some(child_name)) => { + if let Some(child) = parent_module.child(&child_name.as_name()) { + return Ok(Some(child)); + } + } + _ => (), + } + Ok(None) +} + /// Locates the module by position in the source code. pub fn module_from_position( db: &impl HirDatabase, -- cgit v1.2.3