mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 22:01:37 +00:00
Remove idx and parent generics from generics
This makes `hir_def::GenericParams` flatter. The logic for re-numbering the params is moved to hir instead.
This commit is contained in:
parent
30fefcc08c
commit
8e9837df21
10 changed files with 181 additions and 157 deletions
|
@ -24,7 +24,7 @@ use crate::{
|
|||
db::HirDatabase,
|
||||
primitive::{FloatTy, IntTy},
|
||||
utils::{
|
||||
all_super_traits, associated_type_by_name_including_super_traits, make_mut_slice,
|
||||
all_super_traits, associated_type_by_name_including_super_traits, generics, make_mut_slice,
|
||||
variant_data,
|
||||
},
|
||||
FnSig, GenericPredicate, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, TraitRef,
|
||||
|
@ -111,7 +111,9 @@ impl Ty {
|
|||
Some((it, None)) => it,
|
||||
_ => return None,
|
||||
};
|
||||
if let TypeNs::GenericParam(idx) = resolution {
|
||||
if let TypeNs::GenericParam(param_id) = resolution {
|
||||
let generics = generics(db, resolver.generic_def().expect("generics in scope"));
|
||||
let idx = generics.param_idx(param_id);
|
||||
Some(idx)
|
||||
} else {
|
||||
None
|
||||
|
@ -174,9 +176,11 @@ impl Ty {
|
|||
Ty::Dyn(Arc::new([GenericPredicate::Implemented(trait_ref)]))
|
||||
};
|
||||
}
|
||||
TypeNs::GenericParam(idx) => {
|
||||
TypeNs::GenericParam(param_id) => {
|
||||
let generics = generics(db, resolver.generic_def().expect("generics in scope"));
|
||||
let idx = generics.param_idx(param_id);
|
||||
// FIXME: maybe return name in resolution?
|
||||
let name = resolved_segment.name.clone();
|
||||
let name = generics.param_name(param_id);
|
||||
Ty::Param { idx, name }
|
||||
}
|
||||
TypeNs::SelfType(impl_id) => db.impl_self_ty(impl_id).clone(),
|
||||
|
@ -315,10 +319,10 @@ pub(super) fn substs_from_path_segment(
|
|||
add_self_param: bool,
|
||||
) -> Substs {
|
||||
let mut substs = Vec::new();
|
||||
let def_generics = def_generic.map(|def| db.generic_params(def.into()));
|
||||
let def_generics = def_generic.map(|def| generics(db, def.into()));
|
||||
|
||||
let (parent_param_count, param_count) =
|
||||
def_generics.map_or((0, 0), |g| (g.count_parent_params(), g.params.len()));
|
||||
def_generics.map_or((0, 0), |g| (g.count_parent_params(), g.params.params.len()));
|
||||
substs.extend(iter::repeat(Ty::Unknown).take(parent_param_count));
|
||||
if add_self_param {
|
||||
// FIXME this add_self_param argument is kind of a hack: Traits have the
|
||||
|
@ -567,12 +571,11 @@ pub(crate) fn generic_predicates_query(
|
|||
/// Resolve the default type params from generics
|
||||
pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDefId) -> Substs {
|
||||
let resolver = def.resolver(db);
|
||||
let generic_params = db.generic_params(def.into());
|
||||
let generic_params = generics(db, def.into());
|
||||
|
||||
let defaults = generic_params
|
||||
.params_including_parent()
|
||||
.into_iter()
|
||||
.map(|p| p.default.as_ref().map_or(Ty::Unknown, |t| Ty::from_hir(db, &resolver, t)))
|
||||
.iter()
|
||||
.map(|(_idx, p)| p.default.as_ref().map_or(Ty::Unknown, |t| Ty::from_hir(db, &resolver, t)))
|
||||
.collect();
|
||||
|
||||
Substs(defaults)
|
||||
|
@ -589,7 +592,7 @@ fn fn_sig_for_fn(db: &impl HirDatabase, def: FunctionId) -> FnSig {
|
|||
/// Build the declared type of a function. This should not need to look at the
|
||||
/// function body.
|
||||
fn type_for_fn(db: &impl HirDatabase, def: FunctionId) -> Ty {
|
||||
let generics = db.generic_params(def.into());
|
||||
let generics = generics(db, def.into());
|
||||
let substs = Substs::identity(&generics);
|
||||
Ty::apply(TypeCtor::FnDef(def.into()), substs)
|
||||
}
|
||||
|
@ -639,7 +642,7 @@ fn type_for_struct_constructor(db: &impl HirDatabase, def: StructId) -> Ty {
|
|||
if struct_data.variant_data.is_unit() {
|
||||
return type_for_adt(db, def.into()); // Unit struct
|
||||
}
|
||||
let generics = db.generic_params(def.into());
|
||||
let generics = generics(db, def.into());
|
||||
let substs = Substs::identity(&generics);
|
||||
Ty::apply(TypeCtor::FnDef(def.into()), substs)
|
||||
}
|
||||
|
@ -653,7 +656,7 @@ fn fn_sig_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariantId
|
|||
.iter()
|
||||
.map(|(_, field)| Ty::from_hir(db, &resolver, &field.type_ref))
|
||||
.collect::<Vec<_>>();
|
||||
let generics = db.generic_params(def.parent.into());
|
||||
let generics = generics(db, def.parent.into());
|
||||
let substs = Substs::identity(&generics);
|
||||
let ret = type_for_adt(db, def.parent.into()).subst(&substs);
|
||||
FnSig::from_params_and_return(params, ret)
|
||||
|
@ -666,18 +669,18 @@ fn type_for_enum_variant_constructor(db: &impl HirDatabase, def: EnumVariantId)
|
|||
if var_data.is_unit() {
|
||||
return type_for_adt(db, def.parent.into()); // Unit variant
|
||||
}
|
||||
let generics = db.generic_params(def.parent.into());
|
||||
let generics = generics(db, def.parent.into());
|
||||
let substs = Substs::identity(&generics);
|
||||
Ty::apply(TypeCtor::FnDef(EnumVariantId::from(def).into()), substs)
|
||||
}
|
||||
|
||||
fn type_for_adt(db: &impl HirDatabase, adt: AdtId) -> Ty {
|
||||
let generics = db.generic_params(adt.into());
|
||||
let generics = generics(db, adt.into());
|
||||
Ty::apply(TypeCtor::Adt(adt), Substs::identity(&generics))
|
||||
}
|
||||
|
||||
fn type_for_type_alias(db: &impl HirDatabase, t: TypeAliasId) -> Ty {
|
||||
let generics = db.generic_params(t.into());
|
||||
let generics = generics(db, t.into());
|
||||
let resolver = t.resolver(db);
|
||||
let type_ref = &db.type_alias_data(t).type_ref;
|
||||
let substs = Substs::identity(&generics);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue