diff options
Diffstat (limited to 'crates/hir/src')
-rw-r--r-- | crates/hir/src/code_model.rs | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/crates/hir/src/code_model.rs b/crates/hir/src/code_model.rs index 62eccf475..071e553a8 100644 --- a/crates/hir/src/code_model.rs +++ b/crates/hir/src/code_model.rs | |||
@@ -5,9 +5,7 @@ use arrayvec::ArrayVec; | |||
5 | use base_db::{CrateDisplayName, CrateId, Edition, FileId}; | 5 | use base_db::{CrateDisplayName, CrateId, Edition, FileId}; |
6 | use either::Either; | 6 | use either::Either; |
7 | use hir_def::{ | 7 | use hir_def::{ |
8 | adt::ReprKind, | 8 | adt::{ReprKind, StructKind, VariantData}, |
9 | adt::StructKind, | ||
10 | adt::VariantData, | ||
11 | builtin_type::BuiltinType, | 9 | builtin_type::BuiltinType, |
12 | expr::{BindingAnnotation, LabelId, Pat, PatId}, | 10 | expr::{BindingAnnotation, LabelId, Pat, PatId}, |
13 | import_map, | 11 | import_map, |
@@ -31,7 +29,7 @@ use hir_expand::{ | |||
31 | }; | 29 | }; |
32 | use hir_ty::{ | 30 | use hir_ty::{ |
33 | autoderef, | 31 | autoderef, |
34 | display::{HirDisplayError, HirFormatter}, | 32 | display::{write_bounds_like_dyn_trait, HirDisplayError, HirFormatter}, |
35 | method_resolution, | 33 | method_resolution, |
36 | traits::{FnTrait, Solution, SolutionVariables}, | 34 | traits::{FnTrait, Solution, SolutionVariables}, |
37 | ApplicationTy, BoundVar, CallableDefId, Canonical, DebruijnIndex, FnSig, GenericPredicate, | 35 | ApplicationTy, BoundVar, CallableDefId, Canonical, DebruijnIndex, FnSig, GenericPredicate, |
@@ -1278,6 +1276,18 @@ impl TypeParam { | |||
1278 | } | 1276 | } |
1279 | } | 1277 | } |
1280 | 1278 | ||
1279 | pub fn trait_bounds(self, db: &dyn HirDatabase) -> Vec<Trait> { | ||
1280 | db.generic_predicates_for_param(self.id) | ||
1281 | .into_iter() | ||
1282 | .filter_map(|pred| match &pred.value { | ||
1283 | hir_ty::GenericPredicate::Implemented(trait_ref) => { | ||
1284 | Some(Trait::from(trait_ref.trait_)) | ||
1285 | } | ||
1286 | _ => None, | ||
1287 | }) | ||
1288 | .collect() | ||
1289 | } | ||
1290 | |||
1281 | pub fn default(self, db: &dyn HirDatabase) -> Option<Type> { | 1291 | pub fn default(self, db: &dyn HirDatabase) -> Option<Type> { |
1282 | let params = db.generic_defaults(self.id.parent); | 1292 | let params = db.generic_defaults(self.id.parent); |
1283 | let local_idx = hir_ty::param_idx(db, self.id)?; | 1293 | let local_idx = hir_ty::param_idx(db, self.id)?; |
@@ -1293,6 +1303,20 @@ impl TypeParam { | |||
1293 | } | 1303 | } |
1294 | } | 1304 | } |
1295 | 1305 | ||
1306 | impl HirDisplay for TypeParam { | ||
1307 | fn hir_fmt(&self, f: &mut HirFormatter) -> Result<(), HirDisplayError> { | ||
1308 | write!(f, "{}", self.name(f.db))?; | ||
1309 | let bounds = f.db.generic_predicates_for_param(self.id); | ||
1310 | let substs = Substs::type_params(f.db, self.id.parent); | ||
1311 | let predicates = bounds.iter().cloned().map(|b| b.subst(&substs)).collect::<Vec<_>>(); | ||
1312 | if !(predicates.is_empty() || f.omit_verbose_types()) { | ||
1313 | write!(f, ": ")?; | ||
1314 | write_bounds_like_dyn_trait(&predicates, f)?; | ||
1315 | } | ||
1316 | Ok(()) | ||
1317 | } | ||
1318 | } | ||
1319 | |||
1296 | #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] | 1320 | #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] |
1297 | pub struct LifetimeParam { | 1321 | pub struct LifetimeParam { |
1298 | pub(crate) id: LifetimeParamId, | 1322 | pub(crate) id: LifetimeParamId, |
@@ -1331,6 +1355,12 @@ impl ConstParam { | |||
1331 | pub fn parent(self, _db: &dyn HirDatabase) -> GenericDef { | 1355 | pub fn parent(self, _db: &dyn HirDatabase) -> GenericDef { |
1332 | self.id.parent.into() | 1356 | self.id.parent.into() |
1333 | } | 1357 | } |
1358 | |||
1359 | pub fn ty(self, db: &dyn HirDatabase) -> Type { | ||
1360 | let def = self.id.parent; | ||
1361 | let krate = def.module(db.upcast()).krate; | ||
1362 | Type::new(db, krate, def, db.const_param_ty(self.id)) | ||
1363 | } | ||
1334 | } | 1364 | } |
1335 | 1365 | ||
1336 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 1366 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |