From 3ab1519cb27b927074ed7fbbb18a856e6e7fabb8 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 23 Jan 2019 23:14:13 +0300 Subject: Change ids strategy this is a part of larghish hir refactoring which aims to * replace per-source-root module trees with per crate trees * switch from a monotyped DedId to type-specific ids --- crates/ra_hir/src/nameres/lower.rs | 74 ++++++++++++-------------------------- crates/ra_hir/src/nameres/tests.rs | 35 +++++++++--------- 2 files changed, 39 insertions(+), 70 deletions(-) (limited to 'crates/ra_hir/src/nameres') diff --git a/crates/ra_hir/src/nameres/lower.rs b/crates/ra_hir/src/nameres/lower.rs index 4eea6ff1d..6f003bd66 100644 --- a/crates/ra_hir/src/nameres/lower.rs +++ b/crates/ra_hir/src/nameres/lower.rs @@ -4,14 +4,13 @@ use ra_syntax::{ SyntaxKind, AstNode, SourceFile, TreeArc, AstPtr, ast::{self, ModuleItemOwner, NameOwner}, }; -use ra_db::SourceRootId; use ra_arena::{Arena, RawId, impl_arena_id, map::ArenaMap}; use rustc_hash::FxHashMap; use crate::{ SourceItemId, Path, ModuleSource, HirDatabase, Name, SourceFileItems, - HirFileId, MacroCallLoc, AsName, PerNs, DefId, DefKind, DefLoc, - module_tree::ModuleId + HirFileId, MacroCallLoc, AsName, PerNs, DefKind, DefLoc, + ModuleDef, Module, }; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -32,7 +31,7 @@ pub(super) struct ImportData { /// can avoid redoing name resolution. #[derive(Debug, Default, PartialEq, Eq)] pub struct LoweredModule { - pub(crate) declarations: FxHashMap>, + pub(crate) declarations: FxHashMap>, pub(super) imports: Arena, } @@ -59,37 +58,31 @@ impl ImportSourceMap { impl LoweredModule { pub(crate) fn lower_module_module_query( db: &impl HirDatabase, - source_root_id: SourceRootId, - module_id: ModuleId, + module: Module, ) -> Arc { - db.lower_module(source_root_id, module_id).0 + db.lower_module(module).0 } pub(crate) fn lower_module_source_map_query( db: &impl HirDatabase, - source_root_id: SourceRootId, - module_id: ModuleId, + module: Module, ) -> Arc { - db.lower_module(source_root_id, module_id).1 + db.lower_module(module).1 } pub(crate) fn lower_module_query( db: &impl HirDatabase, - source_root_id: SourceRootId, - module_id: ModuleId, + module: Module, ) -> (Arc, 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 (file_id, source) = module.definition_source(db); + let file_id: HirFileId = file_id.into(); let mut source_map = ImportSourceMap::default(); let mut res = LoweredModule::default(); match source { ModuleSource::SourceFile(it) => res.fill( &mut source_map, db, - source_root_id, - module_id, + module, file_id, &mut it.items_with_macros(), ), @@ -98,8 +91,7 @@ impl LoweredModule { res.fill( &mut source_map, db, - source_root_id, - module_id, + module, file_id, &mut item_list.items_with_macros(), ) @@ -113,8 +105,7 @@ impl LoweredModule { &mut self, source_map: &mut ImportSourceMap, db: &impl HirDatabase, - source_root_id: SourceRootId, - module_id: ModuleId, + module: Module, file_id: HirFileId, items: &mut Iterator, ) { @@ -123,21 +114,12 @@ impl LoweredModule { for item in items { match item { ast::ItemOrMacro::Item(it) => { - self.add_def_id( - source_map, - db, - source_root_id, - module_id, - file_id, - &file_items, - it, - ); + self.add_def_id(source_map, db, module, 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, + module, source_item_id: SourceItemId { file_id, item_id: Some(item_id), @@ -148,15 +130,7 @@ impl LoweredModule { let file_items = db.file_items(file_id); //FIXME: expand recursively for item in db.hir_source_file(file_id).items() { - self.add_def_id( - source_map, - db, - source_root_id, - module_id, - file_id, - &file_items, - item, - ); + self.add_def_id(source_map, db, module, file_id, &file_items, item); } } } @@ -167,8 +141,7 @@ impl LoweredModule { &mut self, source_map: &mut ImportSourceMap, db: &impl HirDatabase, - source_root_id: SourceRootId, - module_id: ModuleId, + module: Module, file_id: HirFileId, file_items: &SourceFileItems, item: &ast::ModuleItem, @@ -199,7 +172,7 @@ impl LoweredModule { } }; if let Some(name) = name { - let def_id = assign_def_id(db, source_root_id, module_id, file_id, file_items, item); + let def_id = assign_def_id(db, module, file_id, file_items, item); self.declarations.insert(name.as_name(), def_id); } } @@ -219,12 +192,11 @@ impl LoweredModule { fn assign_def_id( db: &impl HirDatabase, - source_root_id: SourceRootId, - module_id: ModuleId, + module: Module, file_id: HirFileId, file_items: &SourceFileItems, item: &ast::ModuleItem, -) -> PerNs { +) -> PerNs { // depending on the item kind, the location can define something in // the values namespace, the types namespace, or both let kind = DefKind::for_syntax_kind(item.syntax().kind()); @@ -232,14 +204,13 @@ fn assign_def_id( let item_id = file_items.id_of_unchecked(item.syntax()); let def_loc = DefLoc { kind: k, - source_root_id, - module_id, + module, source_item_id: SourceItemId { file_id, item_id: Some(item_id), }, }; - def_loc.id(db) + def_loc.id(db).into() }); def_id } @@ -248,7 +219,6 @@ impl DefKind { fn for_syntax_kind(kind: SyntaxKind) -> PerNs { match kind { SyntaxKind::FN_DEF => PerNs::values(DefKind::Function), - SyntaxKind::MODULE => PerNs::types(DefKind::Module), SyntaxKind::STRUCT_DEF => PerNs::both(DefKind::Struct, DefKind::StructCtor), SyntaxKind::ENUM_DEF => PerNs::types(DefKind::Enum), SyntaxKind::TRAIT_DEF => PerNs::types(DefKind::Trait), diff --git a/crates/ra_hir/src/nameres/tests.rs b/crates/ra_hir/src/nameres/tests.rs index e92007453..9322bf08c 100644 --- a/crates/ra_hir/src/nameres/tests.rs +++ b/crates/ra_hir/src/nameres/tests.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use ra_db::{FilesDatabase, CrateGraph, SourceRootId, salsa::Database}; +use ra_db::{CrateGraph, SourceRootId, salsa::Database}; use relative_path::RelativePath; use test_utils::{assert_eq_text, covers}; @@ -13,10 +13,10 @@ use crate::{ fn item_map(fixture: &str) -> (Arc, ModuleId) { let (db, pos) = MockDatabase::with_position(fixture); - let source_root = db.file_source_root(pos.file_id); let module = crate::source_binder::module_from_position(&db, pos).unwrap(); - let module_id = module.def_id.loc(&db).module_id; - (db.item_map(source_root), module_id) + let krate = module.krate(&db).unwrap(); + let module_id = module.module_id; + (db.item_map(krate.crate_id), module_id) } fn check_module_item_map(map: &ItemMap, module_id: ModuleId, expected: &str) { @@ -238,14 +238,13 @@ fn item_map_across_crates() { db.set_crate_graph(crate_graph); - let source_root = db.file_source_root(main_id); let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap(); - let module_id = module.def_id.loc(&db).module_id; - let item_map = db.item_map(source_root); + let krate = module.krate(&db).unwrap(); + let item_map = db.item_map(krate.crate_id); check_module_item_map( &item_map, - module_id, + module.module_id, " Baz: t v test_crate: t @@ -292,12 +291,12 @@ fn import_across_source_roots() { db.set_crate_graph(crate_graph); let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap(); - let module_id = module.def_id.loc(&db).module_id; - let item_map = db.item_map(source_root); + let krate = module.krate(&db).unwrap(); + let item_map = db.item_map(krate.crate_id); check_module_item_map( &item_map, - module_id, + module.module_id, " C: t v test_crate: t @@ -333,14 +332,13 @@ fn reexport_across_crates() { db.set_crate_graph(crate_graph); - let source_root = db.file_source_root(main_id); let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap(); - let module_id = module.def_id.loc(&db).module_id; - let item_map = db.item_map(source_root); + let krate = module.krate(&db).unwrap(); + let item_map = db.item_map(krate.crate_id); check_module_item_map( &item_map, - module_id, + module.module_id, " Baz: t v test_crate: t @@ -350,10 +348,11 @@ fn reexport_across_crates() { fn check_item_map_is_not_recomputed(initial: &str, file_change: &str) { let (mut db, pos) = MockDatabase::with_position(initial); - let source_root = db.file_source_root(pos.file_id); + let module = crate::source_binder::module_from_file_id(&db, pos.file_id).unwrap(); + let krate = module.krate(&db).unwrap(); { let events = db.log_executed(|| { - db.item_map(source_root); + db.item_map(krate.crate_id); }); assert!(format!("{:?}", events).contains("item_map")) } @@ -362,7 +361,7 @@ fn check_item_map_is_not_recomputed(initial: &str, file_change: &str) { { let events = db.log_executed(|| { - db.item_map(source_root); + db.item_map(krate.crate_id); }); assert!( !format!("{:?}", events).contains("item_map"), -- cgit v1.2.3