aboutsummaryrefslogtreecommitdiff
path: root/crates/hir/src/code_model.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir/src/code_model.rs')
-rw-r--r--crates/hir/src/code_model.rs38
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;
5use base_db::{CrateDisplayName, CrateId, Edition, FileId}; 5use base_db::{CrateDisplayName, CrateId, Edition, FileId};
6use either::Either; 6use either::Either;
7use hir_def::{ 7use 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};
32use hir_ty::{ 30use 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
1306impl 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)]
1297pub struct LifetimeParam { 1321pub 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)]