Skip to content

Commit 9661e65

Browse files
committed
fix(macro): identifier-related bugs #536
1 parent 6b192e8 commit 9661e65

File tree

11 files changed

+355
-44
lines changed

11 files changed

+355
-44
lines changed

crates/macros/src/class.rs

Lines changed: 10 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,10 @@ 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
48+
.rename
49+
.rename(ident_to_php_name(ident), RenameRule::Pascal);
50+
validate_php_name(&name, PhpNameContext::Class);
4851
let docs = get_docs(&attr.attrs)?;
4952
input.attrs.retain(|attr| !attr.path().is_ident("php"));
5053

@@ -110,9 +113,12 @@ struct Property<'a> {
110113

111114
impl Property<'_> {
112115
pub fn name(&self) -> String {
113-
self.attr
116+
let name = self
117+
.attr
114118
.rename
115-
.rename(self.ident.to_string(), RenameRule::Camel)
119+
.rename(ident_to_php_name(self.ident), RenameRule::Camel);
120+
validate_php_name(&name, PhpNameContext::Property);
121+
name
116122
}
117123
}
118124

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: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ use syn::{Fields, Ident, ItemEnum, Lit};
88

99
use crate::{
1010
helpers::get_docs,
11-
parsing::{PhpRename, RenameRule, Visibility},
11+
parsing::{
12+
PhpNameContext, PhpRename, RenameRule, Visibility, ident_to_php_name, validate_php_name,
13+
},
1214
prelude::*,
1315
};
1416

@@ -84,7 +86,7 @@ pub fn parser(mut input: ItemEnum) -> Result<TokenStream> {
8486
cases.push(EnumCase {
8587
ident: variant.ident.clone(),
8688
name: variant_attr.rename.rename(
87-
variant.ident.to_string(),
89+
ident_to_php_name(&variant.ident),
8890
php_attr.rename_cases.unwrap_or(RenameRule::Pascal),
8991
),
9092
attrs: variant_attr,
@@ -137,7 +139,10 @@ impl<'a> Enum<'a> {
137139
flags: Option<String>,
138140
discriminant_type: DiscriminantType,
139141
) -> Self {
140-
let name = attrs.rename.rename(ident.to_string(), RenameRule::Pascal);
142+
let name = attrs
143+
.rename
144+
.rename(ident_to_php_name(ident), RenameRule::Pascal);
145+
validate_php_name(&name, PhpNameContext::Enum);
141146

142147
Self {
143148
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: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ 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::{
11+
PhpNameContext, PhpRename, RenameRule, Visibility, ident_to_php_name, validate_php_name,
12+
};
1113
use crate::prelude::*;
1214
use crate::syn_ext::DropLifetimes;
1315

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

4547
let docs = get_docs(&php_attr.attrs)?;
4648

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-
);
49+
let func_name = php_attr
50+
.rename
51+
.rename(ident_to_php_name(&input.sig.ident), RenameRule::Snake);
52+
validate_php_name(&func_name, PhpNameContext::Function);
53+
let func = Function::new(&input.sig, func_name, args, php_attr.optional, docs);
5654
let function_impl = func.php_function_impl();
5755

5856
Ok(quote! {
@@ -625,7 +623,7 @@ impl TypedArg<'_> {
625623
/// Returns a token stream containing the `Arg` definition to be passed to
626624
/// `ext-php-rs`.
627625
fn arg_builder(&self) -> TokenStream {
628-
let name = self.name.to_string();
626+
let name = ident_to_php_name(self.name);
629627
let ty = self.clean_ty();
630628
let null = if self.nullable {
631629
Some(quote! { .allow_null() })

crates/macros/src/impl_.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ 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::{
12+
PhpNameContext, PhpRename, RenameRule, Visibility, ident_to_php_name, validate_php_name,
13+
};
1214
use crate::prelude::*;
1315

1416
/// Method types.
@@ -187,7 +189,8 @@ impl<'a> ParsedImpl<'a> {
187189
let attr = PhpConstAttribute::from_attributes(&c.attrs)?;
188190
let name = attr
189191
.rename
190-
.rename(c.ident.to_string(), self.change_constant_case);
192+
.rename(ident_to_php_name(&c.ident), self.change_constant_case);
193+
validate_php_name(&name, PhpNameContext::Constant);
191194
let docs = get_docs(&attr.attrs)?;
192195
c.attrs.retain(|attr| !attr.path().is_ident("php"));
193196

@@ -199,9 +202,11 @@ impl<'a> ParsedImpl<'a> {
199202
}
200203
syn::ImplItem::Fn(method) => {
201204
let attr = PhpFunctionImplAttribute::from_attributes(&method.attrs)?;
202-
let name = attr
203-
.rename
204-
.rename_method(method.sig.ident.to_string(), self.change_method_case);
205+
let name = attr.rename.rename_method(
206+
ident_to_php_name(&method.sig.ident),
207+
self.change_method_case,
208+
);
209+
validate_php_name(&name, PhpNameContext::Method);
205210
let docs = get_docs(&attr.attrs)?;
206211
method.attrs.retain(|attr| !attr.path().is_ident("php"));
207212

crates/macros/src/interface.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ 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::{
15+
PhpNameContext, PhpRename, RenameRule, Visibility, ident_to_php_name, validate_php_name,
16+
};
1517
use crate::prelude::*;
1618

1719
const INTERNAL_INTERFACE_NAME_PREFIX: &str = "PhpInterface";
@@ -196,7 +198,10 @@ impl<'a> Parse<'a, InterfaceData<'a>> for ItemTrait {
196198
fn parse(&'a mut self) -> Result<InterfaceData<'a>> {
197199
let attrs = TraitAttributes::from_attributes(&self.attrs)?;
198200
let ident = &self.ident;
199-
let name = attrs.rename.rename(ident.to_string(), RenameRule::Pascal);
201+
let name = attrs
202+
.rename
203+
.rename(ident_to_php_name(ident), RenameRule::Pascal);
204+
validate_php_name(&name, PhpNameContext::Interface);
200205
let docs = get_docs(&attrs.attrs)?;
201206
self.attrs.clean_php();
202207
let interface_name = format_ident!("{INTERNAL_INTERFACE_NAME_PREFIX}{ident}");
@@ -277,16 +282,12 @@ fn parse_trait_item_fn(
277282
modifiers.insert(MethodModifier::Static);
278283
}
279284

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,
285+
let method_name = php_attr.rename.rename(
286+
ident_to_php_name(&fn_item.sig.ident),
287+
change_case.unwrap_or(RenameRule::Camel),
289288
);
289+
validate_php_name(&method_name, PhpNameContext::Method);
290+
let f = Function::new(&fn_item.sig, method_name, args, php_attr.optional, docs);
290291

291292
if php_attr.constructor.is_present() {
292293
Ok(MethodKind::Constructor(f))
@@ -336,9 +337,10 @@ fn parse_trait_item_const(
336337

337338
let attr = PhpConstAttribute::from_attributes(&const_item.attrs)?;
338339
let name = attr.rename.rename(
339-
const_item.ident.to_string(),
340+
ident_to_php_name(&const_item.ident),
340341
change_case.unwrap_or(RenameRule::ScreamingSnake),
341342
);
343+
validate_php_name(&name, PhpNameContext::Constant);
342344
let docs = get_docs(&attr.attrs)?;
343345
const_item.attrs.clean_php();
344346

0 commit comments

Comments
 (0)