Skip to content

Commit 7daf9e0

Browse files
committed
generate: use groups for delimited tokens
Uses `proc_macro2::Group` for token streams delimited with braces. Resolves: #863
1 parent fd8e149 commit 7daf9e0

File tree

3 files changed

+36
-35
lines changed

3 files changed

+36
-35
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
99

1010
- Fix STM32-patched CI
1111
- Fix `enumeratedValues` with `isDefault` only
12+
- Fix invalid `Punct` error from `proc_macro2`
1213

1314
## [v0.33.4] - 2024-06-16
1415

src/generate/peripheral.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::svd::{
1212
self, Cluster, ClusterInfo, MaybeArray, Peripheral, Register, RegisterCluster, RegisterInfo,
1313
};
1414
use log::{debug, trace, warn};
15-
use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
15+
use proc_macro2::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream};
1616
use quote::{quote, ToTokens};
1717
use syn::{punctuated::Punctuated, Token};
1818

@@ -245,19 +245,18 @@ pub fn render(p_original: &Peripheral, index: &Index, config: &Config) -> Result
245245
let reg_block =
246246
register_or_cluster_block(&ercs, &derive_infos, None, "Register block", None, config)?;
247247

248-
let open = Punct::new('{', Spacing::Alone);
249-
let close = Punct::new('}', Spacing::Alone);
250-
251248
out.extend(quote! {
252249
#[doc = #description]
253250
#feature_attribute
254-
pub mod #mod_ty #open
251+
pub mod #mod_ty
255252
});
256253

257-
out.extend(reg_block);
258-
out.extend(mod_items);
254+
let mut out_items = TokenStream::new();
255+
out_items.extend(reg_block);
256+
out_items.extend(mod_items);
259257

260-
close.to_tokens(&mut out);
258+
let out_group = Group::new(Delimiter::Brace, out_items);
259+
out.extend(quote! { #out_group });
261260

262261
p.registers = Some(ercs);
263262

src/generate/register.rs

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use crate::svd::{
55
};
66
use core::u64;
77
use log::warn;
8-
use proc_macro2::{Ident, Punct, Spacing, Span, TokenStream};
9-
use quote::{quote, ToTokens};
8+
use proc_macro2::{Delimiter, Group, Ident, Span, TokenStream};
9+
use quote::quote;
1010
use std::collections::HashSet;
1111
use std::fmt::Write;
1212
use std::{borrow::Cow, collections::BTreeMap};
@@ -136,11 +136,12 @@ pub fn render(
136136

137137
out.extend(quote! {
138138
#[doc = #description]
139-
pub mod #mod_ty {
140-
#mod_items
141-
}
139+
pub mod #mod_ty
142140
});
143141

142+
let mod_group = Group::new(Delimiter::Brace, mod_items);
143+
out.extend(quote! { #mod_group });
144+
144145
Ok(out)
145146
}
146147
}
@@ -297,9 +298,6 @@ pub fn render_register_mod(
297298
let mut zero_to_modify_fields_bitmap = 0;
298299
let mut one_to_modify_fields_bitmap = 0;
299300

300-
let open = Punct::new('{', Spacing::Alone);
301-
let close = Punct::new('}', Spacing::Alone);
302-
303301
let debug_feature = config
304302
.impl_debug_feature
305303
.as_ref()
@@ -362,24 +360,21 @@ pub fn render_register_mod(
362360
}
363361

364362
if can_read && !r_impl_items.is_empty() {
365-
mod_items.extend(quote! {
366-
impl R #open #r_impl_items #close
367-
});
363+
mod_items.extend(quote! { impl R });
364+
let r_impl_group = Group::new(Delimiter::Brace, quote! { #r_impl_items });
365+
mod_items.extend(quote! { #r_impl_group });
368366
}
369367
if !r_debug_impl.is_empty() {
370-
mod_items.extend(quote! {
371-
#r_debug_impl
372-
});
368+
mod_items.extend(quote! { #r_debug_impl });
373369
}
374370

375371
if can_write {
376372
mod_items.extend(quote! {
377-
impl W #open
373+
impl W
378374
});
379375

380-
mod_items.extend(w_impl_items);
381-
382-
close.to_tokens(&mut mod_items);
376+
let w_impl_group = Group::new(Delimiter::Brace, quote! { #w_impl_items });
377+
mod_items.extend(quote! { #w_impl_group });
383378
}
384379

385380
let doc = format!(
@@ -461,8 +456,6 @@ fn render_register_mod_debug(
461456
let name = util::name_of(register, config.ignore_groups);
462457
let span = Span::call_site();
463458
let regspec_ty = regspec(&name, config, span);
464-
let open = Punct::new('{', Spacing::Alone);
465-
let close = Punct::new('}', Spacing::Alone);
466459
let mut r_debug_impl = TokenStream::new();
467460
let debug_feature = config
468461
.impl_debug_feature
@@ -473,8 +466,14 @@ fn render_register_mod_debug(
473466
if access.can_read() && register.read_action.is_none() {
474467
r_debug_impl.extend(quote! {
475468
#debug_feature
476-
impl core::fmt::Debug for R #open
477-
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result #open
469+
impl core::fmt::Debug for R
470+
});
471+
let mut fmt_outer_impl = TokenStream::new();
472+
fmt_outer_impl.extend(quote! {
473+
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result
474+
});
475+
let mut fmt_inner_impl = TokenStream::new();
476+
fmt_inner_impl.extend(quote! {
478477
f.debug_struct(#name)
479478
});
480479
for &f in cur_fields.iter() {
@@ -488,25 +487,27 @@ fn render_register_mod_debug(
488487
for suffix in de.indexes() {
489488
let f_name_n = field_accessor(&f.name.expand_dim(&suffix), config, span);
490489
let f_name_n_s = format!("{f_name_n}");
491-
r_debug_impl.extend(quote! {
490+
fmt_inner_impl.extend(quote! {
492491
.field(#f_name_n_s, &self.#f_name_n())
493492
});
494493
}
495494
} else {
496495
let f_name = f.name.remove_dim();
497496
let f_name = field_accessor(&f_name, config, span);
498497
let f_name_s = format!("{f_name}");
499-
r_debug_impl.extend(quote! {
498+
fmt_inner_impl.extend(quote! {
500499
.field(#f_name_s, &self.#f_name())
501500
});
502501
}
503502
}
504503
}
505-
r_debug_impl.extend(quote! {
504+
fmt_inner_impl.extend(quote! {
506505
.finish()
507-
#close
508-
#close
509506
});
507+
let fmt_inner_group = Group::new(Delimiter::Brace, fmt_inner_impl);
508+
fmt_outer_impl.extend(quote! { #fmt_inner_group });
509+
let fmt_outer_group = Group::new(Delimiter::Brace, fmt_outer_impl);
510+
r_debug_impl.extend(quote! { #fmt_outer_group });
510511
} else if !access.can_read() || register.read_action.is_some() {
511512
r_debug_impl.extend(quote! {
512513
#debug_feature

0 commit comments

Comments
 (0)