From dd85598b5c97b3308b41f84491de567a9bb14d92 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Fri, 17 Jun 2022 21:25:29 +0200 Subject: [PATCH] why --- .rustfmt.toml | 3 +++ .../src/lib.rs | 27 +++++++++++++++++++ examples/one.rs | 14 ++++++++++ 3 files changed, 44 insertions(+) create mode 100644 .rustfmt.toml create mode 100644 accursed-unutterable-type-id-derive/src/lib.rs create mode 100644 examples/one.rs diff --git a/.rustfmt.toml b/.rustfmt.toml new file mode 100644 index 0000000..4d7dd9e --- /dev/null +++ b/.rustfmt.toml @@ -0,0 +1,3 @@ +imports_granularity = "Crate" +newline_style = "Unix" +group_imports = "StdExternalCrate" \ No newline at end of file diff --git a/accursed-unutterable-type-id-derive/src/lib.rs b/accursed-unutterable-type-id-derive/src/lib.rs new file mode 100644 index 0000000..c386026 --- /dev/null +++ b/accursed-unutterable-type-id-derive/src/lib.rs @@ -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) +} diff --git a/examples/one.rs b/examples/one.rs new file mode 100644 index 0000000..0660e99 --- /dev/null +++ b/examples/one.rs @@ -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::(); + let owo_id = AccursedUnutterableTypeId::of::(); + + assert_ne!(uwu_id, owo_id); +}