mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 13:33:31 +00:00
Delete CloneAny
from rust-analyzer
's fork of AnyMap
...because it's very sketchy and causes FCWs. In this case it *is* actually sound, but still. I should write a better fork of anymap...
This commit is contained in:
parent
d59314800b
commit
0cea755154
1 changed files with 0 additions and 71 deletions
|
@ -68,8 +68,6 @@ pub type RawMap<A> = hash_map::HashMap<TypeId, Box<A>, BuildHasherDefault<TypeId
|
||||||
/// The type parameter `A` allows you to use a different value type; normally you will want
|
/// The type parameter `A` allows you to use a different value type; normally you will want
|
||||||
/// it to be `core::any::Any` (also known as `std::any::Any`), but there are other choices:
|
/// it to be `core::any::Any` (also known as `std::any::Any`), but there are other choices:
|
||||||
///
|
///
|
||||||
/// - If you want the entire map to be cloneable, use `CloneAny` instead of `Any`; with
|
|
||||||
/// that, you can only add types that implement `Clone` to the map.
|
|
||||||
/// - You can add on `+ Send` or `+ Send + Sync` (e.g. `Map<dyn Any + Send>`) to add those
|
/// - You can add on `+ Send` or `+ Send + Sync` (e.g. `Map<dyn Any + Send>`) to add those
|
||||||
/// auto traits.
|
/// auto traits.
|
||||||
///
|
///
|
||||||
|
@ -79,9 +77,6 @@ pub type RawMap<A> = hash_map::HashMap<TypeId, Box<A>, BuildHasherDefault<TypeId
|
||||||
/// also spelled [`AnyMap`] for convenience.
|
/// also spelled [`AnyMap`] for convenience.
|
||||||
/// - <code>[Map]<dyn [core::any::Any] + Send></code>
|
/// - <code>[Map]<dyn [core::any::Any] + Send></code>
|
||||||
/// - <code>[Map]<dyn [core::any::Any] + Send + Sync></code>
|
/// - <code>[Map]<dyn [core::any::Any] + Send + Sync></code>
|
||||||
/// - <code>[Map]<dyn [CloneAny]></code>
|
|
||||||
/// - <code>[Map]<dyn [CloneAny] + Send></code>
|
|
||||||
/// - <code>[Map]<dyn [CloneAny] + Send + Sync></code>
|
|
||||||
///
|
///
|
||||||
/// ## Example
|
/// ## Example
|
||||||
///
|
///
|
||||||
|
@ -205,12 +200,6 @@ mod tests {
|
||||||
assert_debug::<Map<dyn Any>>();
|
assert_debug::<Map<dyn Any>>();
|
||||||
assert_debug::<Map<dyn Any + Send>>();
|
assert_debug::<Map<dyn Any + Send>>();
|
||||||
assert_debug::<Map<dyn Any + Send + Sync>>();
|
assert_debug::<Map<dyn Any + Send + Sync>>();
|
||||||
assert_send::<Map<dyn CloneAny + Send>>();
|
|
||||||
assert_send::<Map<dyn CloneAny + Send + Sync>>();
|
|
||||||
assert_sync::<Map<dyn CloneAny + Send + Sync>>();
|
|
||||||
assert_debug::<Map<dyn CloneAny>>();
|
|
||||||
assert_debug::<Map<dyn CloneAny + Send>>();
|
|
||||||
assert_debug::<Map<dyn CloneAny + Send + Sync>>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -232,53 +221,6 @@ mod tests {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// impl some traits for dyn Any
|
|
||||||
use core::fmt;
|
|
||||||
|
|
||||||
#[doc(hidden)]
|
|
||||||
pub trait CloneToAny {
|
|
||||||
/// Clone `self` into a new `Box<dyn CloneAny>` object.
|
|
||||||
fn clone_to_any(&self) -> Box<dyn CloneAny>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Any + Clone> CloneToAny for T {
|
|
||||||
#[inline]
|
|
||||||
fn clone_to_any(&self) -> Box<dyn CloneAny> {
|
|
||||||
Box::new(self.clone())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! impl_clone {
|
|
||||||
($t:ty) => {
|
|
||||||
impl Clone for Box<$t> {
|
|
||||||
#[inline]
|
|
||||||
fn clone(&self) -> Box<$t> {
|
|
||||||
// SAFETY: this dance is to reapply any Send/Sync marker. I’m not happy about this
|
|
||||||
// approach, given that I used to do it in safe code, but then came a dodgy
|
|
||||||
// future-compatibility warning where_clauses_object_safety, which is spurious for
|
|
||||||
// auto traits but still super annoying (future-compatibility lints seem to mean
|
|
||||||
// your bin crate needs a corresponding allow!). Although I explained my plight¹
|
|
||||||
// and it was all explained and agreed upon, no action has been taken. So I finally
|
|
||||||
// caved and worked around it by doing it this way, which matches what’s done for
|
|
||||||
// core::any², so it’s probably not *too* bad.
|
|
||||||
//
|
|
||||||
// ¹ https://github.com/rust-lang/rust/issues/51443#issuecomment-421988013
|
|
||||||
// ² https://github.com/rust-lang/rust/blob/e7825f2b690c9a0d21b6f6d84c404bb53b151b38/library/alloc/src/boxed.rs#L1613-L1616
|
|
||||||
let clone: Box<dyn CloneAny> = (**self).clone_to_any();
|
|
||||||
let raw: *mut dyn CloneAny = Box::into_raw(clone);
|
|
||||||
unsafe { Box::from_raw(raw as *mut $t) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Debug for $t {
|
|
||||||
#[inline]
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
||||||
f.pad(stringify!($t))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Methods for downcasting from an `Any`-like trait object.
|
/// Methods for downcasting from an `Any`-like trait object.
|
||||||
///
|
///
|
||||||
/// This should only be implemented on trait objects for subtraits of `Any`, though you can
|
/// This should only be implemented on trait objects for subtraits of `Any`, though you can
|
||||||
|
@ -350,16 +292,3 @@ macro_rules! implement {
|
||||||
implement!(Any);
|
implement!(Any);
|
||||||
implement!(Any + Send);
|
implement!(Any + Send);
|
||||||
implement!(Any + Send + Sync);
|
implement!(Any + Send + Sync);
|
||||||
|
|
||||||
/// [`Any`], but with cloning.
|
|
||||||
///
|
|
||||||
/// Every type with no non-`'static` references that implements `Clone` implements `CloneAny`.
|
|
||||||
/// See [`core::any`] for more details on `Any` in general.
|
|
||||||
pub trait CloneAny: Any + CloneToAny {}
|
|
||||||
impl<T: Any + Clone> CloneAny for T {}
|
|
||||||
implement!(CloneAny);
|
|
||||||
implement!(CloneAny + Send);
|
|
||||||
implement!(CloneAny + Send + Sync);
|
|
||||||
impl_clone!(dyn CloneAny);
|
|
||||||
impl_clone!(dyn CloneAny + Send);
|
|
||||||
impl_clone!(dyn CloneAny + Send + Sync);
|
|
||||||
|
|
Loading…
Reference in a new issue