• N
    Overhaul `TyS` and `Ty`. · e9a0c429
    Nicholas Nethercote 提交于
    Specifically, change `Ty` from this:
    ```
    pub type Ty<'tcx> = &'tcx TyS<'tcx>;
    ```
    to this
    ```
    pub struct Ty<'tcx>(Interned<'tcx, TyS<'tcx>>);
    ```
    There are two benefits to this.
    - It's now a first class type, so we can define methods on it. This
      means we can move a lot of methods away from `TyS`, leaving `TyS` as a
      barely-used type, which is appropriate given that it's not meant to
      be used directly.
    - The uniqueness requirement is now explicit, via the `Interned` type.
      E.g. the pointer-based `Eq` and `Hash` comes from `Interned`, rather
      than via `TyS`, which wasn't obvious at all.
    
    Much of this commit is boring churn. The interesting changes are in
    these files:
    - compiler/rustc_middle/src/arena.rs
    - compiler/rustc_middle/src/mir/visit.rs
    - compiler/rustc_middle/src/ty/context.rs
    - compiler/rustc_middle/src/ty/mod.rs
    
    Specifically:
    - Most mentions of `TyS` are removed. It's very much a dumb struct now;
      `Ty` has all the smarts.
    - `TyS` now has `crate` visibility instead of `pub`.
    - `TyS::make_for_test` is removed in favour of the static `BOOL_TY`,
      which just works better with the new structure.
    - The `Eq`/`Ord`/`Hash` impls are removed from `TyS`. `Interned`s impls
      of `Eq`/`Hash` now suffice. `Ord` is now partly on `Interned`
      (pointer-based, for the `Equal` case) and partly on `TyS`
      (contents-based, for the other cases).
    - There are many tedious sigil adjustments, i.e. adding or removing `*`
      or `&`. They seem to be unavoidable.
    e9a0c429
deconstruct_pat.rs 73.2 KB