Escape bracket in generated docs

This commit is contained in:
Wataru Otsubo 2025-07-31 20:41:04 +09:00
parent a0a1c8c9a3
commit ef1b10a21d
5 changed files with 55 additions and 8 deletions

View file

@ -21,6 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Use `u8` and `u16` for `T` of registers when the mask is 0xff or 0xffff, instead of defining new tuple struct.
- Use `Mmapped` instead of `RegisterSpec` !21
- Remove empty doc generation !23
- Added escape to brackets of form `[numbers]` in docs. (e.g., `a[1]` to `a\[1\]`, `b[1:2]` to `b\[1:2\]`) !24
## [0.3.1] - 2025-04-11

6
Cargo.lock generated
View file

@ -385,9 +385,11 @@ dependencies = [
"hex",
"itertools",
"log",
"once_cell",
"prettyplease",
"proc-macro2",
"quote",
"regex",
"roxmltree",
"sha2",
"syn",
@ -565,9 +567,9 @@ dependencies = [
[[package]]
name = "once_cell"
version = "1.20.2"
version = "1.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
[[package]]
name = "powerfmt"

View file

@ -26,9 +26,11 @@ heck = "0.5"
hex = "0.4"
itertools = "0.14"
log = "0.4"
once_cell = "1.21.3"
prettyplease = "0.2"
proc-macro2 = "1.0"
quote = "1.0"
regex = "1.11.1"
roxmltree = "0.20"
sha2 = "0.10"
syn = "2.0"

View file

@ -41,6 +41,9 @@ pub enum CodeGenError {
}
mod util {
use once_cell::sync::Lazy;
use regex::Regex;
use crate::types::DataType;
use super::CodeGenError;
@ -115,9 +118,17 @@ mod util {
}
}
static RE_BRACKET_WITH_NUM: Lazy<Regex> =
Lazy::new(|| Regex::new(r"\[(?<inner>[\d:]+)\]").unwrap());
pub(super) fn escape_brackets_with_numbers(s: &str) -> String {
RE_BRACKET_WITH_NUM
.replace_all(s, "\\[$inner\\]")
.into_owned()
}
#[cfg(test)]
mod test {
use super::RustUxTypes;
use super::{RustUxTypes, escape_brackets_with_numbers};
#[test]
fn rustuxtypes_from_mask() {
@ -148,6 +159,23 @@ mod util {
proc_macro2::Ident::new("u8", proc_macro2::Span::call_site())
)
}
#[test]
fn test_regex() {
assert_eq!(escape_brackets_with_numbers("abc"), "abc".to_string());
assert_eq!(
escape_brackets_with_numbers("abc[1]"),
r"abc\[1\]".to_string()
);
assert_eq!(
escape_brackets_with_numbers("abc[12:34]"),
r"abc\[12:34\]".to_string()
);
assert_eq!(
escape_brackets_with_numbers("abc[12:34], def[1]"),
r"abc\[12:34\], def\[1\]".to_string()
);
}
}
}
@ -312,7 +340,10 @@ impl CodeGen for Block {
let desc = match self.desc {
None => quote! {},
Some(ref s) if s.is_empty() => quote! {},
Some(ref desc) => quote! { #![doc = #desc] },
Some(ref desc) => {
let desc = util::escape_brackets_with_numbers(desc);
quote! { #![doc = #desc] }
}
};
let accessors_methods = self.elements.iter().map(|e| {
@ -474,7 +505,10 @@ impl CodeGen for Register {
let doc = match self.desc {
None => quote! {},
Some(ref s) if s.is_empty() => quote! {},
Some(ref desc) => quote! { #![doc = #desc] },
Some(ref desc) => {
let desc = util::escape_brackets_with_numbers(desc);
quote! { #![doc = #desc] }
}
};
let out = quote! {

View file

@ -190,6 +190,11 @@ fn generate_field(
true => FieldType::RustType(util::RustUxTypes::from_mask(field.mask)),
false => FieldType::CustomValue(&field.elements),
};
let desc = match field.desc.clone() {
None => "".to_string(),
Some(s) if s.is_empty() => s,
Some(desc) => util::escape_brackets_with_numbers(&desc),
};
let (code_mask, code_getter, code_setter) = match &field.multiple {
Some(multiple_params) => generate_multiple_field(
@ -199,7 +204,7 @@ fn generate_field(
field_type,
snake_case_name,
multiple_params,
&field.desc.clone().unwrap_or("".to_string()),
&desc,
),
None => generate_single_field(
mask_name,
@ -207,7 +212,7 @@ fn generate_field(
field.mask,
field_type,
snake_case_name,
&field.desc.clone().unwrap_or("".to_string()),
&desc,
),
};
@ -352,7 +357,10 @@ fn generate_custom_values_const_enumdef(
let doc = match value.desc {
None => quote! {},
Some(ref s) if s.is_empty() => quote! {},
Some(ref desc) => quote! { #[doc = #desc] },
Some(ref desc) => {
let desc = util::escape_brackets_with_numbers(desc);
quote! { #![doc = #desc] }
}
};
let variant_name = util::parse_to_ident(&value.name.to_upper_camel_case()).unwrap();
quote! {