Skip to content

Commit 6c80e32

Browse files
committed
bugfix(macro): identifier-related bugs #536
1 parent 6b192e8 commit 6c80e32

File tree

9 files changed

+277
-38
lines changed

9 files changed

+277
-38
lines changed

crates/macros/src/class.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use quote::{TokenStreamExt, quote};
55
use syn::{Attribute, Expr, Fields, ItemStruct};
66

77
use crate::helpers::get_docs;
8-
use crate::parsing::{PhpRename, RenameRule};
8+
use crate::parsing::{PhpNameContext, PhpRename, RenameRule, ident_to_php_name, validate_php_name};
99
use crate::prelude::*;
1010

1111
#[derive(FromAttributes, Debug, Default)]
@@ -44,7 +44,8 @@ impl ToTokens for ClassEntryAttribute {
4444
pub fn parser(mut input: ItemStruct) -> Result<TokenStream> {
4545
let attr = StructAttributes::from_attributes(&input.attrs)?;
4646
let ident = &input.ident;
47-
let name = attr.rename.rename(ident.to_string(), RenameRule::Pascal);
47+
let name = attr.rename.rename(ident_to_php_name(ident), RenameRule::Pascal);
48+
validate_php_name(&name, PhpNameContext::Class);
4849
let docs = get_docs(&attr.attrs)?;
4950
input.attrs.retain(|attr| !attr.path().is_ident("php"));
5051

@@ -110,9 +111,12 @@ struct Property<'a> {
110111

111112
impl Property<'_> {
112113
pub fn name(&self) -> String {
113-
self.attr
114+
let name = self
115+
.attr
114116
.rename
115-
.rename(self.ident.to_string(), RenameRule::Camel)
117+
.rename(ident_to_php_name(self.ident), RenameRule::Camel);
118+
validate_php_name(&name, PhpNameContext::Property);
119+
name
116120
}
117121
}
118122

crates/macros/src/constant.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use quote::{format_ident, quote};
44
use syn::ItemConst;
55

66
use crate::helpers::get_docs;
7-
use crate::parsing::{PhpRename, RenameRule};
7+
use crate::parsing::{PhpNameContext, PhpRename, RenameRule, ident_to_php_name, validate_php_name};
88
use crate::prelude::*;
99

1010
const INTERNAL_CONST_DOC_PREFIX: &str = "_internal_const_docs_";
@@ -25,7 +25,8 @@ pub fn parser(mut item: ItemConst) -> Result<TokenStream> {
2525

2626
let name = attr
2727
.rename
28-
.rename(item.ident.to_string(), RenameRule::ScreamingSnake);
28+
.rename(ident_to_php_name(&item.ident), RenameRule::ScreamingSnake);
29+
validate_php_name(&name, PhpNameContext::Constant);
2930
let name_ident = format_ident!("{INTERNAL_CONST_NAME_PREFIX}{}", item.ident);
3031

3132
let docs = get_docs(&attr.attrs)?;

crates/macros/src/enum_.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use syn::{Fields, Ident, ItemEnum, Lit};
88

99
use crate::{
1010
helpers::get_docs,
11-
parsing::{PhpRename, RenameRule, Visibility},
11+
parsing::{PhpNameContext, PhpRename, RenameRule, Visibility, ident_to_php_name, validate_php_name},
1212
prelude::*,
1313
};
1414

@@ -84,7 +84,7 @@ pub fn parser(mut input: ItemEnum) -> Result<TokenStream> {
8484
cases.push(EnumCase {
8585
ident: variant.ident.clone(),
8686
name: variant_attr.rename.rename(
87-
variant.ident.to_string(),
87+
ident_to_php_name(&variant.ident),
8888
php_attr.rename_cases.unwrap_or(RenameRule::Pascal),
8989
),
9090
attrs: variant_attr,
@@ -137,7 +137,8 @@ impl<'a> Enum<'a> {
137137
flags: Option<String>,
138138
discriminant_type: DiscriminantType,
139139
) -> Self {
140-
let name = attrs.rename.rename(ident.to_string(), RenameRule::Pascal);
140+
let name = attrs.rename.rename(ident_to_php_name(ident), RenameRule::Pascal);
141+
validate_php_name(&name, PhpNameContext::Enum);
141142

142143
Self {
143144
ident,

crates/macros/src/extern_.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use syn::{
55
spanned::Spanned as _, token::Unsafe,
66
};
77

8+
use crate::parsing::ident_to_php_name;
89
use crate::prelude::*;
910

1011
pub fn parser(input: ItemForeignMod) -> Result<TokenStream> {
@@ -27,7 +28,7 @@ fn parse_function(mut func: ForeignItemFn) -> Result<TokenStream> {
2728

2829
let Signature { ident, .. } = &sig;
2930

30-
let name = ident.to_string();
31+
let name = ident_to_php_name(ident);
3132
let params = sig
3233
.inputs
3334
.iter()

crates/macros/src/function.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use syn::spanned::Spanned as _;
77
use syn::{Expr, FnArg, GenericArgument, ItemFn, PatType, PathArguments, Type, TypePath};
88

99
use crate::helpers::get_docs;
10-
use crate::parsing::{PhpRename, RenameRule, Visibility};
10+
use crate::parsing::{PhpNameContext, PhpRename, RenameRule, Visibility, ident_to_php_name, validate_php_name};
1111
use crate::prelude::*;
1212
use crate::syn_ext::DropLifetimes;
1313

@@ -44,15 +44,11 @@ pub fn parser(mut input: ItemFn) -> Result<TokenStream> {
4444

4545
let docs = get_docs(&php_attr.attrs)?;
4646

47-
let func = Function::new(
48-
&input.sig,
49-
php_attr
50-
.rename
51-
.rename(input.sig.ident.to_string(), RenameRule::Snake),
52-
args,
53-
php_attr.optional,
54-
docs,
55-
);
47+
let func_name = php_attr
48+
.rename
49+
.rename(ident_to_php_name(&input.sig.ident), RenameRule::Snake);
50+
validate_php_name(&func_name, PhpNameContext::Function);
51+
let func = Function::new(&input.sig, func_name, args, php_attr.optional, docs);
5652
let function_impl = func.php_function_impl();
5753

5854
Ok(quote! {
@@ -625,7 +621,7 @@ impl TypedArg<'_> {
625621
/// Returns a token stream containing the `Arg` definition to be passed to
626622
/// `ext-php-rs`.
627623
fn arg_builder(&self) -> TokenStream {
628-
let name = self.name.to_string();
624+
let name = ident_to_php_name(self.name);
629625
let ty = self.clean_ty();
630626
let null = if self.nullable {
631627
Some(quote! { .allow_null() })

crates/macros/src/impl_.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use syn::{Expr, Ident, ItemImpl};
88
use crate::constant::PhpConstAttribute;
99
use crate::function::{Args, CallType, Function, MethodReceiver};
1010
use crate::helpers::get_docs;
11-
use crate::parsing::{PhpRename, RenameRule, Visibility};
11+
use crate::parsing::{PhpNameContext, PhpRename, RenameRule, Visibility, ident_to_php_name, validate_php_name};
1212
use crate::prelude::*;
1313

1414
/// Method types.
@@ -187,7 +187,8 @@ impl<'a> ParsedImpl<'a> {
187187
let attr = PhpConstAttribute::from_attributes(&c.attrs)?;
188188
let name = attr
189189
.rename
190-
.rename(c.ident.to_string(), self.change_constant_case);
190+
.rename(ident_to_php_name(&c.ident), self.change_constant_case);
191+
validate_php_name(&name, PhpNameContext::Constant);
191192
let docs = get_docs(&attr.attrs)?;
192193
c.attrs.retain(|attr| !attr.path().is_ident("php"));
193194

@@ -201,7 +202,8 @@ impl<'a> ParsedImpl<'a> {
201202
let attr = PhpFunctionImplAttribute::from_attributes(&method.attrs)?;
202203
let name = attr
203204
.rename
204-
.rename_method(method.sig.ident.to_string(), self.change_method_case);
205+
.rename_method(ident_to_php_name(&method.sig.ident), self.change_method_case);
206+
validate_php_name(&name, PhpNameContext::Method);
205207
let docs = get_docs(&attr.attrs)?;
206208
method.attrs.retain(|attr| !attr.path().is_ident("php"));
207209

crates/macros/src/interface.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use quote::{ToTokens, format_ident, quote};
1111
use syn::{Expr, Ident, ItemTrait, Path, TraitItem, TraitItemConst, TraitItemFn};
1212

1313
use crate::impl_::{FnBuilder, MethodModifier};
14-
use crate::parsing::{PhpRename, RenameRule, Visibility};
14+
use crate::parsing::{PhpNameContext, PhpRename, RenameRule, Visibility, ident_to_php_name, validate_php_name};
1515
use crate::prelude::*;
1616

1717
const INTERNAL_INTERFACE_NAME_PREFIX: &str = "PhpInterface";
@@ -196,7 +196,8 @@ impl<'a> Parse<'a, InterfaceData<'a>> for ItemTrait {
196196
fn parse(&'a mut self) -> Result<InterfaceData<'a>> {
197197
let attrs = TraitAttributes::from_attributes(&self.attrs)?;
198198
let ident = &self.ident;
199-
let name = attrs.rename.rename(ident.to_string(), RenameRule::Pascal);
199+
let name = attrs.rename.rename(ident_to_php_name(ident), RenameRule::Pascal);
200+
validate_php_name(&name, PhpNameContext::Interface);
200201
let docs = get_docs(&attrs.attrs)?;
201202
self.attrs.clean_php();
202203
let interface_name = format_ident!("{INTERNAL_INTERFACE_NAME_PREFIX}{ident}");
@@ -277,16 +278,12 @@ fn parse_trait_item_fn(
277278
modifiers.insert(MethodModifier::Static);
278279
}
279280

280-
let f = Function::new(
281-
&fn_item.sig,
282-
php_attr.rename.rename(
283-
fn_item.sig.ident.to_string(),
284-
change_case.unwrap_or(RenameRule::Camel),
285-
),
286-
args,
287-
php_attr.optional,
288-
docs,
281+
let method_name = php_attr.rename.rename(
282+
ident_to_php_name(&fn_item.sig.ident),
283+
change_case.unwrap_or(RenameRule::Camel),
289284
);
285+
validate_php_name(&method_name, PhpNameContext::Method);
286+
let f = Function::new(&fn_item.sig, method_name, args, php_attr.optional, docs);
290287

291288
if php_attr.constructor.is_present() {
292289
Ok(MethodKind::Constructor(f))
@@ -336,9 +333,10 @@ fn parse_trait_item_const(
336333

337334
let attr = PhpConstAttribute::from_attributes(&const_item.attrs)?;
338335
let name = attr.rename.rename(
339-
const_item.ident.to_string(),
336+
ident_to_php_name(&const_item.ident),
340337
change_case.unwrap_or(RenameRule::ScreamingSnake),
341338
);
339+
validate_php_name(&name, PhpNameContext::Constant);
342340
let docs = get_docs(&attr.attrs)?;
343341
const_item.attrs.clean_php();
344342

0 commit comments

Comments
 (0)