diff --git a/perlmod-macro/src/attribs.rs b/perlmod-macro/src/attribs.rs index 71d61b5..03fb541 100644 --- a/perlmod-macro/src/attribs.rs +++ b/perlmod-macro/src/attribs.rs @@ -50,6 +50,20 @@ impl TryFrom for ModuleAttrs { } } +impl ModuleAttrs { + pub fn mangle_package_name(&self) -> String { + let mut out = String::with_capacity(self.package_name.len()); + for ch in self.package_name.chars() { + if ch.is_ascii_alphabetic() || ch.is_ascii_digit() { + out.push(ch); + } else { + out.push('_'); + } + } + out + } +} + pub struct FunctionAttrs { pub xs_name: Option, } diff --git a/perlmod-macro/src/function.rs b/perlmod-macro/src/function.rs index 923933f..899a48c 100644 --- a/perlmod-macro/src/function.rs +++ b/perlmod-macro/src/function.rs @@ -12,7 +12,11 @@ pub struct XSub { pub tokens: TokenStream, } -pub fn handle_function(attr: FunctionAttrs, func: syn::ItemFn) -> Result { +pub fn handle_function( + attr: FunctionAttrs, + func: syn::ItemFn, + mangled_package_name: Option<&str>, +) -> Result { //let vis = core::mem::replace(&mut func.vis, syn::Visibility::Inherited); //if let syn::Visibility::Public(_) = vis { // // ok @@ -32,7 +36,10 @@ pub fn handle_function(attr: FunctionAttrs, func: syn::ItemFn) -> Result Ident::new(&format!("xs_{}", name), name.span()), + Some(prefix) => Ident::new(&format!("xs_{}_{}", prefix, name), name.span()), + }); let impl_xs_name = Ident::new(&format!("impl_xs_{}", name), name.span()); let mut extract_arguments = TokenStream::new(); diff --git a/perlmod-macro/src/lib.rs b/perlmod-macro/src/lib.rs index c40adde..64ec05b 100644 --- a/perlmod-macro/src/lib.rs +++ b/perlmod-macro/src/lib.rs @@ -158,7 +158,7 @@ fn export_impl(attr: AttributeArgs, item: TokenStream) -> Result Result { let mut package = Package::with_attrs(attr)?; + let mangled_package_name = package.mangle_package_name(); if let Some((_brace, ref mut items)) = module.content { for item in items.iter_mut() { @@ -42,7 +43,11 @@ pub fn handle_module(attr: AttributeArgs, mut module: syn::ItemMod) -> Result String { + self.attrs.mangle_package_name() + } } mod kw { diff --git a/perlmod-test/src/lib.rs b/perlmod-test/src/lib.rs index 1d323f6..637c209 100644 --- a/perlmod-test/src/lib.rs +++ b/perlmod-test/src/lib.rs @@ -1,4 +1,3 @@ -#[cfg(feature = "rust142")] /// The fhe following requires rust 1.42 to work, as custom attributes on inline modules has only /// been stabilized then. mod pkg142; diff --git a/perlmod-test/src/pkg142.rs b/perlmod-test/src/pkg142.rs index 770ef93..b45e0cf 100644 --- a/perlmod-test/src/pkg142.rs +++ b/perlmod-test/src/pkg142.rs @@ -1,9 +1,9 @@ -#[perlmod::package(name = "RSPM::Foo", lib = "perlmod_test")] +#[perlmod::package(name = "RSPM::Foo142", lib = "perlmod_test")] mod export { use anyhow::{bail, Error}; #[export] - fn foo(a: u32, b: u32) -> Result { + fn foo142(a: u32, b: u32) -> Result { if a == 42 { bail!("dying on magic number"); }