This commit is contained in:
nora 2022-06-17 21:25:29 +02:00
parent d20fc815da
commit dd85598b5c
3 changed files with 44 additions and 0 deletions

3
.rustfmt.toml Normal file
View file

@ -0,0 +1,3 @@
imports_granularity = "Crate"
newline_style = "Unix"
group_imports = "StdExternalCrate"

View file

@ -0,0 +1,27 @@
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput};
#[proc_macro_derive(AccursedUnutterablyTypeIdentified)]
pub fn my_macro(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = input.ident;
// SAFETY: We literally are the proc macro. and we have made sure that no duplicate type ids
// will ever happen, right? :ferrisClueless:
let expanded = quote! {
unsafe impl ::accursed_unutterable_type_id::AccursedUnutterablyTypeIdentified for #name {
fn type_id() -> ::accursed_unutterable_type_id::AccursedUnutterableTypeId {
::accursed_unutterable_type_id::AccursedUnutterableTypeId(
::accursed_unutterable_type_id::InternalAccursedUnutterableTypeId::new(
0
)
)
}
}
};
// Hand the output tokens back to the compiler
TokenStream::from(expanded)
}

14
examples/one.rs Normal file
View file

@ -0,0 +1,14 @@
use accursed_unutterable_type_id::{AccursedUnutterableTypeId, AccursedUnutterablyTypeIdentified};
#[derive(AccursedUnutterablyTypeIdentified)]
struct Uwu;
#[derive(AccursedUnutterablyTypeIdentified)]
struct Owo;
fn main() {
let uwu_id = AccursedUnutterableTypeId::of::<Uwu>();
let owo_id = AccursedUnutterableTypeId::of::<Owo>();
assert_ne!(uwu_id, owo_id);
}