From a136cc0653d2b4133fb6387009cfdbaf3e2cf275 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 30 Oct 2019 12:27:54 +0300 Subject: introduce ra_hir_def --- crates/ra_hir/src/code_model.rs | 77 ++++++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 36 deletions(-) (limited to 'crates/ra_hir/src/code_model.rs') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 8eb3c577d..3f1c36941 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -5,6 +5,7 @@ pub(crate) mod docs; use std::sync::Arc; +use hir_def::{CrateModuleId, ModuleId}; use ra_db::{CrateId, Edition, FileId}; use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; @@ -23,7 +24,7 @@ use crate::{ BOOL, CHAR, F32, F64, I128, I16, I32, I64, I8, ISIZE, SELF_TYPE, STR, U128, U16, U32, U64, U8, USIZE, }, - nameres::{CrateModuleId, ImportId, ModuleScope, Namespace}, + nameres::{ImportId, ModuleScope, Namespace}, resolve::{Resolver, Scope, TypeNs}, traits::TraitData, ty::{ @@ -67,8 +68,7 @@ impl Crate { pub fn root_module(self, db: &impl DefDatabase) -> Option { let module_id = db.crate_def_map(self).root(); - let module = Module { krate: self, module_id }; - Some(module) + Some(Module::new(self, module_id)) } pub fn edition(self, db: &impl DefDatabase) -> Edition { @@ -83,8 +83,7 @@ impl Crate { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct Module { - pub(crate) krate: Crate, - pub(crate) module_id: CrateModuleId, + pub(crate) id: ModuleId, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] @@ -175,12 +174,16 @@ impl ModuleSource { } impl Module { + pub(crate) fn new(krate: Crate, crate_module_id: CrateModuleId) -> Module { + Module { id: ModuleId { krate: krate.crate_id, module_id: crate_module_id } } + } + /// Name of this module. pub fn name(self, db: &impl DefDatabase) -> Option { - let def_map = db.crate_def_map(self.krate); - let parent = def_map[self.module_id].parent?; + let def_map = db.crate_def_map(self.krate()); + let parent = def_map[self.id.module_id].parent?; def_map[parent].children.iter().find_map(|(name, module_id)| { - if *module_id == self.module_id { + if *module_id == self.id.module_id { Some(name.clone()) } else { None @@ -200,29 +203,29 @@ impl Module { } /// Returns the crate this module is part of. - pub fn krate(self, _db: &impl DefDatabase) -> Option { - Some(self.krate) + pub fn krate(self) -> Crate { + Crate { crate_id: self.id.krate } } /// Topmost parent of this module. Every module has a `crate_root`, but some /// might be missing `krate`. This can happen if a module's file is not included /// in the module tree of any target in `Cargo.toml`. pub fn crate_root(self, db: &impl DefDatabase) -> Module { - let def_map = db.crate_def_map(self.krate); + let def_map = db.crate_def_map(self.krate()); self.with_module_id(def_map.root()) } /// Finds a child module with the specified name. pub fn child(self, db: &impl HirDatabase, name: &Name) -> Option { - let def_map = db.crate_def_map(self.krate); - let child_id = def_map[self.module_id].children.get(name)?; + let def_map = db.crate_def_map(self.krate()); + let child_id = def_map[self.id.module_id].children.get(name)?; Some(self.with_module_id(*child_id)) } /// Iterates over all child modules. pub fn children(self, db: &impl DefDatabase) -> impl Iterator { - let def_map = db.crate_def_map(self.krate); - let children = def_map[self.module_id] + let def_map = db.crate_def_map(self.krate()); + let children = def_map[self.id.module_id] .children .iter() .map(|(_, module_id)| self.with_module_id(*module_id)) @@ -232,8 +235,8 @@ impl Module { /// Finds a parent module. pub fn parent(self, db: &impl DefDatabase) -> Option { - let def_map = db.crate_def_map(self.krate); - let parent_id = def_map[self.module_id].parent?; + let def_map = db.crate_def_map(self.krate()); + let parent_id = def_map[self.id.module_id].parent?; Some(self.with_module_id(parent_id)) } @@ -249,11 +252,11 @@ impl Module { /// Returns a `ModuleScope`: a set of items, visible in this module. pub fn scope(self, db: &impl HirDatabase) -> ModuleScope { - db.crate_def_map(self.krate)[self.module_id].scope.clone() + db.crate_def_map(self.krate())[self.id.module_id].scope.clone() } pub fn diagnostics(self, db: &impl HirDatabase, sink: &mut DiagnosticSink) { - db.crate_def_map(self.krate).add_diagnostics(db, self.module_id, sink); + db.crate_def_map(self.krate()).add_diagnostics(db, self.id.module_id, sink); for decl in self.declarations(db) { match decl { crate::ModuleDef::Function(f) => f.diagnostics(db, sink), @@ -277,13 +280,13 @@ impl Module { } pub(crate) fn resolver(self, db: &impl DefDatabase) -> Resolver { - let def_map = db.crate_def_map(self.krate); - Resolver::default().push_module_scope(def_map, self.module_id) + let def_map = db.crate_def_map(self.krate()); + Resolver::default().push_module_scope(def_map, self.id.module_id) } pub fn declarations(self, db: &impl DefDatabase) -> Vec { - let def_map = db.crate_def_map(self.krate); - def_map[self.module_id] + let def_map = db.crate_def_map(self.krate()); + def_map[self.id.module_id] .scope .entries() .filter_map(|(_name, res)| if res.import.is_none() { Some(res.def) } else { None }) @@ -303,7 +306,7 @@ impl Module { } fn with_module_id(self, module_id: CrateModuleId) -> Module { - Module { module_id, krate: self.krate } + Module::new(self.krate(), module_id) } } @@ -344,7 +347,7 @@ impl Struct { } pub fn krate(self, db: &impl DefDatabase) -> Option { - self.module(db).krate(db) + Some(self.module(db).krate()) } pub fn name(self, db: &impl DefDatabase) -> Option { @@ -432,7 +435,7 @@ impl Enum { } pub fn krate(self, db: &impl DefDatabase) -> Option { - self.module(db).krate(db) + Some(self.module(db).krate()) } pub fn name(self, db: &impl DefDatabase) -> Option { @@ -523,12 +526,14 @@ impl Adt { } pub fn krate(self, db: &impl HirDatabase) -> Option { - match self { - Adt::Struct(s) => s.module(db), - Adt::Union(s) => s.module(db), - Adt::Enum(e) => e.module(db), - } - .krate(db) + Some( + match self { + Adt::Struct(s) => s.module(db), + Adt::Union(s) => s.module(db), + Adt::Enum(e) => e.module(db), + } + .krate(), + ) } pub(crate) fn resolver(self, db: &impl HirDatabase) -> Resolver { @@ -696,7 +701,7 @@ impl Function { } pub fn krate(self, db: &impl DefDatabase) -> Option { - self.module(db).krate(db) + Some(self.module(db).krate()) } pub fn name(self, db: &impl HirDatabase) -> Name { @@ -774,7 +779,7 @@ impl Const { } pub fn krate(self, db: &impl DefDatabase) -> Option { - self.module(db).krate(db) + Some(self.module(db).krate()) } pub fn data(self, db: &impl HirDatabase) -> Arc { @@ -871,7 +876,7 @@ impl Static { } pub fn krate(self, db: &impl DefDatabase) -> Option { - self.module(db).krate(db) + Some(self.module(db).krate()) } pub fn data(self, db: &impl HirDatabase) -> Arc { @@ -1002,7 +1007,7 @@ impl TypeAlias { } pub fn krate(self, db: &impl DefDatabase) -> Option { - self.module(db).krate(db) + Some(self.module(db).krate()) } /// The containing impl block, if this is a method. -- cgit v1.2.3 From c9cd6aa370667783292de3bc580e0503a409e453 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 30 Oct 2019 13:10:38 +0300 Subject: Move ids to hir_def crate --- crates/ra_hir/src/code_model.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'crates/ra_hir/src/code_model.rs') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 3f1c36941..1a790b2f3 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -343,7 +343,7 @@ pub struct Struct { impl Struct { pub fn module(self, db: &impl DefDatabase) -> Module { - self.id.module(db) + Module { id: self.id.module(db) } } pub fn krate(self, db: &impl DefDatabase) -> Option { @@ -405,7 +405,7 @@ impl Union { } pub fn module(self, db: &impl HirDatabase) -> Module { - self.id.module(db) + Module { id: self.id.module(db) } } pub fn ty(self, db: &impl HirDatabase) -> Ty { @@ -431,7 +431,7 @@ pub struct Enum { impl Enum { pub fn module(self, db: &impl DefDatabase) -> Module { - self.id.module(db) + Module { id: self.id.module(db) } } pub fn krate(self, db: &impl DefDatabase) -> Option { @@ -697,7 +697,7 @@ impl FnData { impl Function { pub fn module(self, db: &impl DefDatabase) -> Module { - self.id.module(db) + Module { id: self.id.module(db) } } pub fn krate(self, db: &impl DefDatabase) -> Option { @@ -775,7 +775,7 @@ pub struct Const { impl Const { pub fn module(self, db: &impl DefDatabase) -> Module { - self.id.module(db) + Module { id: self.id.module(db) } } pub fn krate(self, db: &impl DefDatabase) -> Option { @@ -872,7 +872,7 @@ pub struct Static { impl Static { pub fn module(self, db: &impl DefDatabase) -> Module { - self.id.module(db) + Module { id: self.id.module(db) } } pub fn krate(self, db: &impl DefDatabase) -> Option { @@ -901,7 +901,7 @@ pub struct Trait { impl Trait { pub fn module(self, db: &impl DefDatabase) -> Module { - self.id.module(db) + Module { id: self.id.module(db) } } pub fn name(self, db: &impl DefDatabase) -> Option { @@ -1003,7 +1003,7 @@ pub struct TypeAlias { impl TypeAlias { pub fn module(self, db: &impl DefDatabase) -> Module { - self.id.module(db) + Module { id: self.id.module(db) } } pub fn krate(self, db: &impl DefDatabase) -> Option { -- cgit v1.2.3 From 16e620c052016010b2f17070a98bdc1e7e849ab3 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 30 Oct 2019 16:12:55 +0300 Subject: move raw_items to hir_def --- crates/ra_hir/src/code_model.rs | 30 +++--------------------------- 1 file changed, 3 insertions(+), 27 deletions(-) (limited to 'crates/ra_hir/src/code_model.rs') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 1a790b2f3..de1377aa4 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -6,7 +6,7 @@ pub(crate) mod docs; use std::sync::Arc; use hir_def::{CrateModuleId, ModuleId}; -use ra_db::{CrateId, Edition, FileId}; +use ra_db::{CrateId, Edition}; use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; use crate::{ @@ -33,7 +33,7 @@ use crate::{ }, type_ref::Mutability, type_ref::TypeRef, - AsName, AstId, Either, HasSource, Name, Ty, + AsName, Either, HasSource, Name, Ty, }; /// hir::Crate describes a single crate. It's the main interface with which @@ -147,31 +147,7 @@ impl_froms!( BuiltinType ); -pub enum ModuleSource { - SourceFile(ast::SourceFile), - Module(ast::Module), -} - -impl ModuleSource { - pub(crate) fn new( - db: &(impl DefDatabase + AstDatabase), - file_id: Option, - decl_id: Option>, - ) -> ModuleSource { - match (file_id, decl_id) { - (Some(file_id), _) => { - let source_file = db.parse(file_id).tree(); - ModuleSource::SourceFile(source_file) - } - (None, Some(item_id)) => { - let module = item_id.to_node(db); - assert!(module.item_list().is_some(), "expected inline module"); - ModuleSource::Module(module) - } - (None, None) => panic!(), - } - } -} +pub use hir_def::ModuleSource; impl Module { pub(crate) fn new(krate: Crate, crate_module_id: CrateModuleId) -> Module { -- cgit v1.2.3 From f8ddef875af08f6c67fe69f7803f3926bc6f66bb Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 30 Oct 2019 17:19:30 +0300 Subject: remove forward pointer for name --- crates/ra_hir/src/code_model.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'crates/ra_hir/src/code_model.rs') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index de1377aa4..7848d0a3f 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -5,7 +5,13 @@ pub(crate) mod docs; use std::sync::Arc; -use hir_def::{CrateModuleId, ModuleId}; +use hir_def::{ + name::{ + self, AsName, BOOL, CHAR, F32, F64, I128, I16, I32, I64, I8, ISIZE, SELF_TYPE, STR, U128, + U16, U32, U64, U8, USIZE, + }, + CrateModuleId, ModuleId, +}; use ra_db::{CrateId, Edition}; use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; @@ -20,10 +26,6 @@ use crate::{ TypeAliasId, }, impl_block::ImplBlock, - name::{ - BOOL, CHAR, F32, F64, I128, I16, I32, I64, I8, ISIZE, SELF_TYPE, STR, U128, U16, U32, U64, - U8, USIZE, - }, nameres::{ImportId, ModuleScope, Namespace}, resolve::{Resolver, Scope, TypeNs}, traits::TraitData, @@ -33,7 +35,7 @@ use crate::{ }, type_ref::Mutability, type_ref::TypeRef, - AsName, Either, HasSource, Name, Ty, + Either, HasSource, Name, Ty, }; /// hir::Crate describes a single crate. It's the main interface with which @@ -898,9 +900,7 @@ impl Trait { .where_predicates .iter() .filter_map(|pred| match &pred.type_ref { - TypeRef::Path(p) if p.as_ident() == Some(&crate::name::SELF_TYPE) => { - pred.bound.as_path() - } + TypeRef::Path(p) if p.as_ident() == Some(&name::SELF_TYPE) => pred.bound.as_path(), _ => None, }) .filter_map(|path| match resolver.resolve_path_in_type_ns_fully(db, path) { -- cgit v1.2.3 From e5300ad3baf80c9903235a98a12b6cfd409e9f10 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 30 Oct 2019 17:28:30 +0300 Subject: remove forward pointer for type_ref --- crates/ra_hir/src/code_model.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'crates/ra_hir/src/code_model.rs') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 7848d0a3f..d865c972e 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -10,6 +10,7 @@ use hir_def::{ self, AsName, BOOL, CHAR, F32, F64, I128, I16, I32, I64, I8, ISIZE, SELF_TYPE, STR, U128, U16, U32, U64, U8, USIZE, }, + type_ref::{Mutability, TypeRef}, CrateModuleId, ModuleId, }; use ra_db::{CrateId, Edition}; @@ -33,8 +34,6 @@ use crate::{ primitive::{FloatBitness, FloatTy, IntBitness, IntTy, Signedness}, InferenceResult, TraitRef, }, - type_ref::Mutability, - type_ref::TypeRef, Either, HasSource, Name, Ty, }; -- cgit v1.2.3 From 872ac566bfc6cf43ac55354cf5223b962dbc1d92 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 30 Oct 2019 18:56:20 +0300 Subject: push name down to hir_expand --- crates/ra_hir/src/code_model.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'crates/ra_hir/src/code_model.rs') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index d865c972e..a6ce23dd1 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -6,13 +6,13 @@ pub(crate) mod docs; use std::sync::Arc; use hir_def::{ - name::{ - self, AsName, BOOL, CHAR, F32, F64, I128, I16, I32, I64, I8, ISIZE, SELF_TYPE, STR, U128, - U16, U32, U64, U8, USIZE, - }, type_ref::{Mutability, TypeRef}, CrateModuleId, ModuleId, }; +use hir_expand::name::{ + self, AsName, BOOL, CHAR, F32, F64, I128, I16, I32, I64, I8, ISIZE, SELF_TYPE, STR, U128, U16, + U32, U64, U8, USIZE, +}; use ra_db::{CrateId, Edition}; use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; -- cgit v1.2.3 From b20d37cb49536e19f6af57b00258f86eb8f19325 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 31 Oct 2019 10:51:54 +0300 Subject: move builtin types to hir_def --- crates/ra_hir/src/code_model.rs | 48 ++++------------------------------------- 1 file changed, 4 insertions(+), 44 deletions(-) (limited to 'crates/ra_hir/src/code_model.rs') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index a6ce23dd1..e0c6d6340 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -6,13 +6,11 @@ pub(crate) mod docs; use std::sync::Arc; use hir_def::{ + builtin_type::BuiltinType, type_ref::{Mutability, TypeRef}, CrateModuleId, ModuleId, }; -use hir_expand::name::{ - self, AsName, BOOL, CHAR, F32, F64, I128, I16, I32, I64, I8, ISIZE, SELF_TYPE, STR, U128, U16, - U32, U64, U8, USIZE, -}; +use hir_expand::name::{self, AsName}; use ra_db::{CrateId, Edition}; use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; @@ -30,10 +28,7 @@ use crate::{ nameres::{ImportId, ModuleScope, Namespace}, resolve::{Resolver, Scope, TypeNs}, traits::TraitData, - ty::{ - primitive::{FloatBitness, FloatTy, IntBitness, IntTy, Signedness}, - InferenceResult, TraitRef, - }, + ty::{InferenceResult, TraitRef}, Either, HasSource, Name, Ty, }; @@ -87,41 +82,6 @@ pub struct Module { pub(crate) id: ModuleId, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum BuiltinType { - Char, - Bool, - Str, - Int(IntTy), - Float(FloatTy), -} - -impl BuiltinType { - #[rustfmt::skip] - pub(crate) const ALL: &'static [(Name, BuiltinType)] = &[ - (CHAR, BuiltinType::Char), - (BOOL, BuiltinType::Bool), - (STR, BuiltinType::Str), - - (ISIZE, BuiltinType::Int(IntTy { signedness: Signedness::Signed, bitness: IntBitness::Xsize })), - (I8, BuiltinType::Int(IntTy { signedness: Signedness::Signed, bitness: IntBitness::X8 })), - (I16, BuiltinType::Int(IntTy { signedness: Signedness::Signed, bitness: IntBitness::X16 })), - (I32, BuiltinType::Int(IntTy { signedness: Signedness::Signed, bitness: IntBitness::X32 })), - (I64, BuiltinType::Int(IntTy { signedness: Signedness::Signed, bitness: IntBitness::X64 })), - (I128, BuiltinType::Int(IntTy { signedness: Signedness::Signed, bitness: IntBitness::X128 })), - - (USIZE, BuiltinType::Int(IntTy { signedness: Signedness::Unsigned, bitness: IntBitness::Xsize })), - (U8, BuiltinType::Int(IntTy { signedness: Signedness::Unsigned, bitness: IntBitness::X8 })), - (U16, BuiltinType::Int(IntTy { signedness: Signedness::Unsigned, bitness: IntBitness::X16 })), - (U32, BuiltinType::Int(IntTy { signedness: Signedness::Unsigned, bitness: IntBitness::X32 })), - (U64, BuiltinType::Int(IntTy { signedness: Signedness::Unsigned, bitness: IntBitness::X64 })), - (U128, BuiltinType::Int(IntTy { signedness: Signedness::Unsigned, bitness: IntBitness::X128 })), - - (F32, BuiltinType::Float(FloatTy { bitness: FloatBitness::X32 })), - (F64, BuiltinType::Float(FloatTy { bitness: FloatBitness::X64 })), - ]; -} - /// The defs which can be visible in the module. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum ModuleDef { @@ -625,7 +585,7 @@ impl FnData { let self_type = if let Some(type_ref) = self_param.ascribed_type() { TypeRef::from_ast(type_ref) } else { - let self_type = TypeRef::Path(SELF_TYPE.into()); + let self_type = TypeRef::Path(name::SELF_TYPE.into()); match self_param.kind() { ast::SelfParamKind::Owned => self_type, ast::SelfParamKind::Ref => { -- cgit v1.2.3 From 1602db7d7d6aa38b4ee50de8cbe734529853d615 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 31 Oct 2019 11:23:30 +0300 Subject: add ModuleDefId to hir_def --- crates/ra_hir/src/code_model.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'crates/ra_hir/src/code_model.rs') diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index e0c6d6340..b32aa145e 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -8,14 +8,14 @@ use std::sync::Arc; use hir_def::{ builtin_type::BuiltinType, type_ref::{Mutability, TypeRef}, - CrateModuleId, ModuleId, + CrateModuleId, LocalEnumVariantId, ModuleId, }; use hir_expand::name::{self, AsName}; use ra_db::{CrateId, Edition}; use ra_syntax::ast::{self, NameOwner, TypeAscriptionOwner}; use crate::{ - adt::{EnumVariantId, StructFieldId, VariantDef}, + adt::{StructFieldId, VariantDef}, db::{AstDatabase, DefDatabase, HirDatabase}, diagnostics::DiagnosticSink, expr::{validation::ExprValidator, Body, BodySourceMap}, @@ -410,7 +410,7 @@ impl Enum { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct EnumVariant { pub(crate) parent: Enum, - pub(crate) id: EnumVariantId, + pub(crate) id: LocalEnumVariantId, } impl EnumVariant { -- cgit v1.2.3