From 758bc72873efe36f579236d1abf240d14866fd82 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Wed, 23 Jan 2019 23:08:41 +0100 Subject: Implement methods to build a resolver --- crates/ra_hir/src/impl_block.rs | 45 ++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 16 deletions(-) (limited to 'crates/ra_hir/src/impl_block.rs') diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs index 36d72b103..5fa49d456 100644 --- a/crates/ra_hir/src/impl_block.rs +++ b/crates/ra_hir/src/impl_block.rs @@ -9,9 +9,11 @@ ast::{self, AstNode}}; use crate::{ Const, Type, Function, HirFileId, + HirDatabase, PersistentHirDatabase, type_ref::TypeRef, ids::LocationCtx, + resolve::Resolver, }; use crate::code_model_api::{Module, ModuleSource}; @@ -69,6 +71,10 @@ impl ImplBlock { &self.module_impl_blocks.impls[self.impl_id] } + pub fn module(&self) -> Module { + self.module_impl_blocks.module.clone() + } + pub fn target_trait(&self) -> Option<&TypeRef> { self.impl_data().target_trait() } @@ -80,6 +86,13 @@ impl ImplBlock { pub fn items(&self) -> &[ImplItem] { self.impl_data().items() } + + pub fn resolver(&self, db: &impl HirDatabase) -> Resolver { + let r = self.module().resolver(db); + // FIXME: add generics + let r = r.push_impl_block_scope(self.clone()); + r + } } #[derive(Debug, Clone, PartialEq, Eq)] @@ -162,25 +175,24 @@ impl_arena_id!(ImplId); /// we don't need to do the second step again. #[derive(Debug, PartialEq, Eq)] pub struct ModuleImplBlocks { + module: Module, pub(crate) impls: Arena, impls_by_def: FxHashMap, } impl ModuleImplBlocks { - fn new() -> Self { - ModuleImplBlocks { - impls: Arena::default(), - impls_by_def: FxHashMap::default(), - } - } - fn collect( - &mut self, db: &impl PersistentHirDatabase, module: Module, source_map: &mut ImplSourceMap, - ) { - let (file_id, module_source) = module.definition_source(db); + ) -> Self { + let mut m = ModuleImplBlocks { + module, + impls: Arena::default(), + impls_by_def: FxHashMap::default(), + }; + + let (file_id, module_source) = m.module.definition_source(db); let file_id: HirFileId = file_id.into(); let node = match &module_source { ModuleSource::SourceFile(node) => node.syntax(), @@ -191,14 +203,16 @@ impl ModuleImplBlocks { }; for impl_block_ast in node.children().filter_map(ast::ImplBlock::cast) { - let impl_block = ImplData::from_ast(db, file_id, module, impl_block_ast); - let id = self.impls.alloc(impl_block); - for &impl_item in &self.impls[id].items { - self.impls_by_def.insert(impl_item, id); + let impl_block = ImplData::from_ast(db, file_id, m.module, impl_block_ast); + let id = m.impls.alloc(impl_block); + for &impl_item in &m.impls[id].items { + m.impls_by_def.insert(impl_item, id); } source_map.insert(id, impl_block_ast); } + + m } } @@ -208,8 +222,7 @@ pub(crate) fn impls_in_module_with_source_map_query( ) -> (Arc, Arc) { let mut source_map = ImplSourceMap::default(); - let mut result = ModuleImplBlocks::new(); - result.collect(db, module, &mut source_map); + let result = ModuleImplBlocks::collect(db, module, &mut source_map); (Arc::new(result), Arc::new(source_map)) } -- cgit v1.2.3 From 6b076f1931d7dc324d7bbbc4c1df9f7c1c1db8b7 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Sat, 26 Jan 2019 22:52:04 +0100 Subject: Use new Resolver API in type inference --- crates/ra_hir/src/impl_block.rs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'crates/ra_hir/src/impl_block.rs') diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs index 5fa49d456..a3908048b 100644 --- a/crates/ra_hir/src/impl_block.rs +++ b/crates/ra_hir/src/impl_block.rs @@ -7,13 +7,13 @@ use ra_syntax::{ ast::{self, AstNode}}; use crate::{ - Const, Type, - Function, HirFileId, - HirDatabase, - PersistentHirDatabase, + Const, Type, Function, HirFileId, + HirDatabase, PersistentHirDatabase, + ModuleDef, Trait, Resolution, type_ref::TypeRef, ids::LocationCtx, resolve::Resolver, + ty::Ty, }; use crate::code_model_api::{Module, ModuleSource}; @@ -75,7 +75,7 @@ impl ImplBlock { self.module_impl_blocks.module.clone() } - pub fn target_trait(&self) -> Option<&TypeRef> { + pub fn target_trait_ref(&self) -> Option<&TypeRef> { self.impl_data().target_trait() } @@ -83,6 +83,23 @@ impl ImplBlock { self.impl_data().target_type() } + pub fn target_ty(&self, db: &impl HirDatabase) -> Ty { + Ty::from_hir(db, &self.resolver(db), self.target_type()) + } + + pub fn target_trait(&self, db: &impl HirDatabase) -> Option { + if let Some(TypeRef::Path(path)) = self.target_trait_ref() { + let resolver = self.resolver(db); + if let Some(Resolution::Def { + def: ModuleDef::Trait(tr), + }) = resolver.resolve_path(db, path).take_types() + { + return Some(tr); + } + } + None + } + pub fn items(&self) -> &[ImplItem] { self.impl_data().items() } -- cgit v1.2.3 From d571d26955148befd6986008a5112fff3a901c43 Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Wed, 30 Jan 2019 22:41:44 +0100 Subject: Make the Resolution variants tuple variants --- crates/ra_hir/src/impl_block.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'crates/ra_hir/src/impl_block.rs') diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs index a3908048b..738c58fbe 100644 --- a/crates/ra_hir/src/impl_block.rs +++ b/crates/ra_hir/src/impl_block.rs @@ -90,9 +90,8 @@ impl ImplBlock { pub fn target_trait(&self, db: &impl HirDatabase) -> Option { if let Some(TypeRef::Path(path)) = self.target_trait_ref() { let resolver = self.resolver(db); - if let Some(Resolution::Def { - def: ModuleDef::Trait(tr), - }) = resolver.resolve_path(db, path).take_types() + if let Some(Resolution::Def(ModuleDef::Trait(tr))) = + resolver.resolve_path(db, path).take_types() { return Some(tr); } @@ -106,7 +105,7 @@ impl ImplBlock { pub fn resolver(&self, db: &impl HirDatabase) -> Resolver { let r = self.module().resolver(db); - // FIXME: add generics + // TODO: add generics let r = r.push_impl_block_scope(self.clone()); r } -- cgit v1.2.3