diff options
author | Galilée 'Bill' Enguehard <[email protected]> | 2020-05-21 22:27:38 +0100 |
---|---|---|
committer | Galilée 'Bill' Enguehard <[email protected]> | 2020-05-21 22:27:38 +0100 |
commit | 7fece3bdd2450c0807f7dd742239cae95f0cc65e (patch) | |
tree | 866c4db826c959e79c63a6727bdb9f2c61e6fc4f /crates/ra_hir/src/code_model.rs | |
parent | db926218b2082077750291f8426ddd28b284cd08 (diff) | |
parent | 59732df8d40dfadc6dcf5951265416576399712a (diff) |
Merge branch 'master' of github.com:rust-analyzer/rust-analyzer into modname_spacing
Diffstat (limited to 'crates/ra_hir/src/code_model.rs')
-rw-r--r-- | crates/ra_hir/src/code_model.rs | 61 |
1 files changed, 49 insertions, 12 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index af59aa1b6..840cfdfc8 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs | |||
@@ -19,11 +19,14 @@ use hir_def::{ | |||
19 | use hir_expand::{ | 19 | use hir_expand::{ |
20 | diagnostics::DiagnosticSink, | 20 | diagnostics::DiagnosticSink, |
21 | name::{name, AsName}, | 21 | name::{name, AsName}, |
22 | MacroDefId, | 22 | MacroDefId, MacroDefKind, |
23 | }; | 23 | }; |
24 | use hir_ty::{ | 24 | use hir_ty::{ |
25 | autoderef, display::HirFormatter, expr::ExprValidator, method_resolution, ApplicationTy, | 25 | autoderef, |
26 | Canonical, InEnvironment, Substs, TraitEnvironment, Ty, TyDefId, TypeCtor, | 26 | display::{HirDisplayError, HirFormatter}, |
27 | expr::ExprValidator, | ||
28 | method_resolution, ApplicationTy, Canonical, InEnvironment, Substs, TraitEnvironment, Ty, | ||
29 | TyDefId, TypeCtor, | ||
27 | }; | 30 | }; |
28 | use ra_db::{CrateId, CrateName, Edition, FileId}; | 31 | use ra_db::{CrateId, CrateName, Edition, FileId}; |
29 | use ra_prof::profile; | 32 | use ra_prof::profile; |
@@ -145,6 +148,26 @@ impl ModuleDef { | |||
145 | ModuleDef::BuiltinType(_) => None, | 148 | ModuleDef::BuiltinType(_) => None, |
146 | } | 149 | } |
147 | } | 150 | } |
151 | |||
152 | pub fn definition_visibility(&self, db: &dyn HirDatabase) -> Option<Visibility> { | ||
153 | let module = match self { | ||
154 | ModuleDef::Module(it) => it.parent(db)?, | ||
155 | ModuleDef::Function(it) => return Some(it.visibility(db)), | ||
156 | ModuleDef::Adt(it) => it.module(db), | ||
157 | ModuleDef::EnumVariant(it) => { | ||
158 | let parent = it.parent_enum(db); | ||
159 | let module = it.module(db); | ||
160 | return module.visibility_of(db, &ModuleDef::Adt(Adt::Enum(parent))); | ||
161 | } | ||
162 | ModuleDef::Const(it) => return Some(it.visibility(db)), | ||
163 | ModuleDef::Static(it) => it.module(db), | ||
164 | ModuleDef::Trait(it) => it.module(db), | ||
165 | ModuleDef::TypeAlias(it) => return Some(it.visibility(db)), | ||
166 | ModuleDef::BuiltinType(_) => return None, | ||
167 | }; | ||
168 | |||
169 | module.visibility_of(db, self) | ||
170 | } | ||
148 | } | 171 | } |
149 | 172 | ||
150 | pub use hir_def::{ | 173 | pub use hir_def::{ |
@@ -675,6 +698,10 @@ impl Static { | |||
675 | pub fn name(self, db: &dyn HirDatabase) -> Option<Name> { | 698 | pub fn name(self, db: &dyn HirDatabase) -> Option<Name> { |
676 | db.static_data(self.id).name.clone() | 699 | db.static_data(self.id).name.clone() |
677 | } | 700 | } |
701 | |||
702 | pub fn is_mut(self, db: &dyn HirDatabase) -> bool { | ||
703 | db.static_data(self.id).mutable | ||
704 | } | ||
678 | } | 705 | } |
679 | 706 | ||
680 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 707 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
@@ -762,13 +789,12 @@ impl MacroDef { | |||
762 | 789 | ||
763 | /// Indicate it is a proc-macro | 790 | /// Indicate it is a proc-macro |
764 | pub fn is_proc_macro(&self) -> bool { | 791 | pub fn is_proc_macro(&self) -> bool { |
765 | match self.id.kind { | 792 | matches!(self.id.kind, MacroDefKind::CustomDerive(_)) |
766 | hir_expand::MacroDefKind::Declarative => false, | 793 | } |
767 | hir_expand::MacroDefKind::BuiltIn(_) => false, | 794 | |
768 | hir_expand::MacroDefKind::BuiltInDerive(_) => false, | 795 | /// Indicate it is a derive macro |
769 | hir_expand::MacroDefKind::BuiltInEager(_) => false, | 796 | pub fn is_derive_macro(&self) -> bool { |
770 | hir_expand::MacroDefKind::CustomDerive(_) => true, | 797 | matches!(self.id.kind, MacroDefKind::CustomDerive(_) | MacroDefKind::BuiltInDerive(_)) |
771 | } | ||
772 | } | 798 | } |
773 | } | 799 | } |
774 | 800 | ||
@@ -963,6 +989,17 @@ impl TypeParam { | |||
963 | ty: InEnvironment { value: ty, environment }, | 989 | ty: InEnvironment { value: ty, environment }, |
964 | } | 990 | } |
965 | } | 991 | } |
992 | |||
993 | pub fn default(self, db: &dyn HirDatabase) -> Option<Type> { | ||
994 | let params = db.generic_defaults(self.id.parent); | ||
995 | let local_idx = hir_ty::param_idx(db, self.id)?; | ||
996 | let resolver = self.id.parent.resolver(db.upcast()); | ||
997 | let environment = TraitEnvironment::lower(db, &resolver); | ||
998 | params.get(local_idx).cloned().map(|ty| Type { | ||
999 | krate: self.id.parent.module(db.upcast()).krate, | ||
1000 | ty: InEnvironment { value: ty, environment }, | ||
1001 | }) | ||
1002 | } | ||
966 | } | 1003 | } |
967 | 1004 | ||
968 | // FIXME: rename from `ImplDef` to `Impl` | 1005 | // FIXME: rename from `ImplDef` to `Impl` |
@@ -1212,7 +1249,7 @@ impl Type { | |||
1212 | 1249 | ||
1213 | // This would be nicer if it just returned an iterator, but that runs into | 1250 | // This would be nicer if it just returned an iterator, but that runs into |
1214 | // lifetime problems, because we need to borrow temp `CrateImplDefs`. | 1251 | // lifetime problems, because we need to borrow temp `CrateImplDefs`. |
1215 | pub fn iterate_impl_items<T>( | 1252 | pub fn iterate_assoc_items<T>( |
1216 | self, | 1253 | self, |
1217 | db: &dyn HirDatabase, | 1254 | db: &dyn HirDatabase, |
1218 | krate: Crate, | 1255 | krate: Crate, |
@@ -1320,7 +1357,7 @@ impl Type { | |||
1320 | } | 1357 | } |
1321 | 1358 | ||
1322 | impl HirDisplay for Type { | 1359 | impl HirDisplay for Type { |
1323 | fn hir_fmt(&self, f: &mut HirFormatter) -> std::fmt::Result { | 1360 | fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> { |
1324 | self.ty.value.hir_fmt(f) | 1361 | self.ty.value.hir_fmt(f) |
1325 | } | 1362 | } |
1326 | } | 1363 | } |