From cb7cb7bd9e83e39249a78df59282138c3d907d51 Mon Sep 17 00:00:00 2001 From: Noritada Kobayashi Date: Tue, 17 Sep 2024 23:16:34 +0900 Subject: [PATCH 1/2] codegen: correctly use `parse_macro_input!` --- codegen/src/lib.rs | 10 +++------- codegen/tests/02-not-empty-enum.stderr | 6 +++--- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index c00807b..6df869f 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -4,7 +4,7 @@ use proc_macro::TokenStream; use quote::quote; use syn::{ parse::{Parse, ParseStream}, - parse_macro_input, DeriveInput, Lit, Result, Token, + parse_macro_input, ItemEnum, Lit, Result, Token, }; #[proc_macro_attribute] @@ -20,8 +20,8 @@ pub fn parameter_codes(args: TokenStream, input: TokenStream) -> TokenStream { .into(); }; - let input = parse_macro_input!(input as DeriveInput); - if !is_empty_enum(&input) { + let input = parse_macro_input!(input as ItemEnum); + if !input.variants.is_empty() { return syn::Error::new(input.ident.span(), "not an empty enum") .into_compile_error() .into(); @@ -49,10 +49,6 @@ pub fn parameter_codes(args: TokenStream, input: TokenStream) -> TokenStream { .into() } -fn is_empty_enum(input: &DeriveInput) -> bool { - matches!(&input.data, syn::Data::Enum(enum_) if enum_.variants.is_empty()) -} - #[derive(Debug)] struct ParameterCodesArgs { path: (String, proc_macro2::Span), diff --git a/codegen/tests/02-not-empty-enum.stderr b/codegen/tests/02-not-empty-enum.stderr index 3bfcca3..5de191d 100644 --- a/codegen/tests/02-not-empty-enum.stderr +++ b/codegen/tests/02-not-empty-enum.stderr @@ -4,8 +4,8 @@ error: not an empty enum 4 | pub enum FooCodes { | ^^^^^^^^ -error: not an empty enum - --> tests/02-not-empty-enum.rs:10:12 +error: expected `enum` + --> tests/02-not-empty-enum.rs:10:5 | 10 | pub struct BarCodes; - | ^^^^^^^^ + | ^^^^^^ From d29e48531e2045a766ebb8c78e67b71981f6f114 Mon Sep 17 00:00:00 2001 From: Noritada Kobayashi Date: Wed, 18 Sep 2024 00:29:41 +0900 Subject: [PATCH 2/2] codegen: copy attributes from the original enum --- codegen/src/lib.rs | 2 ++ codegen/tests/01-normal-case.rs | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/codegen/src/lib.rs b/codegen/src/lib.rs index 6df869f..9454ea1 100644 --- a/codegen/src/lib.rs +++ b/codegen/src/lib.rs @@ -26,6 +26,7 @@ pub fn parameter_codes(args: TokenStream, input: TokenStream) -> TokenStream { .into_compile_error() .into(); } + let attrs = input.attrs; let vis = input.vis; let ident = input.ident; @@ -33,6 +34,7 @@ pub fn parameter_codes(args: TokenStream, input: TokenStream) -> TokenStream { use std::cell::LazyCell; use std::collections::HashMap; + #(#attrs)* #vis enum #ident { #entries } diff --git a/codegen/tests/01-normal-case.rs b/codegen/tests/01-normal-case.rs index e55e02c..4e3d885 100644 --- a/codegen/tests/01-normal-case.rs +++ b/codegen/tests/01-normal-case.rs @@ -1,6 +1,8 @@ use grib_codegen::parameter_codes; #[parameter_codes(path = "tests/data/table")] +#[derive(Debug, PartialEq)] +#[repr(u32)] pub enum FooCodes {} #[allow(dead_code)] @@ -20,4 +22,6 @@ fn main() { assert_eq!(FooCodes::HGT as u32, 0x_00_03_05); assert_eq!(FooCodes::remap(&0), None); assert_eq!(FooCodes::remap(&0x_00_03_c2), Some(FooCodes::U_GWD as u32)); + assert_eq!(format!("{:?}", FooCodes::TMP), "TMP"); + assert_eq!(FooCodes::TMP, FooCodes::TMP); }