aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/code_model.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/code_model.rs')
-rw-r--r--crates/ra_hir/src/code_model.rs61
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::{
19use hir_expand::{ 19use hir_expand::{
20 diagnostics::DiagnosticSink, 20 diagnostics::DiagnosticSink,
21 name::{name, AsName}, 21 name::{name, AsName},
22 MacroDefId, 22 MacroDefId, MacroDefKind,
23}; 23};
24use hir_ty::{ 24use 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};
28use ra_db::{CrateId, CrateName, Edition, FileId}; 31use ra_db::{CrateId, CrateName, Edition, FileId};
29use ra_prof::profile; 32use 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
150pub use hir_def::{ 173pub 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
1322impl HirDisplay for Type { 1359impl 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}