mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 12:54:58 +00:00
Make GenericParams::type_or_consts private
This commit is contained in:
parent
73c97e3fe0
commit
372e2d22e6
11 changed files with 239 additions and 233 deletions
|
@ -214,7 +214,7 @@ impl ChildBySource for GenericDefId {
|
||||||
}
|
}
|
||||||
|
|
||||||
let generic_params = db.generic_params(*self);
|
let generic_params = db.generic_params(*self);
|
||||||
let mut toc_idx_iter = generic_params.type_or_consts.iter().map(|(idx, _)| idx);
|
let mut toc_idx_iter = generic_params.iter_type_or_consts().map(|(idx, _)| idx);
|
||||||
let lts_idx_iter = generic_params.lifetimes.iter().map(|(idx, _)| idx);
|
let lts_idx_iter = generic_params.lifetimes.iter().map(|(idx, _)| idx);
|
||||||
|
|
||||||
// For traits the first type index is `Self`, skip it.
|
// For traits the first type index is `Self`, skip it.
|
||||||
|
|
|
@ -28,6 +28,7 @@ use crate::{
|
||||||
LocalLifetimeParamId, LocalTypeOrConstParamId, Lookup, TypeOrConstParamId, TypeParamId,
|
LocalLifetimeParamId, LocalTypeOrConstParamId, Lookup, TypeOrConstParamId, TypeParamId,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// The index of the self param in the generic of the non-parent definition.
|
||||||
const SELF_PARAM_ID_IN_SELF: la_arena::Idx<TypeOrConstParamData> =
|
const SELF_PARAM_ID_IN_SELF: la_arena::Idx<TypeOrConstParamData> =
|
||||||
LocalTypeOrConstParamId::from_raw(RawIdx::from_u32(0));
|
LocalTypeOrConstParamId::from_raw(RawIdx::from_u32(0));
|
||||||
|
|
||||||
|
@ -158,7 +159,7 @@ pub enum GenericParamDataRef<'a> {
|
||||||
/// Data about the generic parameters of a function, struct, impl, etc.
|
/// Data about the generic parameters of a function, struct, impl, etc.
|
||||||
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
|
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
|
||||||
pub struct GenericParams {
|
pub struct GenericParams {
|
||||||
pub type_or_consts: Arena<TypeOrConstParamData>,
|
type_or_consts: Arena<TypeOrConstParamData>,
|
||||||
pub lifetimes: Arena<LifetimeParamData>,
|
pub lifetimes: Arena<LifetimeParamData>,
|
||||||
pub where_predicates: Box<[WherePredicate]>,
|
pub where_predicates: Box<[WherePredicate]>,
|
||||||
}
|
}
|
||||||
|
@ -205,6 +206,213 @@ pub enum WherePredicateTypeTarget {
|
||||||
TypeOrConstParam(LocalTypeOrConstParamId),
|
TypeOrConstParam(LocalTypeOrConstParamId),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl GenericParams {
|
||||||
|
/// Number of Generic parameters (type_or_consts + lifetimes)
|
||||||
|
#[inline]
|
||||||
|
pub fn len(&self) -> usize {
|
||||||
|
self.type_or_consts.len() + self.lifetimes.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn len_lifetimes(&self) -> usize {
|
||||||
|
self.lifetimes.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn len_type_or_consts(&self) -> usize {
|
||||||
|
self.type_or_consts.len()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn is_empty(&self) -> bool {
|
||||||
|
self.len() == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Iterator of type_or_consts field
|
||||||
|
#[inline]
|
||||||
|
pub fn iter_type_or_consts(
|
||||||
|
&self,
|
||||||
|
) -> impl DoubleEndedIterator<Item = (LocalTypeOrConstParamId, &TypeOrConstParamData)> {
|
||||||
|
self.type_or_consts.iter()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Iterator of lifetimes field
|
||||||
|
#[inline]
|
||||||
|
pub fn iter_lt(
|
||||||
|
&self,
|
||||||
|
) -> impl DoubleEndedIterator<Item = (LocalLifetimeParamId, &LifetimeParamData)> {
|
||||||
|
self.lifetimes.iter()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn generic_params_query(
|
||||||
|
db: &dyn DefDatabase,
|
||||||
|
def: GenericDefId,
|
||||||
|
) -> Interned<GenericParams> {
|
||||||
|
let _p = tracing::info_span!("generic_params_query").entered();
|
||||||
|
|
||||||
|
let krate = def.module(db).krate;
|
||||||
|
let cfg_options = db.crate_graph();
|
||||||
|
let cfg_options = &cfg_options[krate].cfg_options;
|
||||||
|
|
||||||
|
// Returns the generic parameters that are enabled under the current `#[cfg]` options
|
||||||
|
let enabled_params =
|
||||||
|
|params: &Interned<GenericParams>, item_tree: &ItemTree, parent: GenericModItem| {
|
||||||
|
let enabled = |param| item_tree.attrs(db, krate, param).is_cfg_enabled(cfg_options);
|
||||||
|
let attr_owner_ct = |param| AttrOwner::TypeOrConstParamData(parent, param);
|
||||||
|
let attr_owner_lt = |param| AttrOwner::LifetimeParamData(parent, param);
|
||||||
|
|
||||||
|
// In the common case, no parameters will by disabled by `#[cfg]` attributes.
|
||||||
|
// Therefore, make a first pass to check if all parameters are enabled and, if so,
|
||||||
|
// clone the `Interned<GenericParams>` instead of recreating an identical copy.
|
||||||
|
let all_type_or_consts_enabled =
|
||||||
|
params.type_or_consts.iter().all(|(idx, _)| enabled(attr_owner_ct(idx)));
|
||||||
|
let all_lifetimes_enabled =
|
||||||
|
params.lifetimes.iter().all(|(idx, _)| enabled(attr_owner_lt(idx)));
|
||||||
|
|
||||||
|
if all_type_or_consts_enabled && all_lifetimes_enabled {
|
||||||
|
params.clone()
|
||||||
|
} else {
|
||||||
|
Interned::new(GenericParams {
|
||||||
|
type_or_consts: all_type_or_consts_enabled
|
||||||
|
.then(|| params.type_or_consts.clone())
|
||||||
|
.unwrap_or_else(|| {
|
||||||
|
params
|
||||||
|
.type_or_consts
|
||||||
|
.iter()
|
||||||
|
.filter(|&(idx, _)| enabled(attr_owner_ct(idx)))
|
||||||
|
.map(|(_, param)| param.clone())
|
||||||
|
.collect()
|
||||||
|
}),
|
||||||
|
lifetimes: all_lifetimes_enabled
|
||||||
|
.then(|| params.lifetimes.clone())
|
||||||
|
.unwrap_or_else(|| {
|
||||||
|
params
|
||||||
|
.lifetimes
|
||||||
|
.iter()
|
||||||
|
.filter(|&(idx, _)| enabled(attr_owner_lt(idx)))
|
||||||
|
.map(|(_, param)| param.clone())
|
||||||
|
.collect()
|
||||||
|
}),
|
||||||
|
where_predicates: params.where_predicates.clone(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fn id_to_generics<Id: GenericsItemTreeNode>(
|
||||||
|
db: &dyn DefDatabase,
|
||||||
|
id: impl for<'db> Lookup<
|
||||||
|
Database<'db> = dyn DefDatabase + 'db,
|
||||||
|
Data = impl ItemTreeLoc<Id = Id>,
|
||||||
|
>,
|
||||||
|
enabled_params: impl Fn(
|
||||||
|
&Interned<GenericParams>,
|
||||||
|
&ItemTree,
|
||||||
|
GenericModItem,
|
||||||
|
) -> Interned<GenericParams>,
|
||||||
|
) -> Interned<GenericParams>
|
||||||
|
where
|
||||||
|
FileItemTreeId<Id>: Into<GenericModItem>,
|
||||||
|
{
|
||||||
|
let id = id.lookup(db).item_tree_id();
|
||||||
|
let tree = id.item_tree(db);
|
||||||
|
let item = &tree[id.value];
|
||||||
|
enabled_params(item.generic_params(), &tree, id.value.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
match def {
|
||||||
|
GenericDefId::FunctionId(id) => {
|
||||||
|
let loc = id.lookup(db);
|
||||||
|
let tree = loc.id.item_tree(db);
|
||||||
|
let item = &tree[loc.id.value];
|
||||||
|
|
||||||
|
let enabled_params =
|
||||||
|
enabled_params(&item.explicit_generic_params, &tree, loc.id.value.into());
|
||||||
|
|
||||||
|
let module = loc.container.module(db);
|
||||||
|
let func_data = db.function_data(id);
|
||||||
|
if func_data.params.is_empty() {
|
||||||
|
enabled_params
|
||||||
|
} else {
|
||||||
|
let mut generic_params = GenericParamsCollector {
|
||||||
|
type_or_consts: enabled_params.type_or_consts.clone(),
|
||||||
|
lifetimes: enabled_params.lifetimes.clone(),
|
||||||
|
where_predicates: enabled_params.where_predicates.clone().into(),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Don't create an `Expander` if not needed since this
|
||||||
|
// could cause a reparse after the `ItemTree` has been created due to the spanmap.
|
||||||
|
let mut expander = Lazy::new(|| {
|
||||||
|
(module.def_map(db), Expander::new(db, loc.id.file_id(), module))
|
||||||
|
});
|
||||||
|
for param in func_data.params.iter() {
|
||||||
|
generic_params.fill_implicit_impl_trait_args(db, &mut expander, param);
|
||||||
|
}
|
||||||
|
Interned::new(generic_params.finish())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GenericDefId::AdtId(AdtId::StructId(id)) => id_to_generics(db, id, enabled_params),
|
||||||
|
GenericDefId::AdtId(AdtId::EnumId(id)) => id_to_generics(db, id, enabled_params),
|
||||||
|
GenericDefId::AdtId(AdtId::UnionId(id)) => id_to_generics(db, id, enabled_params),
|
||||||
|
GenericDefId::TraitId(id) => id_to_generics(db, id, enabled_params),
|
||||||
|
GenericDefId::TraitAliasId(id) => id_to_generics(db, id, enabled_params),
|
||||||
|
GenericDefId::TypeAliasId(id) => id_to_generics(db, id, enabled_params),
|
||||||
|
GenericDefId::ImplId(id) => id_to_generics(db, id, enabled_params),
|
||||||
|
GenericDefId::ConstId(_) => Interned::new(GenericParams {
|
||||||
|
type_or_consts: Default::default(),
|
||||||
|
lifetimes: Default::default(),
|
||||||
|
where_predicates: Default::default(),
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn find_type_by_name(&self, name: &Name, parent: GenericDefId) -> Option<TypeParamId> {
|
||||||
|
self.type_or_consts.iter().find_map(|(id, p)| {
|
||||||
|
if p.name().as_ref() == Some(&name) && p.type_param().is_some() {
|
||||||
|
Some(TypeParamId::from_unchecked(TypeOrConstParamId { local_id: id, parent }))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn find_const_by_name(&self, name: &Name, parent: GenericDefId) -> Option<ConstParamId> {
|
||||||
|
self.type_or_consts.iter().find_map(|(id, p)| {
|
||||||
|
if p.name().as_ref() == Some(&name) && p.const_param().is_some() {
|
||||||
|
Some(ConstParamId::from_unchecked(TypeOrConstParamId { local_id: id, parent }))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn trait_self_param(&self) -> Option<LocalTypeOrConstParamId> {
|
||||||
|
if self.type_or_consts.is_empty() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
matches!(
|
||||||
|
self.type_or_consts[SELF_PARAM_ID_IN_SELF],
|
||||||
|
TypeOrConstParamData::TypeParamData(TypeParamData {
|
||||||
|
provenance: TypeParamProvenance::TraitSelf,
|
||||||
|
..
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.then(|| SELF_PARAM_ID_IN_SELF)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn find_lifetime_by_name(
|
||||||
|
&self,
|
||||||
|
name: &Name,
|
||||||
|
parent: GenericDefId,
|
||||||
|
) -> Option<LifetimeParamId> {
|
||||||
|
self.lifetimes.iter().find_map(|(id, p)| {
|
||||||
|
if &p.name == name {
|
||||||
|
Some(LifetimeParamId { local_id: id, parent })
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Default)]
|
#[derive(Clone, Default)]
|
||||||
pub(crate) struct GenericParamsCollector {
|
pub(crate) struct GenericParamsCollector {
|
||||||
pub(crate) type_or_consts: Arena<TypeOrConstParamData>,
|
pub(crate) type_or_consts: Arena<TypeOrConstParamData>,
|
||||||
|
@ -441,200 +649,3 @@ impl GenericParamsCollector {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GenericParams {
|
|
||||||
/// Number of Generic parameters (type_or_consts + lifetimes)
|
|
||||||
#[inline]
|
|
||||||
pub fn len(&self) -> usize {
|
|
||||||
self.type_or_consts.len() + self.lifetimes.len()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn is_empty(&self) -> bool {
|
|
||||||
self.len() == 0
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Iterator of type_or_consts field
|
|
||||||
#[inline]
|
|
||||||
pub fn iter_type_or_consts(
|
|
||||||
&self,
|
|
||||||
) -> impl DoubleEndedIterator<Item = (LocalTypeOrConstParamId, &TypeOrConstParamData)> {
|
|
||||||
self.type_or_consts.iter()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Iterator of lifetimes field
|
|
||||||
#[inline]
|
|
||||||
pub fn iter_lt(
|
|
||||||
&self,
|
|
||||||
) -> impl DoubleEndedIterator<Item = (LocalLifetimeParamId, &LifetimeParamData)> {
|
|
||||||
self.lifetimes.iter()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn generic_params_query(
|
|
||||||
db: &dyn DefDatabase,
|
|
||||||
def: GenericDefId,
|
|
||||||
) -> Interned<GenericParams> {
|
|
||||||
let _p = tracing::info_span!("generic_params_query").entered();
|
|
||||||
|
|
||||||
let krate = def.module(db).krate;
|
|
||||||
let cfg_options = db.crate_graph();
|
|
||||||
let cfg_options = &cfg_options[krate].cfg_options;
|
|
||||||
|
|
||||||
// Returns the generic parameters that are enabled under the current `#[cfg]` options
|
|
||||||
let enabled_params =
|
|
||||||
|params: &Interned<GenericParams>, item_tree: &ItemTree, parent: GenericModItem| {
|
|
||||||
let enabled = |param| item_tree.attrs(db, krate, param).is_cfg_enabled(cfg_options);
|
|
||||||
let attr_owner_ct = |param| AttrOwner::TypeOrConstParamData(parent, param);
|
|
||||||
let attr_owner_lt = |param| AttrOwner::LifetimeParamData(parent, param);
|
|
||||||
|
|
||||||
// In the common case, no parameters will by disabled by `#[cfg]` attributes.
|
|
||||||
// Therefore, make a first pass to check if all parameters are enabled and, if so,
|
|
||||||
// clone the `Interned<GenericParams>` instead of recreating an identical copy.
|
|
||||||
let all_type_or_consts_enabled =
|
|
||||||
params.type_or_consts.iter().all(|(idx, _)| enabled(attr_owner_ct(idx)));
|
|
||||||
let all_lifetimes_enabled =
|
|
||||||
params.lifetimes.iter().all(|(idx, _)| enabled(attr_owner_lt(idx)));
|
|
||||||
|
|
||||||
if all_type_or_consts_enabled && all_lifetimes_enabled {
|
|
||||||
params.clone()
|
|
||||||
} else {
|
|
||||||
Interned::new(GenericParams {
|
|
||||||
type_or_consts: all_type_or_consts_enabled
|
|
||||||
.then(|| params.type_or_consts.clone())
|
|
||||||
.unwrap_or_else(|| {
|
|
||||||
params
|
|
||||||
.type_or_consts
|
|
||||||
.iter()
|
|
||||||
.filter(|&(idx, _)| enabled(attr_owner_ct(idx)))
|
|
||||||
.map(|(_, param)| param.clone())
|
|
||||||
.collect()
|
|
||||||
}),
|
|
||||||
lifetimes: all_lifetimes_enabled
|
|
||||||
.then(|| params.lifetimes.clone())
|
|
||||||
.unwrap_or_else(|| {
|
|
||||||
params
|
|
||||||
.lifetimes
|
|
||||||
.iter()
|
|
||||||
.filter(|&(idx, _)| enabled(attr_owner_lt(idx)))
|
|
||||||
.map(|(_, param)| param.clone())
|
|
||||||
.collect()
|
|
||||||
}),
|
|
||||||
where_predicates: params.where_predicates.clone(),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
};
|
|
||||||
fn id_to_generics<Id: GenericsItemTreeNode>(
|
|
||||||
db: &dyn DefDatabase,
|
|
||||||
id: impl for<'db> Lookup<
|
|
||||||
Database<'db> = dyn DefDatabase + 'db,
|
|
||||||
Data = impl ItemTreeLoc<Id = Id>,
|
|
||||||
>,
|
|
||||||
enabled_params: impl Fn(
|
|
||||||
&Interned<GenericParams>,
|
|
||||||
&ItemTree,
|
|
||||||
GenericModItem,
|
|
||||||
) -> Interned<GenericParams>,
|
|
||||||
) -> Interned<GenericParams>
|
|
||||||
where
|
|
||||||
FileItemTreeId<Id>: Into<GenericModItem>,
|
|
||||||
{
|
|
||||||
let id = id.lookup(db).item_tree_id();
|
|
||||||
let tree = id.item_tree(db);
|
|
||||||
let item = &tree[id.value];
|
|
||||||
enabled_params(item.generic_params(), &tree, id.value.into())
|
|
||||||
}
|
|
||||||
|
|
||||||
match def {
|
|
||||||
GenericDefId::FunctionId(id) => {
|
|
||||||
let loc = id.lookup(db);
|
|
||||||
let tree = loc.id.item_tree(db);
|
|
||||||
let item = &tree[loc.id.value];
|
|
||||||
|
|
||||||
let enabled_params =
|
|
||||||
enabled_params(&item.explicit_generic_params, &tree, loc.id.value.into());
|
|
||||||
|
|
||||||
let module = loc.container.module(db);
|
|
||||||
let func_data = db.function_data(id);
|
|
||||||
if func_data.params.is_empty() {
|
|
||||||
enabled_params
|
|
||||||
} else {
|
|
||||||
let mut generic_params = GenericParamsCollector {
|
|
||||||
type_or_consts: enabled_params.type_or_consts.clone(),
|
|
||||||
lifetimes: enabled_params.lifetimes.clone(),
|
|
||||||
where_predicates: enabled_params.where_predicates.clone().into(),
|
|
||||||
};
|
|
||||||
|
|
||||||
// Don't create an `Expander` if not needed since this
|
|
||||||
// could cause a reparse after the `ItemTree` has been created due to the spanmap.
|
|
||||||
let mut expander = Lazy::new(|| {
|
|
||||||
(module.def_map(db), Expander::new(db, loc.id.file_id(), module))
|
|
||||||
});
|
|
||||||
for param in func_data.params.iter() {
|
|
||||||
generic_params.fill_implicit_impl_trait_args(db, &mut expander, param);
|
|
||||||
}
|
|
||||||
Interned::new(generic_params.finish())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GenericDefId::AdtId(AdtId::StructId(id)) => id_to_generics(db, id, enabled_params),
|
|
||||||
GenericDefId::AdtId(AdtId::EnumId(id)) => id_to_generics(db, id, enabled_params),
|
|
||||||
GenericDefId::AdtId(AdtId::UnionId(id)) => id_to_generics(db, id, enabled_params),
|
|
||||||
GenericDefId::TraitId(id) => id_to_generics(db, id, enabled_params),
|
|
||||||
GenericDefId::TraitAliasId(id) => id_to_generics(db, id, enabled_params),
|
|
||||||
GenericDefId::TypeAliasId(id) => id_to_generics(db, id, enabled_params),
|
|
||||||
GenericDefId::ImplId(id) => id_to_generics(db, id, enabled_params),
|
|
||||||
GenericDefId::ConstId(_) => Interned::new(GenericParams {
|
|
||||||
type_or_consts: Default::default(),
|
|
||||||
lifetimes: Default::default(),
|
|
||||||
where_predicates: Default::default(),
|
|
||||||
}),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn find_type_by_name(&self, name: &Name, parent: GenericDefId) -> Option<TypeParamId> {
|
|
||||||
self.type_or_consts.iter().find_map(|(id, p)| {
|
|
||||||
if p.name().as_ref() == Some(&name) && p.type_param().is_some() {
|
|
||||||
Some(TypeParamId::from_unchecked(TypeOrConstParamId { local_id: id, parent }))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn find_const_by_name(&self, name: &Name, parent: GenericDefId) -> Option<ConstParamId> {
|
|
||||||
self.type_or_consts.iter().find_map(|(id, p)| {
|
|
||||||
if p.name().as_ref() == Some(&name) && p.const_param().is_some() {
|
|
||||||
Some(ConstParamId::from_unchecked(TypeOrConstParamId { local_id: id, parent }))
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn trait_self_param(&self) -> Option<LocalTypeOrConstParamId> {
|
|
||||||
if self.type_or_consts.is_empty() {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
matches!(
|
|
||||||
self.type_or_consts[SELF_PARAM_ID_IN_SELF],
|
|
||||||
TypeOrConstParamData::TypeParamData(TypeParamData {
|
|
||||||
provenance: TypeParamProvenance::TraitSelf,
|
|
||||||
..
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.then(|| SELF_PARAM_ID_IN_SELF)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn find_lifetime_by_name(
|
|
||||||
&self,
|
|
||||||
name: &Name,
|
|
||||||
parent: GenericDefId,
|
|
||||||
) -> Option<LifetimeParamId> {
|
|
||||||
self.lifetimes.iter().find_map(|(id, p)| {
|
|
||||||
if &p.name == name {
|
|
||||||
Some(LifetimeParamId { local_id: id, parent })
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -540,7 +540,7 @@ impl Printer<'_> {
|
||||||
self.print_attrs_of(AttrOwner::LifetimeParamData(parent, idx), " ");
|
self.print_attrs_of(AttrOwner::LifetimeParamData(parent, idx), " ");
|
||||||
w!(self, "{}", lt.name.display(self.db.upcast()));
|
w!(self, "{}", lt.name.display(self.db.upcast()));
|
||||||
}
|
}
|
||||||
for (idx, x) in params.type_or_consts.iter() {
|
for (idx, x) in params.iter_type_or_consts() {
|
||||||
if !first {
|
if !first {
|
||||||
w!(self, ", ");
|
w!(self, ", ");
|
||||||
}
|
}
|
||||||
|
@ -607,12 +607,10 @@ impl Printer<'_> {
|
||||||
|
|
||||||
match target {
|
match target {
|
||||||
WherePredicateTypeTarget::TypeRef(ty) => this.print_type_ref(ty),
|
WherePredicateTypeTarget::TypeRef(ty) => this.print_type_ref(ty),
|
||||||
WherePredicateTypeTarget::TypeOrConstParam(id) => {
|
WherePredicateTypeTarget::TypeOrConstParam(id) => match params[*id].name() {
|
||||||
match ¶ms.type_or_consts[*id].name() {
|
|
||||||
Some(name) => w!(this, "{}", name.display(self.db.upcast())),
|
Some(name) => w!(this, "{}", name.display(self.db.upcast())),
|
||||||
None => w!(this, "_anon_{}", id.into_raw()),
|
None => w!(this, "_anon_{}", id.into_raw()),
|
||||||
}
|
},
|
||||||
}
|
|
||||||
}
|
}
|
||||||
w!(this, ": ");
|
w!(this, ": ");
|
||||||
this.print_type_bounds(std::slice::from_ref(bound));
|
this.print_type_bounds(std::slice::from_ref(bound));
|
||||||
|
|
|
@ -758,10 +758,10 @@ impl Scope {
|
||||||
}
|
}
|
||||||
Scope::GenericParams { params, def: parent } => {
|
Scope::GenericParams { params, def: parent } => {
|
||||||
let parent = *parent;
|
let parent = *parent;
|
||||||
for (local_id, param) in params.type_or_consts.iter() {
|
for (local_id, param) in params.iter_type_or_consts() {
|
||||||
if let Some(name) = ¶m.name() {
|
if let Some(name) = ¶m.name() {
|
||||||
let id = TypeOrConstParamId { parent, local_id };
|
let id = TypeOrConstParamId { parent, local_id };
|
||||||
let data = &db.generic_params(parent).type_or_consts[local_id];
|
let data = &db.generic_params(parent)[local_id];
|
||||||
acc.add(
|
acc.add(
|
||||||
name,
|
name,
|
||||||
ScopeDef::GenericParam(match data {
|
ScopeDef::GenericParam(match data {
|
||||||
|
|
|
@ -64,7 +64,7 @@ impl HasChildSource<LocalTypeOrConstParamId> for GenericDefId {
|
||||||
db: &dyn DefDatabase,
|
db: &dyn DefDatabase,
|
||||||
) -> InFile<ArenaMap<LocalTypeOrConstParamId, Self::Value>> {
|
) -> InFile<ArenaMap<LocalTypeOrConstParamId, Self::Value>> {
|
||||||
let generic_params = db.generic_params(*self);
|
let generic_params = db.generic_params(*self);
|
||||||
let mut idx_iter = generic_params.type_or_consts.iter().map(|(idx, _)| idx);
|
let mut idx_iter = generic_params.iter_type_or_consts().map(|(idx, _)| idx);
|
||||||
|
|
||||||
let (file_id, generic_params_list) = self.file_id_and_params_of(db);
|
let (file_id, generic_params_list) = self.file_id_and_params_of(db);
|
||||||
|
|
||||||
|
|
|
@ -309,7 +309,7 @@ impl TyExt for Ty {
|
||||||
TyKind::Placeholder(idx) => {
|
TyKind::Placeholder(idx) => {
|
||||||
let id = from_placeholder_idx(db, *idx);
|
let id = from_placeholder_idx(db, *idx);
|
||||||
let generic_params = db.generic_params(id.parent);
|
let generic_params = db.generic_params(id.parent);
|
||||||
let param_data = &generic_params.type_or_consts[id.local_id];
|
let param_data = &generic_params[id.local_id];
|
||||||
match param_data {
|
match param_data {
|
||||||
TypeOrConstParamData::TypeParamData(p) => match p.provenance {
|
TypeOrConstParamData::TypeParamData(p) => match p.provenance {
|
||||||
hir_def::generics::TypeParamProvenance::ArgumentImplTrait => {
|
hir_def::generics::TypeParamProvenance::ArgumentImplTrait => {
|
||||||
|
|
|
@ -145,7 +145,7 @@ impl Generics {
|
||||||
fn find_type_or_const_param(&self, param: TypeOrConstParamId) -> Option<usize> {
|
fn find_type_or_const_param(&self, param: TypeOrConstParamId) -> Option<usize> {
|
||||||
if param.parent == self.def {
|
if param.parent == self.def {
|
||||||
let idx = param.local_id.into_raw().into_u32() as usize;
|
let idx = param.local_id.into_raw().into_u32() as usize;
|
||||||
debug_assert!(idx <= self.params.type_or_consts.len());
|
debug_assert!(idx <= self.params.len_type_or_consts());
|
||||||
Some(idx)
|
Some(idx)
|
||||||
} else {
|
} else {
|
||||||
debug_assert_eq!(self.parent_generics().map(|it| it.def), Some(param.parent));
|
debug_assert_eq!(self.parent_generics().map(|it| it.def), Some(param.parent));
|
||||||
|
@ -164,7 +164,7 @@ impl Generics {
|
||||||
if lifetime.parent == self.def {
|
if lifetime.parent == self.def {
|
||||||
let idx = lifetime.local_id.into_raw().into_u32() as usize;
|
let idx = lifetime.local_id.into_raw().into_u32() as usize;
|
||||||
debug_assert!(idx <= self.params.lifetimes.len());
|
debug_assert!(idx <= self.params.lifetimes.len());
|
||||||
Some(self.params.type_or_consts.len() + idx)
|
Some(self.params.len_type_or_consts() + idx)
|
||||||
} else {
|
} else {
|
||||||
debug_assert_eq!(self.parent_generics().map(|it| it.def), Some(lifetime.parent));
|
debug_assert_eq!(self.parent_generics().map(|it| it.def), Some(lifetime.parent));
|
||||||
self.parent_generics()
|
self.parent_generics()
|
||||||
|
|
|
@ -2071,7 +2071,7 @@ pub(crate) fn impl_self_ty_query(db: &dyn HirDatabase, impl_id: ImplId) -> Binde
|
||||||
// returns None if def is a type arg
|
// returns None if def is a type arg
|
||||||
pub(crate) fn const_param_ty_query(db: &dyn HirDatabase, def: ConstParamId) -> Ty {
|
pub(crate) fn const_param_ty_query(db: &dyn HirDatabase, def: ConstParamId) -> Ty {
|
||||||
let parent_data = db.generic_params(def.parent());
|
let parent_data = db.generic_params(def.parent());
|
||||||
let data = &parent_data.type_or_consts[def.local_id()];
|
let data = &parent_data[def.local_id()];
|
||||||
let resolver = def.parent().resolver(db.upcast());
|
let resolver = def.parent().resolver(db.upcast());
|
||||||
let ctx = TyLoweringContext::new(db, &resolver, def.parent().into());
|
let ctx = TyLoweringContext::new(db, &resolver, def.parent().into());
|
||||||
match data {
|
match data {
|
||||||
|
|
|
@ -183,7 +183,7 @@ impl MirLowerError {
|
||||||
},
|
},
|
||||||
MirLowerError::GenericArgNotProvided(id, subst) => {
|
MirLowerError::GenericArgNotProvided(id, subst) => {
|
||||||
let parent = id.parent;
|
let parent = id.parent;
|
||||||
let param = &db.generic_params(parent).type_or_consts[id.local_id];
|
let param = &db.generic_params(parent)[id.local_id];
|
||||||
writeln!(
|
writeln!(
|
||||||
f,
|
f,
|
||||||
"Generic arg not provided for {}",
|
"Generic arg not provided for {}",
|
||||||
|
|
|
@ -452,7 +452,7 @@ impl HirDisplay for TypeOrConstParam {
|
||||||
impl HirDisplay for TypeParam {
|
impl HirDisplay for TypeParam {
|
||||||
fn hir_fmt(&self, f: &mut HirFormatter<'_>) -> Result<(), HirDisplayError> {
|
fn hir_fmt(&self, f: &mut HirFormatter<'_>) -> Result<(), HirDisplayError> {
|
||||||
let params = f.db.generic_params(self.id.parent());
|
let params = f.db.generic_params(self.id.parent());
|
||||||
let param_data = ¶ms.type_or_consts[self.id.local_id()];
|
let param_data = ¶ms[self.id.local_id()];
|
||||||
let substs = TyBuilder::placeholder_subst(f.db, self.id.parent());
|
let substs = TyBuilder::placeholder_subst(f.db, self.id.parent());
|
||||||
let krate = self.id.parent().krate(f.db).id;
|
let krate = self.id.parent().krate(f.db).id;
|
||||||
let ty =
|
let ty =
|
||||||
|
@ -540,10 +540,9 @@ fn write_generic_params(
|
||||||
) -> Result<(), HirDisplayError> {
|
) -> Result<(), HirDisplayError> {
|
||||||
let params = f.db.generic_params(def);
|
let params = f.db.generic_params(def);
|
||||||
if params.lifetimes.is_empty()
|
if params.lifetimes.is_empty()
|
||||||
&& params.type_or_consts.iter().all(|it| it.1.const_param().is_none())
|
&& params.iter_type_or_consts().all(|it| it.1.const_param().is_none())
|
||||||
&& params
|
&& params
|
||||||
.type_or_consts
|
.iter_type_or_consts()
|
||||||
.iter()
|
|
||||||
.filter_map(|it| it.1.type_param())
|
.filter_map(|it| it.1.type_param())
|
||||||
.all(|param| !matches!(param.provenance, TypeParamProvenance::TypeParamList))
|
.all(|param| !matches!(param.provenance, TypeParamProvenance::TypeParamList))
|
||||||
{
|
{
|
||||||
|
@ -564,7 +563,7 @@ fn write_generic_params(
|
||||||
delim(f)?;
|
delim(f)?;
|
||||||
write!(f, "{}", lifetime.name.display(f.db.upcast()))?;
|
write!(f, "{}", lifetime.name.display(f.db.upcast()))?;
|
||||||
}
|
}
|
||||||
for (_, ty) in params.type_or_consts.iter() {
|
for (_, ty) in params.iter_type_or_consts() {
|
||||||
if let Some(name) = &ty.name() {
|
if let Some(name) = &ty.name() {
|
||||||
match ty {
|
match ty {
|
||||||
TypeOrConstParamData::TypeParamData(ty) => {
|
TypeOrConstParamData::TypeParamData(ty) => {
|
||||||
|
@ -616,7 +615,7 @@ fn has_disaplayable_predicates(params: &Interned<GenericParams>) -> bool {
|
||||||
!matches!(
|
!matches!(
|
||||||
pred,
|
pred,
|
||||||
WherePredicate::TypeBound { target: WherePredicateTypeTarget::TypeOrConstParam(id), .. }
|
WherePredicate::TypeBound { target: WherePredicateTypeTarget::TypeOrConstParam(id), .. }
|
||||||
if params.type_or_consts[*id].name().is_none()
|
if params[*id].name().is_none()
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -631,13 +630,13 @@ fn write_where_predicates(
|
||||||
let is_unnamed_type_target =
|
let is_unnamed_type_target =
|
||||||
|params: &Interned<GenericParams>, target: &WherePredicateTypeTarget| {
|
|params: &Interned<GenericParams>, target: &WherePredicateTypeTarget| {
|
||||||
matches!(target,
|
matches!(target,
|
||||||
WherePredicateTypeTarget::TypeOrConstParam(id) if params.type_or_consts[*id].name().is_none()
|
WherePredicateTypeTarget::TypeOrConstParam(id) if params[*id].name().is_none()
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
let write_target = |target: &WherePredicateTypeTarget, f: &mut HirFormatter<'_>| match target {
|
let write_target = |target: &WherePredicateTypeTarget, f: &mut HirFormatter<'_>| match target {
|
||||||
WherePredicateTypeTarget::TypeRef(ty) => ty.hir_fmt(f),
|
WherePredicateTypeTarget::TypeRef(ty) => ty.hir_fmt(f),
|
||||||
WherePredicateTypeTarget::TypeOrConstParam(id) => match params.type_or_consts[*id].name() {
|
WherePredicateTypeTarget::TypeOrConstParam(id) => match params[*id].name() {
|
||||||
Some(name) => write!(f, "{}", name.display(f.db.upcast())),
|
Some(name) => write!(f, "{}", name.display(f.db.upcast())),
|
||||||
None => f.write_str("{unnamed}"),
|
None => f.write_str("{unnamed}"),
|
||||||
},
|
},
|
||||||
|
|
|
@ -2503,8 +2503,7 @@ impl Trait {
|
||||||
count_required_only: bool,
|
count_required_only: bool,
|
||||||
) -> usize {
|
) -> usize {
|
||||||
db.generic_params(self.id.into())
|
db.generic_params(self.id.into())
|
||||||
.type_or_consts
|
.iter_type_or_consts()
|
||||||
.iter()
|
|
||||||
.filter(|(_, ty)| !matches!(ty, TypeOrConstParamData::TypeParamData(ty) if ty.provenance != TypeParamProvenance::TypeParamList))
|
.filter(|(_, ty)| !matches!(ty, TypeOrConstParamData::TypeParamData(ty) if ty.provenance != TypeParamProvenance::TypeParamList))
|
||||||
.filter(|(_, ty)| !count_required_only || !ty.has_default())
|
.filter(|(_, ty)| !count_required_only || !ty.has_default())
|
||||||
.count()
|
.count()
|
||||||
|
@ -3125,7 +3124,7 @@ impl_from!(
|
||||||
impl GenericDef {
|
impl GenericDef {
|
||||||
pub fn params(self, db: &dyn HirDatabase) -> Vec<GenericParam> {
|
pub fn params(self, db: &dyn HirDatabase) -> Vec<GenericParam> {
|
||||||
let generics = db.generic_params(self.into());
|
let generics = db.generic_params(self.into());
|
||||||
let ty_params = generics.type_or_consts.iter().map(|(local_id, _)| {
|
let ty_params = generics.iter_type_or_consts().map(|(local_id, _)| {
|
||||||
let toc = TypeOrConstParam { id: TypeOrConstParamId { parent: self.into(), local_id } };
|
let toc = TypeOrConstParam { id: TypeOrConstParamId { parent: self.into(), local_id } };
|
||||||
match toc.split(db) {
|
match toc.split(db) {
|
||||||
Either::Left(it) => GenericParam::ConstParam(it),
|
Either::Left(it) => GenericParam::ConstParam(it),
|
||||||
|
@ -3153,8 +3152,7 @@ impl GenericDef {
|
||||||
pub fn type_or_const_params(self, db: &dyn HirDatabase) -> Vec<TypeOrConstParam> {
|
pub fn type_or_const_params(self, db: &dyn HirDatabase) -> Vec<TypeOrConstParam> {
|
||||||
let generics = db.generic_params(self.into());
|
let generics = db.generic_params(self.into());
|
||||||
generics
|
generics
|
||||||
.type_or_consts
|
.iter_type_or_consts()
|
||||||
.iter()
|
|
||||||
.map(|(local_id, _)| TypeOrConstParam {
|
.map(|(local_id, _)| TypeOrConstParam {
|
||||||
id: TypeOrConstParamId { parent: self.into(), local_id },
|
id: TypeOrConstParamId { parent: self.into(), local_id },
|
||||||
})
|
})
|
||||||
|
@ -3496,7 +3494,7 @@ impl TypeParam {
|
||||||
/// argument)?
|
/// argument)?
|
||||||
pub fn is_implicit(self, db: &dyn HirDatabase) -> bool {
|
pub fn is_implicit(self, db: &dyn HirDatabase) -> bool {
|
||||||
let params = db.generic_params(self.id.parent());
|
let params = db.generic_params(self.id.parent());
|
||||||
let data = ¶ms.type_or_consts[self.id.local_id()];
|
let data = ¶ms[self.id.local_id()];
|
||||||
match data.type_param().unwrap().provenance {
|
match data.type_param().unwrap().provenance {
|
||||||
hir_def::generics::TypeParamProvenance::TypeParamList => false,
|
hir_def::generics::TypeParamProvenance::TypeParamList => false,
|
||||||
hir_def::generics::TypeParamProvenance::TraitSelf
|
hir_def::generics::TypeParamProvenance::TraitSelf
|
||||||
|
@ -3574,7 +3572,7 @@ impl ConstParam {
|
||||||
|
|
||||||
pub fn name(self, db: &dyn HirDatabase) -> Name {
|
pub fn name(self, db: &dyn HirDatabase) -> Name {
|
||||||
let params = db.generic_params(self.id.parent());
|
let params = db.generic_params(self.id.parent());
|
||||||
match params.type_or_consts[self.id.local_id()].name() {
|
match params[self.id.local_id()].name() {
|
||||||
Some(it) => it.clone(),
|
Some(it) => it.clone(),
|
||||||
None => {
|
None => {
|
||||||
never!();
|
never!();
|
||||||
|
@ -3617,7 +3615,7 @@ pub struct TypeOrConstParam {
|
||||||
impl TypeOrConstParam {
|
impl TypeOrConstParam {
|
||||||
pub fn name(self, db: &dyn HirDatabase) -> Name {
|
pub fn name(self, db: &dyn HirDatabase) -> Name {
|
||||||
let params = db.generic_params(self.id.parent);
|
let params = db.generic_params(self.id.parent);
|
||||||
match params.type_or_consts[self.id.local_id].name() {
|
match params[self.id.local_id].name() {
|
||||||
Some(n) => n.clone(),
|
Some(n) => n.clone(),
|
||||||
_ => Name::missing(),
|
_ => Name::missing(),
|
||||||
}
|
}
|
||||||
|
@ -3633,7 +3631,7 @@ impl TypeOrConstParam {
|
||||||
|
|
||||||
pub fn split(self, db: &dyn HirDatabase) -> Either<ConstParam, TypeParam> {
|
pub fn split(self, db: &dyn HirDatabase) -> Either<ConstParam, TypeParam> {
|
||||||
let params = db.generic_params(self.id.parent);
|
let params = db.generic_params(self.id.parent);
|
||||||
match ¶ms.type_or_consts[self.id.local_id] {
|
match ¶ms[self.id.local_id] {
|
||||||
hir_def::generics::TypeOrConstParamData::TypeParamData(_) => {
|
hir_def::generics::TypeOrConstParamData::TypeParamData(_) => {
|
||||||
Either::Right(TypeParam { id: TypeParamId::from_unchecked(self.id) })
|
Either::Right(TypeParam { id: TypeParamId::from_unchecked(self.id) })
|
||||||
}
|
}
|
||||||
|
@ -3652,7 +3650,7 @@ impl TypeOrConstParam {
|
||||||
|
|
||||||
pub fn as_type_param(self, db: &dyn HirDatabase) -> Option<TypeParam> {
|
pub fn as_type_param(self, db: &dyn HirDatabase) -> Option<TypeParam> {
|
||||||
let params = db.generic_params(self.id.parent);
|
let params = db.generic_params(self.id.parent);
|
||||||
match ¶ms.type_or_consts[self.id.local_id] {
|
match ¶ms[self.id.local_id] {
|
||||||
hir_def::generics::TypeOrConstParamData::TypeParamData(_) => {
|
hir_def::generics::TypeOrConstParamData::TypeParamData(_) => {
|
||||||
Some(TypeParam { id: TypeParamId::from_unchecked(self.id) })
|
Some(TypeParam { id: TypeParamId::from_unchecked(self.id) })
|
||||||
}
|
}
|
||||||
|
@ -3662,7 +3660,7 @@ impl TypeOrConstParam {
|
||||||
|
|
||||||
pub fn as_const_param(self, db: &dyn HirDatabase) -> Option<ConstParam> {
|
pub fn as_const_param(self, db: &dyn HirDatabase) -> Option<ConstParam> {
|
||||||
let params = db.generic_params(self.id.parent);
|
let params = db.generic_params(self.id.parent);
|
||||||
match ¶ms.type_or_consts[self.id.local_id] {
|
match ¶ms[self.id.local_id] {
|
||||||
hir_def::generics::TypeOrConstParamData::TypeParamData(_) => None,
|
hir_def::generics::TypeOrConstParamData::TypeParamData(_) => None,
|
||||||
hir_def::generics::TypeOrConstParamData::ConstParamData(_) => {
|
hir_def::generics::TypeOrConstParamData::ConstParamData(_) => {
|
||||||
Some(ConstParam { id: ConstParamId::from_unchecked(self.id) })
|
Some(ConstParam { id: ConstParamId::from_unchecked(self.id) })
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue