aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/lower.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_ty/src/lower.rs')
-rw-r--r--crates/ra_hir_ty/src/lower.rs35
1 files changed, 19 insertions, 16 deletions
diff --git a/crates/ra_hir_ty/src/lower.rs b/crates/ra_hir_ty/src/lower.rs
index 32569ac66..d31f6a2d2 100644
--- a/crates/ra_hir_ty/src/lower.rs
+++ b/crates/ra_hir_ty/src/lower.rs
@@ -24,7 +24,7 @@ use crate::{
24 db::HirDatabase, 24 db::HirDatabase,
25 primitive::{FloatTy, IntTy}, 25 primitive::{FloatTy, IntTy},
26 utils::{ 26 utils::{
27 all_super_traits, associated_type_by_name_including_super_traits, make_mut_slice, 27 all_super_traits, associated_type_by_name_including_super_traits, generics, make_mut_slice,
28 variant_data, 28 variant_data,
29 }, 29 },
30 FnSig, GenericPredicate, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, TraitRef, 30 FnSig, GenericPredicate, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, TraitRef,
@@ -111,7 +111,9 @@ impl Ty {
111 Some((it, None)) => it, 111 Some((it, None)) => it,
112 _ => return None, 112 _ => return None,
113 }; 113 };
114 if let TypeNs::GenericParam(idx) = resolution { 114 if let TypeNs::GenericParam(param_id) = resolution {
115 let generics = generics(db, resolver.generic_def().expect("generics in scope"));
116 let idx = generics.param_idx(param_id);
115 Some(idx) 117 Some(idx)
116 } else { 118 } else {
117 None 119 None
@@ -174,9 +176,11 @@ impl Ty {
174 Ty::Dyn(Arc::new([GenericPredicate::Implemented(trait_ref)])) 176 Ty::Dyn(Arc::new([GenericPredicate::Implemented(trait_ref)]))
175 }; 177 };
176 } 178 }
177 TypeNs::GenericParam(idx) => { 179 TypeNs::GenericParam(param_id) => {
180 let generics = generics(db, resolver.generic_def().expect("generics in scope"));
181 let idx = generics.param_idx(param_id);
178 // FIXME: maybe return name in resolution? 182 // FIXME: maybe return name in resolution?
179 let name = resolved_segment.name.clone(); 183 let name = generics.param_name(param_id);
180 Ty::Param { idx, name } 184 Ty::Param { idx, name }
181 } 185 }
182 TypeNs::SelfType(impl_id) => db.impl_self_ty(impl_id).clone(), 186 TypeNs::SelfType(impl_id) => db.impl_self_ty(impl_id).clone(),
@@ -315,10 +319,10 @@ pub(super) fn substs_from_path_segment(
315 add_self_param: bool, 319 add_self_param: bool,
316) -> Substs { 320) -> Substs {
317 let mut substs = Vec::new(); 321 let mut substs = Vec::new();
318 let def_generics = def_generic.map(|def| db.generic_params(def.into())); 322 let def_generics = def_generic.map(|def| generics(db, def.into()));
319 323
320 let (parent_param_count, param_count) = 324 let (parent_param_count, param_count) =
321 def_generics.map_or((0, 0), |g| (g.count_parent_params(), g.params.len())); 325 def_generics.map_or((0, 0), |g| (g.count_parent_params(), g.params.params.len()));
322 substs.extend(iter::repeat(Ty::Unknown).take(parent_param_count)); 326 substs.extend(iter::repeat(Ty::Unknown).take(parent_param_count));
323 if add_self_param { 327 if add_self_param {
324 // FIXME this add_self_param argument is kind of a hack: Traits have the 328 // FIXME this add_self_param argument is kind of a hack: Traits have the
@@ -567,12 +571,11 @@ pub(crate) fn generic_predicates_query(
567/// Resolve the default type params from generics 571/// Resolve the default type params from generics
568pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDefId) -> Substs { 572pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDefId) -> Substs {
569 let resolver = def.resolver(db); 573 let resolver = def.resolver(db);
570 let generic_params = db.generic_params(def.into()); 574 let generic_params = generics(db, def.into());
571 575
572 let defaults = generic_params 576 let defaults = generic_params
573 .params_including_parent() 577 .iter()
574 .into_iter() 578 .map(|(_idx, p)| p.default.as_ref().map_or(Ty::Unknown, |t| Ty::from_hir(db, &resolver, t)))
575 .map(|p| p.default.as_ref().map_or(Ty::Unknown, |t| Ty::from_hir(db, &resolver, t)))
576 .collect(); 579 .collect();
577 580
578 Substs(defaults) 581 Substs(defaults)
@@ -589,7 +592,7 @@ fn fn_sig_for_fn(db: &impl HirDatabase, def: FunctionId) -> FnSig {
589/// Build the declared type of a function. This should not need to look at the 592/// Build the declared type of a function. This should not need to look at the
590/// function body. 593/// function body.
591fn type_for_fn(db: &impl HirDatabase, def: FunctionId) -> Ty { 594fn type_for_fn(db: &impl HirDatabase, def: FunctionId) -> Ty {
592 let generics = db.generic_params(def.into()); 595 let generics = generics(db, def.into());
593 let substs = Substs::identity(&generics); 596 let substs = Substs::identity(&generics);
594 Ty::apply(TypeCtor::FnDef(def.into()), substs) 597 Ty::apply(TypeCtor::FnDef(def.into()), substs)
595} 598}
@@ -639,7 +642,7 @@ fn type_for_struct_constructor(db: &impl HirDatabase, def: StructId) -> Ty {
639 if struct_data.variant_data.is_unit() { 642 if struct_data.variant_data.is_unit() {
640 return type_for_adt(db, def.into()); // Unit struct 643 return type_for_adt(db, def.into()); // Unit struct
641 } 644 }
642 let generics = db.generic_params(def.into()); 645 let generics = generics(db, def.into());
643 let substs = Substs::identity(&generics); 646 let substs = Substs::identity(&generics);
644 Ty::apply(TypeCtor::FnDef(def.into()), substs) 647 Ty::apply(TypeCtor::FnDef(def.into()), substs)
645} 648}
@@ -653,7 +656,7 @@ fn fn_sig_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariantId
653 .iter() 656 .iter()
654 .map(|(_, field)| Ty::from_hir(db, &resolver, &field.type_ref)) 657 .map(|(_, field)| Ty::from_hir(db, &resolver, &field.type_ref))
655 .collect::<Vec<_>>(); 658 .collect::<Vec<_>>();
656 let generics = db.generic_params(def.parent.into()); 659 let generics = generics(db, def.parent.into());
657 let substs = Substs::identity(&generics); 660 let substs = Substs::identity(&generics);
658 let ret = type_for_adt(db, def.parent.into()).subst(&substs); 661 let ret = type_for_adt(db, def.parent.into()).subst(&substs);
659 FnSig::from_params_and_return(params, ret) 662 FnSig::from_params_and_return(params, ret)
@@ -666,18 +669,18 @@ fn type_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariantId)
666 if var_data.is_unit() { 669 if var_data.is_unit() {
667 return type_for_adt(db, def.parent.into()); // Unit variant 670 return type_for_adt(db, def.parent.into()); // Unit variant
668 } 671 }
669 let generics = db.generic_params(def.parent.into()); 672 let generics = generics(db, def.parent.into());
670 let substs = Substs::identity(&generics); 673 let substs = Substs::identity(&generics);
671 Ty::apply(TypeCtor::FnDef(EnumVariantId::from(def).into()), substs) 674 Ty::apply(TypeCtor::FnDef(EnumVariantId::from(def).into()), substs)
672} 675}
673 676
674fn type_for_adt(db: &impl HirDatabase, adt: AdtId) -> Ty { 677fn type_for_adt(db: &impl HirDatabase, adt: AdtId) -> Ty {
675 let generics = db.generic_params(adt.into()); 678 let generics = generics(db, adt.into());
676 Ty::apply(TypeCtor::Adt(adt), Substs::identity(&generics)) 679 Ty::apply(TypeCtor::Adt(adt), Substs::identity(&generics))
677} 680}
678 681
679fn type_for_type_alias(db: &impl HirDatabase, t: TypeAliasId) -> Ty { 682fn type_for_type_alias(db: &impl HirDatabase, t: TypeAliasId) -> Ty {
680 let generics = db.generic_params(t.into()); 683 let generics = generics(db, t.into());
681 let resolver = t.resolver(db); 684 let resolver = t.resolver(db);
682 let type_ref = &db.type_alias_data(t).type_ref; 685 let type_ref = &db.type_alias_data(t).type_ref;
683 let substs = Substs::identity(&generics); 686 let substs = Substs::identity(&generics);