From e49613071135f464e511acd3a8aff96a5958ba54 Mon Sep 17 00:00:00 2001 From: Andrey Zgarbul Date: Tue, 7 Jan 2020 14:30:11 +0300 Subject: [PATCH] replace_suffix --- src/generate/peripheral.rs | 71 +++++++++----------------------------- src/generate/register.rs | 9 ++--- src/util.rs | 57 +++++++++++++++--------------- 3 files changed, 47 insertions(+), 90 deletions(-) diff --git a/src/generate/peripheral.rs b/src/generate/peripheral.rs index 73398556..bd41cccf 100644 --- a/src/generate/peripheral.rs +++ b/src/generate/peripheral.rs @@ -179,15 +179,9 @@ pub fn render( pub mod #name_sc #open }); - for item in mod_items { - out.extend(quote! { - #item - }); - } + out.extend(mod_items); - out.extend(quote! { - #close - }); + close.to_tokens(&mut out); Ok(out) } @@ -730,12 +724,13 @@ fn cluster_block( util::escape_brackets(util::respace(c.description.as_ref().unwrap_or(&c.name)).as_ref()); // Generate the register block. - let mod_name = match c { - Cluster::Single(info) => &info.name, - Cluster::Array(info, _ai) => &info.name, - } - .replace("[%s]", "") - .replace("%s", ""); + let mod_name = util::replace_suffix( + match c { + Cluster::Single(info) => &info.name, + Cluster::Array(info, _ai) => &info.name, + }, + "", + ); let name_sc = Ident::new(&mod_name.to_sanitized_snake_case(), Span::call_site()); let defaults = c.default_register_properties.derive_from(defaults); @@ -794,8 +789,6 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec out.push(convert_svd_register(register, name)), Register::Array(info, array_info) => { - let has_brackets = info.name.contains("[%s]"); - let indices = array_info .dim_index .as_ref() @@ -808,18 +801,10 @@ fn expand_svd_register(register: &Register, name: Option<&str>) -> Vec) -> syn::Field { syn::Type::Path(parse_str::(&name_to_ty(&info.name, name)).unwrap()), ), Register::Array(info, array_info) => { - let has_brackets = info.name.contains("[%s]"); - - let nb_name = if has_brackets { - info.name.replace("[%s]", "") - } else { - info.name.replace("%s", "") - }; + let nb_name = util::replace_suffix(&info.name, ""); let ty = syn::Type::Array( parse_str::(&format!( @@ -883,8 +862,6 @@ fn expand_svd_cluster(cluster: &Cluster) -> Vec { match &cluster { Cluster::Single(_info) => out.push(convert_svd_cluster(cluster)), Cluster::Array(info, array_info) => { - let has_brackets = info.name.contains("[%s]"); - let indices = array_info .dim_index .as_ref() @@ -897,18 +874,10 @@ fn expand_svd_cluster(cluster: &Cluster) -> Vec { ) }); - for (idx, _i) in indices.iter().zip(0..) { - let name = if has_brackets { - info.name.replace("[%s]", idx) - } else { - info.name.replace("%s", idx) - }; + let ty_name = util::replace_suffix(&info.name, ""); - let ty_name = if has_brackets { - info.name.replace("[%s]", "") - } else { - info.name.replace("%s", "") - }; + for (idx, _i) in indices.iter().zip(0..) { + let name = util::replace_suffix(&info.name, idx); let ty = name_to_ty(&ty_name); @@ -929,13 +898,7 @@ fn convert_svd_cluster(cluster: &Cluster) -> syn::Field { ), ), Cluster::Array(info, array_info) => { - let has_brackets = info.name.contains("[%s]"); - - let name = if has_brackets { - info.name.replace("[%s]", "") - } else { - info.name.replace("%s", "") - }; + let name = util::replace_suffix(&info.name, ""); let ty = syn::Type::Array( parse_str::(&format!( diff --git a/src/generate/register.rs b/src/generate/register.rs index dbb96cd3..3455718b 100644 --- a/src/generate/register.rs +++ b/src/generate/register.rs @@ -1,3 +1,4 @@ +use crate::quote::ToTokens; use crate::svd::{ Access, BitRange, EnumeratedValues, Field, Peripheral, Register, RegisterCluster, RegisterProperties, Usage, WriteConstraint, @@ -122,9 +123,7 @@ pub fn render( mod_items.extend(r_impl_items); - mod_items.extend(quote! { - #close - }); + close.to_tokens(&mut mod_items); } if can_write { @@ -134,9 +133,7 @@ pub fn render( mod_items.extend(w_impl_items); - mod_items.extend(quote! { - #close - }); + close.to_tokens(&mut mod_items); } let mut out = TokenStream::new(); diff --git a/src/util.rs b/src/util.rs index 6bf5a64a..6d5d0908 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,6 +1,6 @@ use std::borrow::Cow; -use crate::quote::{ToTokens, TokenStreamExt}; +use crate::quote::ToTokens; use crate::svd::{Access, Cluster, Register, RegisterCluster}; use inflections::Inflect; use proc_macro2::{Ident, Literal, Span, TokenStream}; @@ -185,13 +185,15 @@ pub fn escape_brackets(s: &str) -> String { pub fn name_of(register: &Register) -> Cow { match register { Register::Single(info) => Cow::from(&info.name), - Register::Array(info, _) => { - if info.name.contains("[%s]") { - info.name.replace("[%s]", "").into() - } else { - info.name.replace("%s", "").into() - } - } + Register::Array(info, _) => replace_suffix(&info.name, "").into(), + } +} + +pub fn replace_suffix(name: &str, suffix: &str) -> String { + if name.contains("[%s]") { + name.replace("[%s]", suffix) + } else { + name.replace("%s", suffix) } } @@ -250,19 +252,12 @@ pub fn hex(n: u64) -> TokenStream { /// Turns `n` into an unsuffixed token pub fn unsuffixed(n: u64) -> TokenStream { - let mut t = TokenStream::new(); - t.append(Literal::u64_unsuffixed(n)); - t + Literal::u64_unsuffixed(n).into_token_stream() } pub fn unsuffixed_or_bool(n: u64, width: u32) -> TokenStream { if width == 1 { - let mut t = TokenStream::new(); - t.append(Ident::new( - if n == 0 { "false" } else { "true" }, - Span::call_site(), - )); - t + Ident::new(if n == 0 { "false" } else { "true" }, Span::call_site()).into_token_stream() } else { unsuffixed(n) } @@ -275,19 +270,21 @@ pub trait U32Ext { impl U32Ext for u32 { fn to_ty(&self) -> Result { - let span = Span::call_site(); - Ok(match *self { - 1 => Ident::new("bool", span), - 2..=8 => Ident::new("u8", span), - 9..=16 => Ident::new("u16", span), - 17..=32 => Ident::new("u32", span), - 33..=64 => Ident::new("u64", span), - _ => { - return Err( - format!("can't convert {} bits into a Rust integral type", *self).into(), - ) - } - }) + Ok(Ident::new( + match *self { + 1 => "bool", + 2..=8 => "u8", + 9..=16 => "u16", + 17..=32 => "u32", + 33..=64 => "u64", + _ => { + return Err( + format!("can't convert {} bits into a Rust integral type", *self).into(), + ) + } + }, + Span::call_site(), + )) } fn to_ty_width(&self) -> Result {