diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs index 865e5e8092..860fd75395 100644 --- a/crates/ra_hir/src/code_model_api.rs +++ b/crates/ra_hir/src/code_model_api.rs @@ -7,7 +7,7 @@ use ra_syntax::{ast, TreeArc, SyntaxNode}; use crate::{ Name, DefId, Path, PerNs, ScopesWithSyntaxMapping, Ty, HirFileId, type_ref::TypeRef, - nameres::{ModuleScope, lower::LoweredImport}, + nameres::{ModuleScope, lower::ImportId}, db::HirDatabase, expr::BodySyntaxMapping, ty::InferenceResult, @@ -100,7 +100,7 @@ impl Module { pub fn import_source( &self, db: &impl HirDatabase, - import: LoweredImport, + import: ImportId, ) -> TreeArc { self.import_source_impl(db, import) } diff --git a/crates/ra_hir/src/code_model_impl/module.rs b/crates/ra_hir/src/code_model_impl/module.rs index f110548c64..e5394d440e 100644 --- a/crates/ra_hir/src/code_model_impl/module.rs +++ b/crates/ra_hir/src/code_model_impl/module.rs @@ -5,7 +5,7 @@ use crate::{ Module, ModuleSource, Problem, Crate, DefId, DefLoc, DefKind, Name, Path, PathKind, PerNs, Def, module_tree::ModuleId, - nameres::{ModuleScope, lower::LoweredImport}, + nameres::{ModuleScope, lower::ImportId}, db::HirDatabase, }; @@ -69,7 +69,7 @@ impl Module { pub(crate) fn import_source_impl( &self, db: &impl HirDatabase, - import: LoweredImport, + import: ImportId, ) -> TreeArc { let loc = self.def_id.loc(db); let source_map = db.lower_module_source_map(loc.source_root_id, loc.module_id); diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index ccc53c454c..60065cf6a5 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs @@ -10,7 +10,7 @@ use crate::{ FnSignature, FnScopes, macros::MacroExpansion, module_tree::{ModuleId, ModuleTree}, - nameres::{ItemMap, lower::{InputModuleItems, LoweredModule, ImportSourceMap}}, + nameres::{ItemMap, lower::{LoweredModule, ImportSourceMap}}, ty::{InferenceResult, Ty, method_resolution::CrateImplBlocks}, adt::{StructData, EnumData, EnumVariantData}, impl_block::ModuleImplBlocks, @@ -58,13 +58,6 @@ pub trait HirDatabase: #[salsa::invoke(crate::module_tree::Submodule::submodules_query)] fn submodules(&self, source: SourceItemId) -> Arc>; - #[salsa::invoke(crate::nameres::lower::InputModuleItems::input_module_items_query)] - fn input_module_items( - &self, - source_root_id: SourceRootId, - module_id: ModuleId, - ) -> Arc; - #[salsa::invoke(crate::nameres::lower::LoweredModule::lower_module_query)] fn lower_module( &self, diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index ef7d049eee..75b9c6b430 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -31,7 +31,7 @@ mod code_model_impl; use crate::{ db::HirDatabase, name::{AsName, KnownName}, - ids::{DefKind, SourceItemId, SourceFileItemId, SourceFileItems}, + ids::{DefKind, SourceItemId, SourceFileItems}, }; pub use self::{ diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs index ab0a9041da..4efafd4092 100644 --- a/crates/ra_hir/src/nameres.rs +++ b/crates/ra_hir/src/nameres.rs @@ -60,7 +60,7 @@ pub struct Resolution { /// None for unresolved pub def_id: PerNs, /// ident by whitch this is imported into local scope. - pub import: Option, + pub import: Option, } #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -154,7 +154,7 @@ pub(crate) struct Resolver<'a, DB> { input: &'a FxHashMap>, source_root: SourceRootId, module_tree: Arc, - processed_imports: FxHashSet<(ModuleId, LoweredImport)>, + processed_imports: FxHashSet<(ModuleId, ImportId)>, result: ItemMap, } @@ -296,7 +296,7 @@ where fn resolve_import( &mut self, module_id: ModuleId, - import_id: LoweredImport, + import_id: ImportId, import: &ImportData, ) -> bool { log::debug!("resolving import: {:?}", import); diff --git a/crates/ra_hir/src/nameres/lower.rs b/crates/ra_hir/src/nameres/lower.rs index 6bca144442..52448644cd 100644 --- a/crates/ra_hir/src/nameres/lower.rs +++ b/crates/ra_hir/src/nameres/lower.rs @@ -1,157 +1,17 @@ use std::sync::Arc; use ra_syntax::{ - TextRange, SyntaxKind, AstNode, SourceFile, TreeArc, + SyntaxKind, AstNode, SourceFile, TreeArc, ast::{self, ModuleItemOwner}, }; use ra_db::{SourceRootId, LocalSyntaxPtr}; use ra_arena::{Arena, RawId, impl_arena_id, map::ArenaMap}; use crate::{ - SourceItemId, SourceFileItemId, Path, ModuleSource, HirDatabase, Name, SourceFileItems, + SourceItemId, Path, ModuleSource, HirDatabase, Name, SourceFileItems, HirFileId, MacroCallLoc, AsName, module_tree::ModuleId }; -/// A set of items and imports declared inside a module, without relation to -/// other modules. -/// -/// This sits in-between raw syntax and name resolution and allows us to avoid -/// recomputing name res: if two instance of `InputModuleItems` are the same, we -/// can avoid redoing name resolution. -#[derive(Debug, Default, PartialEq, Eq)] -pub struct InputModuleItems { - pub(crate) items: Vec, - pub(super) imports: Vec, -} - -impl InputModuleItems { - pub(crate) fn input_module_items_query( - db: &impl HirDatabase, - source_root_id: SourceRootId, - module_id: ModuleId, - ) -> Arc { - let module_tree = db.module_tree(source_root_id); - let source = module_id.source(&module_tree); - let file_id = source.file_id; - let source = ModuleSource::from_source_item_id(db, source); - let mut res = InputModuleItems::default(); - match source { - ModuleSource::SourceFile(it) => res.fill( - db, - source_root_id, - module_id, - file_id, - &mut it.items_with_macros(), - ), - ModuleSource::Module(it) => { - if let Some(item_list) = it.item_list() { - res.fill( - db, - source_root_id, - module_id, - file_id, - &mut item_list.items_with_macros(), - ) - } - } - }; - Arc::new(res) - } - - fn fill( - &mut self, - db: &impl HirDatabase, - source_root_id: SourceRootId, - module_id: ModuleId, - file_id: HirFileId, - items: &mut Iterator, - ) { - let file_items = db.file_items(file_id); - - for item in items { - match item { - ast::ItemOrMacro::Item(it) => { - self.add_item(file_id, &file_items, it); - } - ast::ItemOrMacro::Macro(macro_call) => { - let item_id = file_items.id_of_unchecked(macro_call.syntax()); - let loc = MacroCallLoc { - source_root_id, - module_id, - source_item_id: SourceItemId { - file_id, - item_id: Some(item_id), - }, - }; - let id = loc.id(db); - let file_id = HirFileId::from(id); - let file_items = db.file_items(file_id); - //FIXME: expand recursively - for item in db.hir_source_file(file_id).items() { - self.add_item(file_id, &file_items, item); - } - } - } - } - } - - fn add_item( - &mut self, - file_id: HirFileId, - file_items: &SourceFileItems, - item: &ast::ModuleItem, - ) -> Option<()> { - match item.kind() { - ast::ModuleItemKind::StructDef(it) => { - self.items.push(ModuleItem::new(file_id, file_items, it)?) - } - ast::ModuleItemKind::EnumDef(it) => { - self.items.push(ModuleItem::new(file_id, file_items, it)?) - } - ast::ModuleItemKind::FnDef(it) => { - self.items.push(ModuleItem::new(file_id, file_items, it)?) - } - ast::ModuleItemKind::TraitDef(it) => { - self.items.push(ModuleItem::new(file_id, file_items, it)?) - } - ast::ModuleItemKind::TypeDef(it) => { - self.items.push(ModuleItem::new(file_id, file_items, it)?) - } - ast::ModuleItemKind::ImplBlock(_) => { - // impls don't define items - } - ast::ModuleItemKind::UseItem(it) => self.add_use_item(file_items, it), - ast::ModuleItemKind::ExternCrateItem(_) => { - // TODO - } - ast::ModuleItemKind::ConstDef(it) => { - self.items.push(ModuleItem::new(file_id, file_items, it)?) - } - ast::ModuleItemKind::StaticDef(it) => { - self.items.push(ModuleItem::new(file_id, file_items, it)?) - } - ast::ModuleItemKind::Module(it) => { - self.items.push(ModuleItem::new(file_id, file_items, it)?) - } - } - Some(()) - } - - fn add_use_item(&mut self, file_items: &SourceFileItems, item: &ast::UseItem) { - let file_item_id = file_items.id_of_unchecked(item.syntax()); - let start_offset = item.syntax().range().start(); - Path::expand_use_item(item, |path, segment| { - let kind = match segment { - None => ImportKind::Glob, - Some(segment) => ImportKind::Named(NamedImport { - file_item_id, - relative_range: segment.syntax().range() - start_offset, - }), - }; - self.imports.push(Import { kind, path }) - }) - } -} #[derive(Debug, PartialEq, Eq)] pub(super) enum Vis { @@ -188,27 +48,9 @@ impl ModuleItem { } } -#[derive(Debug, Clone, PartialEq, Eq)] -pub(super) struct Import { - pub(super) path: Path, - pub(super) kind: ImportKind, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct NamedImport { - pub file_item_id: SourceFileItemId, - pub relative_range: TextRange, -} - -#[derive(Debug, Clone, PartialEq, Eq)] -pub(super) enum ImportKind { - Glob, - Named(NamedImport), -} - #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub struct LoweredImport(RawId); -impl_arena_id!(LoweredImport); +pub struct ImportId(RawId); +impl_arena_id!(ImportId); #[derive(Debug, PartialEq, Eq)] pub(super) struct ImportData { @@ -216,24 +58,30 @@ pub(super) struct ImportData { pub(super) is_glob: bool, } +/// A set of items and imports declared inside a module, without relation to +/// other modules. +/// +/// This sits in-between raw syntax and name resolution and allows us to avoid +/// recomputing name res: if two instance of `InputModuleItems` are the same, we +/// can avoid redoing name resolution. #[derive(Debug, Default, PartialEq, Eq)] pub struct LoweredModule { - pub(super) items: Vec, - pub(super) imports: Arena, + pub(crate) items: Vec, + pub(super) imports: Arena, } #[derive(Debug, Default, PartialEq, Eq)] pub struct ImportSourceMap { - map: ArenaMap, + map: ArenaMap, } impl ImportSourceMap { - fn insert(&mut self, import: LoweredImport, segment: &ast::PathSegment) { + fn insert(&mut self, import: ImportId, segment: &ast::PathSegment) { self.map .insert(import, LocalSyntaxPtr::new(segment.syntax())) } - pub fn get(&self, source: &ModuleSource, import: LoweredImport) -> TreeArc { + pub fn get(&self, source: &ModuleSource, import: ImportId) -> TreeArc { let file = match source { ModuleSource::SourceFile(file) => &*file, ModuleSource::Module(m) => m.syntax().ancestors().find_map(SourceFile::cast).unwrap(), diff --git a/crates/ra_hir/src/source_binder.rs b/crates/ra_hir/src/source_binder.rs index be82d804a5..2fe354b041 100644 --- a/crates/ra_hir/src/source_binder.rs +++ b/crates/ra_hir/src/source_binder.rs @@ -142,7 +142,7 @@ pub fn macro_symbols(db: &impl HirDatabase, file_id: FileId) -> Vec<(SmolStr, Te None => return Vec::new(), }; let loc = module.def_id.loc(db); - let items = db.input_module_items(loc.source_root_id, loc.module_id); + let items = db.lower_module_module(loc.source_root_id, loc.module_id); let mut res = Vec::new(); for macro_call_id in items diff --git a/crates/ra_ide_api/src/db.rs b/crates/ra_ide_api/src/db.rs index a1d3333b2c..c2978f9097 100644 --- a/crates/ra_ide_api/src/db.rs +++ b/crates/ra_ide_api/src/db.rs @@ -113,7 +113,6 @@ salsa::database_storage! { fn fn_scopes() for hir::db::FnScopesQuery; fn file_items() for hir::db::FileItemsQuery; fn file_item() for hir::db::FileItemQuery; - fn input_module_items() for hir::db::InputModuleItemsQuery; fn lower_module() for hir::db::LowerModuleQuery; fn lower_module_module() for hir::db::LowerModuleModuleQuery; fn lower_module_source_map() for hir::db::LowerModuleSourceMapQuery;