From 082ef52bcb15d779c6aff78d9860d328bf7df9b2 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Mon, 7 Jan 2019 13:44:54 +0100 Subject: Implement basic inherent method resolution --- crates/ra_hir/src/code_model_impl/function.rs | 3 +++ crates/ra_hir/src/code_model_impl/module.rs | 15 +++++++++++++++ 2 files changed, 18 insertions(+) (limited to 'crates/ra_hir/src/code_model_impl') diff --git a/crates/ra_hir/src/code_model_impl/function.rs b/crates/ra_hir/src/code_model_impl/function.rs index 1ce939e05..77dddff79 100644 --- a/crates/ra_hir/src/code_model_impl/function.rs +++ b/crates/ra_hir/src/code_model_impl/function.rs @@ -43,6 +43,7 @@ impl FnSignature { .map(|n| n.as_name()) .unwrap_or_else(Name::missing); let mut args = Vec::new(); + let mut has_self_arg = false; if let Some(param_list) = node.param_list() { if let Some(self_param) = param_list.self_param() { let self_type = if let Some(type_ref) = self_param.type_ref() { @@ -60,6 +61,7 @@ impl FnSignature { } }; args.push(self_type); + has_self_arg = true; } for param in param_list.params() { let type_ref = TypeRef::from_ast_opt(param.type_ref()); @@ -75,6 +77,7 @@ impl FnSignature { name, args, ret_type, + has_self_arg, }; Arc::new(sig) } diff --git a/crates/ra_hir/src/code_model_impl/module.rs b/crates/ra_hir/src/code_model_impl/module.rs index e9ff06dc8..775dd6709 100644 --- a/crates/ra_hir/src/code_model_impl/module.rs +++ b/crates/ra_hir/src/code_model_impl/module.rs @@ -95,6 +95,21 @@ impl Module { Module::from_module_id(db, loc.source_root_id, child_id).map(Some) } + /// Iterates over all child modules. + pub fn children_impl(&self, db: &impl HirDatabase) -> Cancelable> { + // FIXME this should be implementable without collecting into a vec, but + // it's kind of hard since the iterator needs to keep a reference to the + // module tree. + let loc = self.def_id.loc(db); + let module_tree = db.module_tree(loc.source_root_id)?; + let children = loc + .module_id + .children(&module_tree) + .map(|(_, module_id)| Module::from_module_id(db, loc.source_root_id, module_id)) + .collect::>>()?; + Ok(children.into_iter()) + } + pub fn parent_impl(&self, db: &impl HirDatabase) -> Cancelable> { let loc = self.def_id.loc(db); let module_tree = db.module_tree(loc.source_root_id)?; -- cgit v1.2.3