| #![allow( |
| clippy::no_effect_underscore_binding, |
| clippy::too_many_lines, |
| clippy::used_underscore_binding |
| )] |
| |
| #[rustfmt::skip] |
| mod gen; |
| |
| use proc_macro2::{Ident, Literal, TokenStream}; |
| use ref_cast::RefCast; |
| use std::fmt::{self, Debug}; |
| use std::ops::Deref; |
| use syn::punctuated::Punctuated; |
| |
| #[derive(RefCast)] |
| #[repr(transparent)] |
| pub struct Lite<T: ?Sized> { |
| value: T, |
| } |
| |
| #[allow(non_snake_case)] |
| pub fn Lite<T: ?Sized>(value: &T) -> &Lite<T> { |
| Lite::ref_cast(value) |
| } |
| |
| impl<T: ?Sized> Deref for Lite<T> { |
| type Target = T; |
| |
| fn deref(&self) -> &Self::Target { |
| &self.value |
| } |
| } |
| |
| impl Debug for Lite<bool> { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| write!(formatter, "{}", self.value) |
| } |
| } |
| |
| impl Debug for Lite<u32> { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| write!(formatter, "{}", self.value) |
| } |
| } |
| |
| impl Debug for Lite<usize> { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| write!(formatter, "{}", self.value) |
| } |
| } |
| |
| impl Debug for Lite<String> { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| write!(formatter, "{:?}", self.value) |
| } |
| } |
| |
| impl Debug for Lite<Ident> { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| write!(formatter, "{:?}", self.value.to_string()) |
| } |
| } |
| |
| impl Debug for Lite<Literal> { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| write!(formatter, "{}", self.value) |
| } |
| } |
| |
| impl Debug for Lite<TokenStream> { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| let string = self.value.to_string(); |
| if string.len() <= 80 { |
| write!(formatter, "TokenStream(`{}`)", self.value) |
| } else { |
| formatter |
| .debug_tuple("TokenStream") |
| .field(&format_args!("`{}`", string)) |
| .finish() |
| } |
| } |
| } |
| |
| impl<T> Debug for Lite<&T> |
| where |
| Lite<T>: Debug, |
| { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| Debug::fmt(Lite(self.value), formatter) |
| } |
| } |
| |
| impl<T> Debug for Lite<Box<T>> |
| where |
| Lite<T>: Debug, |
| { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| Debug::fmt(Lite(&*self.value), formatter) |
| } |
| } |
| |
| impl<T> Debug for Lite<Vec<T>> |
| where |
| Lite<T>: Debug, |
| { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| formatter |
| .debug_list() |
| .entries(self.value.iter().map(Lite)) |
| .finish() |
| } |
| } |
| |
| impl<T, P> Debug for Lite<Punctuated<T, P>> |
| where |
| Lite<T>: Debug, |
| Lite<P>: Debug, |
| { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| let mut list = formatter.debug_list(); |
| for pair in self.pairs() { |
| let (node, punct) = pair.into_tuple(); |
| list.entry(Lite(node)); |
| list.entries(punct.map(Lite)); |
| } |
| list.finish() |
| } |
| } |
| |
| struct Present; |
| |
| impl Debug for Present { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| formatter.write_str("Some") |
| } |
| } |
| |
| struct Option { |
| present: bool, |
| } |
| |
| impl Debug for Option { |
| fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| formatter.write_str(if self.present { "Some" } else { "None" }) |
| } |
| } |