From 3c302ba09cde53d3d7d6620b7e60e317bbc41b97 Mon Sep 17 00:00:00 2001 From: Andrey Zgarbul Date: Fri, 25 Oct 2024 17:38:41 +0300 Subject: [PATCH 1/4] disable respace --- CHANGELOG.md | 1 + src/util.rs | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e921e919..f2c1f25f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/). - Added `#![cfg_attr(docsrs, feature(doc_auto_cfg))]` to the generated library code. This adds a display of the feature gates in the documentation of the generated library - Split on the start of attribute instead of the end +- Disable whitespace merging in `respace` ## [v0.35.0] - 2024-11-12 diff --git a/src/util.rs b/src/util.rs index 40a1e526..6986231b 100644 --- a/src/util.rs +++ b/src/util.rs @@ -148,10 +148,7 @@ pub fn sanitize_keyword(sc: Cow) -> Cow { } pub fn respace(s: &str) -> String { - s.split_whitespace() - .collect::>() - .join(" ") - .replace(r"\n", "\n") + s.replace(r"\n", "\n") } pub fn escape_brackets(s: &str) -> String { From adfef13c832e77c67a35abcb3b6a546bbb48365b Mon Sep 17 00:00:00 2001 From: Andrey Zgarbul Date: Sun, 9 Mar 2025 12:23:11 +0300 Subject: [PATCH 2/4] remove spaces after \n\n, use Cow --- src/generate/interrupt.rs | 4 +-- src/generate/peripheral.rs | 51 ++++++++++++++++++++++---------------- src/generate/register.rs | 29 ++++++++++++---------- src/generate/riscv.rs | 4 +-- src/util.rs | 14 +++++++++-- 5 files changed, 62 insertions(+), 40 deletions(-) diff --git a/src/generate/interrupt.rs b/src/generate/interrupt.rs index 498bdece..982535a3 100644 --- a/src/generate/interrupt.rs +++ b/src/generate/interrupt.rs @@ -63,9 +63,9 @@ pub fn render( .0 .description .as_deref() - .map(util::respace) - .as_deref() .map(util::escape_special_chars) + .as_deref() + .map(util::respace) .unwrap_or_else(|| interrupt.0.name.as_str().into()) ); diff --git a/src/generate/peripheral.rs b/src/generate/peripheral.rs index f5de3902..6c652235 100644 --- a/src/generate/peripheral.rs +++ b/src/generate/peripheral.rs @@ -42,8 +42,9 @@ pub fn render(p_original: &Peripheral, index: &Index, config: &Config) -> Result let p_ty = ident(&name, config, "peripheral", span); let name_str = p_ty.to_string(); let address = util::hex(p.base_address + config.base_address_shift); - let doc = util::respace(p.description.as_ref().unwrap_or(&name)); - let doc = util::escape_special_chars(&doc); + let doc = util::escape_special_chars(p.description.as_ref().unwrap_or(&name)); + let doc = util::respace(&doc); + let doc = quote! { #[doc = #doc] }; let mod_ty = ident(&name, config, "peripheral_mod", span); let (derive_regs, base, path) = if let Some(path) = path { @@ -65,17 +66,17 @@ pub fn render(p_original: &Peripheral, index: &Index, config: &Config) -> Result let phtml = config.settings.html_url.as_ref().map(|url| { let doc = format!("See peripheral [structure]({url}#{})", &path.peripheral); - quote!(#[doc = ""] #[doc = #doc]) + quote!(#[doc = ""] #doc) }); let per_to_tokens = |out: &mut TokenStream, feature_attribute: &TokenStream, - doc: &str, + doc: &TokenStream, p_ty: &Ident, doc_alias: Option, address: LitInt| { out.extend(quote! { - #[doc = #doc] + #doc #phtml #doc_alias #feature_attribute @@ -95,8 +96,9 @@ pub fn render(p_original: &Peripheral, index: &Index, config: &Config) -> Result let mut feature_names = Vec::with_capacity(dim.dim as _); for pi in svd::peripheral::expand(p, dim) { let name = &pi.name; - let doc = util::respace(pi.description.as_ref().unwrap_or(&pi.name)); - let doc = util::escape_special_chars(&doc); + let doc = util::escape_special_chars(pi.description.as_ref().unwrap_or(&pi.name)); + let doc = util::respace(&doc); + let doc = quote! { #[doc = #doc] }; let p_ty = ident(name, config, "peripheral", span); let name_str = p_ty.to_string(); let doc_alias = (&name_str != name).then(|| quote!(#[doc(alias = #name)])); @@ -125,7 +127,7 @@ pub fn render(p_original: &Peripheral, index: &Index, config: &Config) -> Result if derive_regs { // re-export the base module to allow deriveFrom this one out.extend(quote! { - #[doc = #doc] + #doc #feature_any_attribute pub use self::#base as #mod_ty; }); @@ -145,7 +147,7 @@ pub fn render(p_original: &Peripheral, index: &Index, config: &Config) -> Result if derive_regs { // re-export the base module to allow deriveFrom this one out.extend(quote! { - #[doc = #doc] + #doc #feature_attribute pub use self::#base as #mod_ty; }); @@ -188,11 +190,17 @@ pub fn render(p_original: &Peripheral, index: &Index, config: &Config) -> Result "Pushing {} register or cluster blocks into output", ercs.len() ); - let reg_block = - register_or_cluster_block(&ercs, &derive_infos, None, "Register block", None, config)?; + let reg_block = register_or_cluster_block( + &ercs, + &derive_infos, + None, + "e! { #[doc = "Register block"] }, + None, + config, + )?; out.extend(quote! { - #[doc = #doc] + #doc #feature_attribute pub mod #mod_ty }); @@ -457,8 +465,8 @@ impl FieldRegions { } fn make_comment(size: u32, offset: u32, description: &str) -> String { - let desc = util::respace(description); - let desc = util::escape_special_chars(&desc); + let desc = util::escape_special_chars(description); + let desc = util::respace(&desc); if size > 32 { let end = offset + size / 8; format!("0x{offset:02x}..0x{end:02x} - {desc}") @@ -471,7 +479,7 @@ fn register_or_cluster_block( ercs: &[RegisterCluster], derive_infos: &[DeriveInfo], name: Option<&str>, - doc: &str, + doc: &TokenStream, size: Option, config: &Config, ) -> Result { @@ -598,7 +606,7 @@ fn register_or_cluster_block( Ok(quote! { #[repr(C)] #derive_debug - #[doc = #doc] + #doc #doc_alias pub struct #block_ty { #rbfs @@ -1328,8 +1336,9 @@ fn cluster_block( config: &Config, ) -> Result { let doc = c.description.as_ref().unwrap_or(&c.name); - let doc = util::respace(doc); - let doc = util::escape_special_chars(&doc); + let doc = util::escape_special_chars(doc); + let doc = util::respace(&doc); + let doc = quote! { #[doc = #doc] }; let mod_name = c.name.remove_dim().to_string(); // name_snake_case needs to take into account array type. @@ -1356,7 +1365,7 @@ fn cluster_block( .push(path_segment(ident(&dname, config, "cluster_mod", span))); Ok(quote! { - #[doc = #doc] + #doc pub use #derived as #block_ty; pub use #mod_derived as #mod_ty; }) @@ -1388,11 +1397,11 @@ fn cluster_block( }; Ok(quote! { - #[doc = #doc] + #doc pub use self::#mod_ty::#block_ty; ///Cluster - #[doc = #doc] + #doc pub mod #mod_ty { #mod_items } diff --git a/src/generate/register.rs b/src/generate/register.rs index c1cdc876..3cde82b1 100644 --- a/src/generate/register.rs +++ b/src/generate/register.rs @@ -65,11 +65,12 @@ pub fn render( let reg_ty = ident(&name, config, "register", span); let doc_alias = (reg_ty.to_string().as_str() != name).then(|| quote!(#[doc(alias = #name)])); let mod_ty = ident(&name, config, "register_mod", span); - let description = util::respace(register.description.as_deref().unwrap_or_else(|| { - warn!("Missing description for register {}", register.name); - "" - })); - let description = util::escape_special_chars(&description); + let description = + util::escape_special_chars(register.description.as_deref().unwrap_or_else(|| { + warn!("Missing description for register {}", register.name); + "" + })); + let description = util::respace(&description); if let Some(dpath) = dpath.as_ref() { let mut derived = if &dpath.block == path { @@ -669,7 +670,8 @@ pub fn fields( span, ); let description_raw = f.description.as_deref().unwrap_or(""); // raw description, if absent using empty string - let description = util::respace(&util::escape_special_chars(description_raw)); + let description = util::escape_special_chars(description_raw); + let description = util::respace(&description); let can_read = can_read && (f.access != Some(Access::WriteOnly)) @@ -901,8 +903,8 @@ pub fn fields( let pc = &v.pc; let is_variant = &v.is_sc; - let doc = util::respace(&v.doc); - let doc = util::escape_special_chars(&doc); + let doc = util::escape_special_chars(&v.doc); + let doc = util::respace(&doc); enum_items.extend(quote! { #[doc = #doc] #inline @@ -915,8 +917,8 @@ pub fn fields( let pc = &v.pc; let is_variant = &v.is_sc; - let doc = util::respace(&v.doc); - let doc = util::escape_special_chars(&doc); + let doc = util::escape_special_chars(&v.doc); + let doc = util::respace(&doc); enum_items.extend(quote! { #[doc = #doc] #inline @@ -1179,8 +1181,8 @@ pub fn fields( for v in &variants { let pc = &v.pc; let sc = &v.sc; - let doc = util::respace(&v.doc); - let doc = util::escape_special_chars(&doc); + let doc = util::escape_special_chars(&v.doc); + let doc = util::respace(&doc); proxy_items.extend(quote! { #[doc = #doc] #inline @@ -1542,8 +1544,9 @@ fn add_from_variants<'a>( let mut vars = TokenStream::new(); for v in variants.map(|v| { - let desc = util::respace(&format!("{}: {}", v.value, v.doc)); + let desc = format!("{}: {}", v.value, v.doc); let desc = util::escape_special_chars(&desc); + let desc = util::respace(&desc); let pcv = &v.pc; let pcval = &unsuffixed(v.value); quote! { diff --git a/src/generate/riscv.rs b/src/generate/riscv.rs index fff9e970..5c9d8525 100644 --- a/src/generate/riscv.rs +++ b/src/generate/riscv.rs @@ -189,10 +189,10 @@ pub fn render( "{} - {}", i.value, i.description - .as_ref() - .map(|s| util::respace(s)) .as_ref() .map(|s| util::escape_special_chars(s)) + .as_ref() + .map(|s| util::respace(s)) .unwrap_or_else(|| i.name.as_str().into()) ); diff --git a/src/util.rs b/src/util.rs index 6986231b..5376695c 100644 --- a/src/util.rs +++ b/src/util.rs @@ -147,8 +147,18 @@ pub fn sanitize_keyword(sc: Cow) -> Cow { } } -pub fn respace(s: &str) -> String { - s.replace(r"\n", "\n") +pub fn respace(s: &str) -> Cow<'_, str> { + let s: Cow<_> = if s.contains(r"\n") { + s.replace(r"\n", "\n").into() + } else { + s.into() + }; + if s.contains("\n\n ") { + let ss: Vec<_> = s.split("\n\n").map(|s| s.trim_start()).collect(); + ss.join("\n\n").into() + } else { + s + } } pub fn escape_brackets(s: &str) -> String { From f7240ade07c82b146f8271917f91b23071ad346b Mon Sep 17 00:00:00 2001 From: Andrey Zgarbul Date: Sun, 9 Mar 2025 12:50:17 +0300 Subject: [PATCH 3/4] patched rp2350 --- ci/svd2rust-regress/tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/svd2rust-regress/tests.yml b/ci/svd2rust-regress/tests.yml index 73a87549..45672d6a 100644 --- a/ci/svd2rust-regress/tests.yml +++ b/ci/svd2rust-regress/tests.yml @@ -703,3 +703,4 @@ - arch: cortex-m mfgr: RaspberryPi chip: rp2350 + svd_url: https://raw.githubusercontent.com/rp-rs/rp235x-pac/refs/heads/main/svd/RP2350.svd.patched From fd02850c6cd16c0c4592c6623af56834f9711486 Mon Sep 17 00:00:00 2001 From: Andrey Zgarbul Date: Sun, 9 Mar 2025 13:46:25 +0300 Subject: [PATCH 4/4] rm newline --- src/util.rs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/util.rs b/src/util.rs index 5376695c..0539a835 100644 --- a/src/util.rs +++ b/src/util.rs @@ -148,16 +148,11 @@ pub fn sanitize_keyword(sc: Cow) -> Cow { } pub fn respace(s: &str) -> Cow<'_, str> { - let s: Cow<_> = if s.contains(r"\n") { - s.replace(r"\n", "\n").into() - } else { - s.into() - }; if s.contains("\n\n ") { let ss: Vec<_> = s.split("\n\n").map(|s| s.trim_start()).collect(); ss.join("\n\n").into() } else { - s + s.into() } }