feat: Added option to rename struct in Lua
This commit is contained in:
@@ -340,7 +340,7 @@ fn parse_fields(
|
||||
Ok(fields)
|
||||
}
|
||||
|
||||
#[proc_macro_derive(Typed, attributes(serde))]
|
||||
#[proc_macro_derive(Typed, attributes(serde, typed))]
|
||||
pub fn typed(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
||||
let ast = parse_macro_input!(input as DeriveInput);
|
||||
|
||||
@@ -352,6 +352,7 @@ pub fn typed(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
||||
|
||||
fn typed_inner(ast: DeriveInput) -> syn::Result<TokenStream2> {
|
||||
let name = ast.ident;
|
||||
let mut as_name = LitStr::new(&name.to_string(), name.span());
|
||||
|
||||
let mut case = None;
|
||||
let mut tag = None;
|
||||
@@ -388,11 +389,33 @@ fn typed_inner(ast: DeriveInput) -> syn::Result<TokenStream2> {
|
||||
{
|
||||
return Err(err);
|
||||
}
|
||||
|
||||
if attr.path().is_ident("typed")
|
||||
&& let Err(err) = attr.parse_nested_meta(|meta| {
|
||||
if meta.path.is_ident("as") {
|
||||
let value = meta.value()?;
|
||||
as_name = value.parse()?;
|
||||
|
||||
Ok(())
|
||||
} else {
|
||||
Err(syn::Error::new(meta.path.span(), "Unknown attribute"))
|
||||
}
|
||||
})
|
||||
{
|
||||
return Err(err);
|
||||
}
|
||||
}
|
||||
|
||||
if as_name.value().is_empty() {
|
||||
return Err(syn::Error::new(
|
||||
as_name.span(),
|
||||
"Name is not allowed to be empty",
|
||||
));
|
||||
}
|
||||
|
||||
let type_name_fn = quote! {
|
||||
fn type_name() -> ::std::string::String {
|
||||
stringify!(#name).to_string()
|
||||
#as_name.to_string()
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
23
tests/rename.rs
Normal file
23
tests/rename.rs
Normal file
@@ -0,0 +1,23 @@
|
||||
use lua_typed::Typed;
|
||||
|
||||
#[derive(Typed)]
|
||||
#[typed(as = "Lua")]
|
||||
struct Rust;
|
||||
|
||||
#[derive(Typed)]
|
||||
struct Other {
|
||||
pub rust: Rust,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rename() {
|
||||
insta::assert_snapshot!(<Rust as Typed>::generate_full().unwrap(), @"---@class Lua");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn rename_nested() {
|
||||
insta::assert_snapshot!(<Other as Typed>::generate_full().unwrap(), @r"
|
||||
---@class Other
|
||||
---@field rust Lua
|
||||
");
|
||||
}
|
||||
7
tests/ui/empty_rename.rs
Normal file
7
tests/ui/empty_rename.rs
Normal file
@@ -0,0 +1,7 @@
|
||||
use lua_typed::Typed;
|
||||
|
||||
#[derive(Typed)]
|
||||
#[typed(as = "")]
|
||||
struct A;
|
||||
|
||||
fn main() {}
|
||||
5
tests/ui/empty_rename.stderr
Normal file
5
tests/ui/empty_rename.stderr
Normal file
@@ -0,0 +1,5 @@
|
||||
error: Name is not allowed to be empty
|
||||
--> tests/ui/empty_rename.rs:4:14
|
||||
|
|
||||
4 | #[typed(as = "")]
|
||||
| ^^
|
||||
7
tests/ui/unknown_attribute.rs
Normal file
7
tests/ui/unknown_attribute.rs
Normal file
@@ -0,0 +1,7 @@
|
||||
use lua_typed::Typed;
|
||||
|
||||
#[derive(Typed)]
|
||||
#[typed(cool)]
|
||||
struct A;
|
||||
|
||||
fn main() {}
|
||||
5
tests/ui/unknown_attribute.stderr
Normal file
5
tests/ui/unknown_attribute.stderr
Normal file
@@ -0,0 +1,5 @@
|
||||
error: Unknown attribute
|
||||
--> tests/ui/unknown_attribute.rs:4:9
|
||||
|
|
||||
4 | #[typed(cool)]
|
||||
| ^^^^
|
||||
Reference in New Issue
Block a user