mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-24 15:54:15 +00:00
Document how recursion is handled for ty::Ty
Based on this forum discussion: https://internals.rust-lang.org/t/recursive-type-representation-in-rustc/15235/4
This commit is contained in:
parent
473eaa42e9
commit
9931782a38
@ -64,6 +64,30 @@ bitflags! {
|
||||
/// Moreover, Rust only allows recursive data types through indirection.
|
||||
///
|
||||
/// [adt]: https://en.wikipedia.org/wiki/Algebraic_data_type
|
||||
///
|
||||
/// # Recursive types
|
||||
///
|
||||
/// It may seem impossible to represent recursive types using [`Ty`],
|
||||
/// since [`TyKind::Adt`] includes [`AdtDef`], which includes its fields,
|
||||
/// creating a cycle. However, `AdtDef` does not actually include the *types*
|
||||
/// of its fields; it includes just their [`DefId`]s.
|
||||
///
|
||||
/// [`TyKind::Adt`]: ty::TyKind::Adt
|
||||
///
|
||||
/// For example, the following type:
|
||||
///
|
||||
/// ```
|
||||
/// struct S { x: Box<S> }
|
||||
/// ```
|
||||
///
|
||||
/// is essentially represented with [`Ty`] as the following pseudocode:
|
||||
///
|
||||
/// ```
|
||||
/// struct S { x }
|
||||
/// ```
|
||||
///
|
||||
/// where `x` here represents the `DefId` of `S.x`. Then, the `DefId`
|
||||
/// can be used with [`TyCtxt::type_of()`] to get the type of the field.
|
||||
pub struct AdtDef {
|
||||
/// The `DefId` of the struct, enum or union item.
|
||||
pub did: DefId,
|
||||
|
@ -1700,7 +1700,7 @@ impl ReprOptions {
|
||||
|
||||
impl<'tcx> FieldDef {
|
||||
/// Returns the type of this field. The resulting type is not normalized. The `subst` is
|
||||
/// typically obtained via the second field of `TyKind::AdtDef`.
|
||||
/// typically obtained via the second field of [`TyKind::Adt`].
|
||||
pub fn ty(&self, tcx: TyCtxt<'tcx>, subst: SubstsRef<'tcx>) -> Ty<'tcx> {
|
||||
tcx.type_of(self.did).subst(tcx, subst)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user