fix(generator): mask (u32) should be Literal, not Identifier

This commit is contained in:
Wataru Otsubo 2025-02-01 20:41:28 +09:00
parent 859d9c0fa3
commit 80ce358aee
2 changed files with 11 additions and 6 deletions

View file

@ -228,7 +228,12 @@ impl CodeGen for Register {
) = codegen_register::reg_type_def(&self, &upper_camel_name)?;
let code_reg_def: proc_macro2::TokenStream =
codegen_registerspec_impl::gen_registerspec_impl(reg_name.clone(), self.modf, type_t, type_ux);
codegen_registerspec_impl::gen_registerspec_impl(
reg_name.clone(),
self.modf,
type_t,
type_ux,
);
Ok(quote! {
pub mod #snake_case_name {

View file

@ -3,7 +3,7 @@
use heck::{ToShoutySnekCase, ToSnakeCase};
use itertools::Itertools;
use proc_macro2::{Ident, TokenStream};
use proc_macro2::{Ident, Literal, TokenStream};
use quote::quote;
use crate::types::{DataType, Field, MultipleParams, Register};
@ -298,12 +298,12 @@ fn generate_multiple_field(
multiple_params: &MultipleParams,
) -> (TokenStream, TokenStream, TokenStream) {
let num_multiple = multiple_params.multiple;
let id_num_multiple = util::parse_to_ident(&num_multiple.to_string()).unwrap();
let id_num_multiple = util::parse_to_literal(&num_multiple.to_string()).unwrap();
let id_field_type = single_field_type.to_rust_type_token();
let masks: Vec<_> = (0..multiple_params.multiple)
.map(|x| x * multiple_params.offset)
.map(|offset| single_mask_val << offset)
.map(|mask| util::parse_to_ident(&format!("0x{mask:x}")).unwrap())
.map(|mask| util::parse_to_literal(&format!("0x{mask:x}")).unwrap())
.collect();
debug_assert_eq!(masks.len(), num_multiple.try_into().unwrap());
let code_mask = quote! {
@ -331,7 +331,7 @@ fn generate_multiple_bool_field(
mask_name: Ident,
base_type: Ident,
snake_case_name: Ident,
masks: Vec<Ident>,
masks: Vec<Literal>,
) -> (TokenStream, TokenStream) {
let num_multiple = masks.len();
let elem_getter = masks.iter().enumerate().map(|(i, _mask)| {
@ -372,7 +372,7 @@ fn generate_multiple_ux_field(
base_type: Ident,
snake_case_name: Ident,
single_field_type: RustUxTypes,
masks: Vec<Ident>,
masks: Vec<Literal>,
) -> (TokenStream, TokenStream) {
let field_type = single_field_type.to_rust_type_token();
let num_multiple = masks.len();