diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-01-17 05:25:23 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-17 05:25:23 +0100 |
| commit | 5162e39bffdb244de1bbbd06eeffa4a095df0ecc (patch) | |
| tree | 0fb793de1230a42df7756e87ed706df08e08203e | |
| parent | 9bcc46ee90999097a2baf67023fd8074a4d2efe1 (diff) | |
| parent | 1ae1c49c501f8c6baf662e0a8081280bb7a9e79c (diff) | |
| download | rust-5162e39bffdb244de1bbbd06eeffa4a095df0ecc.tar.gz rust-5162e39bffdb244de1bbbd06eeffa4a095df0ecc.zip | |
Rollup merge of #106953 - kylematsuda:early-binder-docs, r=jackh726
Document `EarlyBinder::subst_identity` and `skip_binder` Finishing implementing #105779 will change several commonly used queries to return `EarlyBinder` by default. This PR adds documentation for two of the methods used to access data inside the `EarlyBinder`. I tried to summarize some of the [discussion from the issue](https://github.com/rust-lang/rust/issues/105779#issuecomment-1375512647) in writing this. r? `@lcnr`
| -rw-r--r-- | compiler/rustc_middle/src/ty/subst.rs | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/compiler/rustc_middle/src/ty/subst.rs b/compiler/rustc_middle/src/ty/subst.rs index 5f1f1b2c747..a07582fc8ff 100644 --- a/compiler/rustc_middle/src/ty/subst.rs +++ b/compiler/rustc_middle/src/ty/subst.rs @@ -545,6 +545,9 @@ impl<'tcx, T: TypeVisitable<'tcx>> TypeVisitable<'tcx> for &'tcx ty::List<T> { /// Similar to [`super::Binder`] except that it tracks early bound generics, i.e. `struct Foo<T>(T)` /// needs `T` substituted immediately. This type primarily exists to avoid forgetting to call /// `subst`. +/// +/// If you don't have anything to `subst`, you may be looking for +/// [`subst_identity`](EarlyBinder::subst_identity) or [`skip_binder`](EarlyBinder::skip_binder). #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] #[derive(Encodable, Decodable, HashStable)] pub struct EarlyBinder<T>(pub T); @@ -585,6 +588,14 @@ impl<T> EarlyBinder<T> { EarlyBinder(value) } + /// Skips the binder and returns the "bound" value. + /// This can be used to extract data that does not depend on generic parameters + /// (e.g., getting the `DefId` of the inner value or getting the number of + /// arguments of an `FnSig`). Otherwise, consider using + /// [`subst_identity`](EarlyBinder::subst_identity). + /// + /// See also [`Binder::skip_binder`](super::Binder::skip_binder), which is + /// the analogous operation on [`super::Binder`]. pub fn skip_binder(self) -> T { self.0 } @@ -736,6 +747,14 @@ impl<'tcx, T: TypeFoldable<'tcx>> ty::EarlyBinder<T> { self.0.fold_with(&mut folder) } + /// Makes the identity substitution `T0 => T0, ..., TN => TN`. + /// Conceptually, this converts universally bound variables into placeholders + /// when inside of a given item. + /// + /// For example, consider `for<T> fn foo<T>(){ .. }`: + /// - Outside of `foo`, `T` is bound (represented by the presence of `EarlyBinder`). + /// - Inside of the body of `foo`, we treat `T` as a placeholder by calling + /// `subst_identity` to discharge the `EarlyBinder`. pub fn subst_identity(self) -> T { self.0 } |
