mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-19 11:12:43 +00:00
Use derivative for Clone
This commit is contained in:
parent
22b27120b9
commit
de83057ac4
12
Cargo.lock
12
Cargo.lock
@ -1011,6 +1011,17 @@ dependencies = [
|
||||
"syn 2.0.29",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derivative"
|
||||
version = "2.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_builder"
|
||||
version = "0.12.0"
|
||||
@ -4667,6 +4678,7 @@ name = "rustc_type_ir"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
"derivative",
|
||||
"rustc_data_structures",
|
||||
"rustc_index",
|
||||
"rustc_macros",
|
||||
|
@ -6,6 +6,7 @@ edition = "2021"
|
||||
[dependencies]
|
||||
# tidy-alphabetical-start
|
||||
bitflags = "1.2.1"
|
||||
derivative = "2.2.0"
|
||||
rustc_data_structures = { path = "../rustc_data_structures" }
|
||||
rustc_index = { path = "../rustc_index" }
|
||||
rustc_macros = { path = "../rustc_macros" }
|
||||
|
@ -13,6 +13,8 @@ use crate::{HashStableContext, Interner, TyEncoder, UniverseIndex};
|
||||
/// A "canonicalized" type `V` is one where all free inference
|
||||
/// variables have been rewritten to "canonical vars". These are
|
||||
/// numbered starting from 0 in order of first appearance.
|
||||
#[derive(derivative::Derivative)]
|
||||
#[derivative(Clone(bound = "V: Clone"))]
|
||||
pub struct Canonical<I: Interner, V> {
|
||||
pub value: V,
|
||||
pub max_universe: UniverseIndex,
|
||||
@ -108,16 +110,6 @@ impl<I: Interner, V: fmt::Debug> fmt::Debug for Canonical<I, V> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<I: Interner, V: Clone> Clone for Canonical<I, V> {
|
||||
fn clone(&self) -> Self {
|
||||
Canonical {
|
||||
value: self.value.clone(),
|
||||
max_universe: self.max_universe.clone(),
|
||||
variables: self.variables.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<I: Interner, V: Copy> Copy for Canonical<I, V> where I::CanonicalVars: Copy {}
|
||||
|
||||
impl<I: Interner, V: TypeFoldable<I>> TypeFoldable<I> for Canonical<I, V>
|
||||
|
@ -13,7 +13,8 @@ use crate::{
|
||||
use self::ConstKind::*;
|
||||
|
||||
/// Represents a constant in Rust.
|
||||
// #[derive(derive_more::From)]
|
||||
#[derive(derivative::Derivative)]
|
||||
#[derivative(Clone(bound = ""))]
|
||||
pub enum ConstKind<I: Interner> {
|
||||
/// A const generic parameter.
|
||||
Param(I::ParamConst),
|
||||
@ -211,21 +212,6 @@ impl<I: Interner> PartialEq for ConstKind<I> {
|
||||
|
||||
impl<I: Interner> Eq for ConstKind<I> {}
|
||||
|
||||
impl<I: Interner> Clone for ConstKind<I> {
|
||||
fn clone(&self) -> Self {
|
||||
match self {
|
||||
Param(arg0) => Param(arg0.clone()),
|
||||
Infer(arg0) => Infer(arg0.clone()),
|
||||
Bound(arg0, arg1) => Bound(arg0.clone(), arg1.clone()),
|
||||
Placeholder(arg0) => Placeholder(arg0.clone()),
|
||||
Unevaluated(arg0) => Unevaluated(arg0.clone()),
|
||||
Value(arg0) => Value(arg0.clone()),
|
||||
Error(arg0) => Error(arg0.clone()),
|
||||
Expr(arg0) => Expr(arg0.clone()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<I: Interner> fmt::Debug for ConstKind<I> {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
WithInfcx::with_no_infcx(self).fmt(f)
|
||||
|
@ -12,6 +12,8 @@ use crate::{TyDecoder, TyEncoder};
|
||||
|
||||
/// A clause is something that can appear in where bounds or be inferred
|
||||
/// by implied bounds.
|
||||
#[derive(derivative::Derivative)]
|
||||
#[derivative(Clone(bound = ""))]
|
||||
pub enum ClauseKind<I: Interner> {
|
||||
/// Corresponds to `where Foo: Bar<A, B, C>`. `Foo` here would be
|
||||
/// the `Self` type of the trait reference and `A`, `B`, and `C`
|
||||
@ -39,20 +41,6 @@ pub enum ClauseKind<I: Interner> {
|
||||
ConstEvaluatable(I::Const),
|
||||
}
|
||||
|
||||
impl<I: Interner> Clone for ClauseKind<I> {
|
||||
fn clone(&self) -> Self {
|
||||
match self {
|
||||
Self::Trait(arg0) => Self::Trait(arg0.clone()),
|
||||
Self::RegionOutlives(arg0) => Self::RegionOutlives(arg0.clone()),
|
||||
Self::TypeOutlives(arg0) => Self::TypeOutlives(arg0.clone()),
|
||||
Self::Projection(arg0) => Self::Projection(arg0.clone()),
|
||||
Self::ConstArgHasType(arg0, arg1) => Self::ConstArgHasType(arg0.clone(), arg1.clone()),
|
||||
Self::WellFormed(arg0) => Self::WellFormed(arg0.clone()),
|
||||
Self::ConstEvaluatable(arg0) => Self::ConstEvaluatable(arg0.clone()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<I: Interner> Copy for ClauseKind<I>
|
||||
where
|
||||
I::Ty: Copy,
|
||||
@ -249,6 +237,8 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(derivative::Derivative)]
|
||||
#[derivative(Clone(bound = ""))]
|
||||
pub enum PredicateKind<I: Interner> {
|
||||
/// Prove a clause
|
||||
Clause(ClauseKind<I>),
|
||||
@ -305,25 +295,6 @@ where
|
||||
{
|
||||
}
|
||||
|
||||
impl<I: Interner> Clone for PredicateKind<I> {
|
||||
fn clone(&self) -> Self {
|
||||
match self {
|
||||
Self::Clause(arg0) => Self::Clause(arg0.clone()),
|
||||
Self::ObjectSafe(arg0) => Self::ObjectSafe(arg0.clone()),
|
||||
Self::ClosureKind(arg0, arg1, arg2) => {
|
||||
Self::ClosureKind(arg0.clone(), arg1.clone(), arg2.clone())
|
||||
}
|
||||
Self::Subtype(arg0) => Self::Subtype(arg0.clone()),
|
||||
Self::Coerce(arg0) => Self::Coerce(arg0.clone()),
|
||||
Self::ConstEquate(arg0, arg1) => Self::ConstEquate(arg0.clone(), arg1.clone()),
|
||||
Self::Ambiguous => Self::Ambiguous,
|
||||
Self::AliasRelate(arg0, arg1, arg2) => {
|
||||
Self::AliasRelate(arg0.clone(), arg1.clone(), arg2.clone())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<I: Interner> PartialEq for PredicateKind<I> {
|
||||
fn eq(&self, other: &Self) -> bool {
|
||||
match (self, other) {
|
||||
|
@ -118,6 +118,8 @@ use self::RegionKind::*;
|
||||
/// [1]: https://smallcultfollowing.com/babysteps/blog/2013/10/29/intermingled-parameter-lists/
|
||||
/// [2]: https://smallcultfollowing.com/babysteps/blog/2013/11/04/intermingled-parameter-lists/
|
||||
/// [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/traits/hrtb.html
|
||||
#[derive(derivative::Derivative)]
|
||||
#[derivative(Clone(bound = ""))]
|
||||
pub enum RegionKind<I: Interner> {
|
||||
/// Region bound in a type or fn declaration which will be
|
||||
/// substituted 'early' -- that is, at the same time when type
|
||||
@ -178,22 +180,6 @@ where
|
||||
{
|
||||
}
|
||||
|
||||
// This is manually implemented because a derive would require `I: Clone`
|
||||
impl<I: Interner> Clone for RegionKind<I> {
|
||||
fn clone(&self) -> Self {
|
||||
match self {
|
||||
ReEarlyBound(r) => ReEarlyBound(r.clone()),
|
||||
ReLateBound(d, r) => ReLateBound(*d, r.clone()),
|
||||
ReFree(r) => ReFree(r.clone()),
|
||||
ReStatic => ReStatic,
|
||||
ReVar(r) => ReVar(r.clone()),
|
||||
RePlaceholder(r) => RePlaceholder(r.clone()),
|
||||
ReErased => ReErased,
|
||||
ReError(r) => ReError(r.clone()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This is manually implemented because a derive would require `I: PartialEq`
|
||||
impl<I: Interner> PartialEq for RegionKind<I> {
|
||||
#[inline]
|
||||
|
@ -114,6 +114,8 @@ pub enum AliasKind {
|
||||
/// Types written by the user start out as `hir::TyKind` and get
|
||||
/// converted to this representation using `AstConv::ast_ty_to_ty`.
|
||||
#[rustc_diagnostic_item = "IrTyKind"]
|
||||
#[derive(derivative::Derivative)]
|
||||
#[derivative(Clone(bound = ""))]
|
||||
pub enum TyKind<I: Interner> {
|
||||
/// The primitive boolean type. Written as `bool`.
|
||||
Bool,
|
||||
@ -324,40 +326,6 @@ const fn tykind_discriminant<I: Interner>(value: &TyKind<I>) -> usize {
|
||||
}
|
||||
}
|
||||
|
||||
// This is manually implemented because a derive would require `I: Clone`
|
||||
impl<I: Interner> Clone for TyKind<I> {
|
||||
fn clone(&self) -> Self {
|
||||
match self {
|
||||
Bool => Bool,
|
||||
Char => Char,
|
||||
Int(i) => Int(*i),
|
||||
Uint(u) => Uint(*u),
|
||||
Float(f) => Float(*f),
|
||||
Adt(d, s) => Adt(d.clone(), s.clone()),
|
||||
Foreign(d) => Foreign(d.clone()),
|
||||
Str => Str,
|
||||
Array(t, c) => Array(t.clone(), c.clone()),
|
||||
Slice(t) => Slice(t.clone()),
|
||||
RawPtr(p) => RawPtr(p.clone()),
|
||||
Ref(r, t, m) => Ref(r.clone(), t.clone(), m.clone()),
|
||||
FnDef(d, s) => FnDef(d.clone(), s.clone()),
|
||||
FnPtr(s) => FnPtr(s.clone()),
|
||||
Dynamic(p, r, repr) => Dynamic(p.clone(), r.clone(), *repr),
|
||||
Closure(d, s) => Closure(d.clone(), s.clone()),
|
||||
Coroutine(d, s, m) => Coroutine(d.clone(), s.clone(), m.clone()),
|
||||
CoroutineWitness(d, s) => CoroutineWitness(d.clone(), s.clone()),
|
||||
Never => Never,
|
||||
Tuple(t) => Tuple(t.clone()),
|
||||
Alias(k, p) => Alias(*k, p.clone()),
|
||||
Param(p) => Param(p.clone()),
|
||||
Bound(d, b) => Bound(*d, b.clone()),
|
||||
Placeholder(p) => Placeholder(p.clone()),
|
||||
Infer(t) => Infer(t.clone()),
|
||||
Error(e) => Error(e.clone()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This is manually implemented because a derive would require `I: PartialEq`
|
||||
impl<I: Interner> PartialEq for TyKind<I> {
|
||||
#[inline]
|
||||
@ -614,6 +582,7 @@ impl<I: Interner> DebugWithInfcx<I> for TyKind<I> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This is manually implemented because a derive would require `I: Debug`
|
||||
impl<I: Interner> fmt::Debug for TyKind<I> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
|
@ -142,6 +142,7 @@ const PERMITTED_RUSTC_DEPENDENCIES: &[&str] = &[
|
||||
"darling_core",
|
||||
"darling_macro",
|
||||
"datafrog",
|
||||
"derivative",
|
||||
"derive_more",
|
||||
"derive_setters",
|
||||
"digest",
|
||||
|
Loading…
Reference in New Issue
Block a user