Skip to content

Commit e520e33

Browse files
authored
feat: argument defaults can be any expr valid in const scope
`None` for example Refs: #433
1 parent f901d1c commit e520e33

File tree

6 files changed

+42
-8
lines changed

6 files changed

+42
-8
lines changed

crates/macros/src/function.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use darling::{FromAttributes, ToTokens};
44
use proc_macro2::{Ident, Span, TokenStream};
55
use quote::{format_ident, quote};
66
use syn::spanned::Spanned as _;
7-
use syn::PatType;
8-
use syn::{FnArg, GenericArgument, ItemFn, Lit, PathArguments, Type, TypePath};
7+
use syn::{Expr, FnArg, GenericArgument, ItemFn, PatType, PathArguments, Type, TypePath};
98

109
use crate::helpers::get_docs;
1110
use crate::parsing::{PhpRename, Visibility};
@@ -28,7 +27,7 @@ pub fn wrap(input: &syn::Path) -> Result<TokenStream> {
2827
struct PhpFunctionAttribute {
2928
#[darling(flatten)]
3029
rename: PhpRename,
31-
defaults: HashMap<Ident, Lit>,
30+
defaults: HashMap<Ident, Expr>,
3231
optional: Option<Ident>,
3332
vis: Option<Visibility>,
3433
attrs: Vec<syn::Attribute>,
@@ -381,7 +380,7 @@ pub struct TypedArg<'a> {
381380
pub name: &'a Ident,
382381
pub ty: Type,
383382
pub nullable: bool,
384-
pub default: Option<Lit>,
383+
pub default: Option<Expr>,
385384
pub as_ref: bool,
386385
pub variadic: bool,
387386
}
@@ -395,7 +394,7 @@ pub struct Args<'a> {
395394
impl<'a> Args<'a> {
396395
pub fn parse_from_fnargs(
397396
args: impl Iterator<Item = &'a FnArg>,
398-
mut defaults: HashMap<Ident, Lit>,
397+
mut defaults: HashMap<Ident, Expr>,
399398
) -> Result<Self> {
400399
let mut result = Self {
401400
receiver: None,

crates/macros/src/impl_.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use darling::FromAttributes;
33
use proc_macro2::TokenStream;
44
use quote::quote;
55
use std::collections::{HashMap, HashSet};
6-
use syn::{Ident, ItemImpl, Lit};
6+
use syn::{Expr, Ident, ItemImpl};
77

88
use crate::constant::PhpConstAttribute;
99
use crate::function::{Args, CallType, Function, MethodReceiver};
@@ -68,7 +68,7 @@ struct MethodArgs {
6868
/// The first optional argument of the function signature.
6969
optional: Option<Ident>,
7070
/// Default values for optional arguments.
71-
defaults: HashMap<Ident, Lit>,
71+
defaults: HashMap<Ident, Expr>,
7272
/// Visibility of the method (public, protected, private).
7373
vis: Visibility,
7474
/// Method type.
@@ -80,7 +80,7 @@ struct MethodArgs {
8080
pub struct PhpFunctionImplAttribute {
8181
#[darling(flatten)]
8282
rename: PhpRename,
83-
defaults: HashMap<Ident, Lit>,
83+
defaults: HashMap<Ident, Expr>,
8484
optional: Option<Ident>,
8585
vis: Option<Visibility>,
8686
attrs: Vec<syn::Attribute>,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
3+
assert(test_defaults_integer() === 42);
4+
assert(test_defaults_integer(12) === 12);
5+
assert(test_defaults_nullable_string() === null);
6+
assert(test_defaults_nullable_string('test') === 'test');

tests/src/integration/defaults/mod.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use ext_php_rs::prelude::*;
2+
3+
#[php_function]
4+
#[php(defaults(a = 42))]
5+
pub fn test_defaults_integer(a: i32) -> i32 {
6+
a
7+
}
8+
9+
#[php_function]
10+
#[php(defaults(a = None))]
11+
pub fn test_defaults_nullable_string(a: Option<String>) -> Option<String> {
12+
a
13+
}
14+
15+
pub fn build_module(builder: ModuleBuilder) -> ModuleBuilder {
16+
builder
17+
.function(wrap_function!(test_defaults_integer))
18+
.function(wrap_function!(test_defaults_nullable_string))
19+
}
20+
21+
#[cfg(test)]
22+
mod tests {
23+
#[test]
24+
fn defaults_works() {
25+
assert!(crate::integration::test::run_php("defaults/defaults.php"));
26+
}
27+
}

tests/src/integration/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ pub mod bool;
44
pub mod callable;
55
pub mod class;
66
pub mod closure;
7+
pub mod defaults;
78
pub mod globals;
89
pub mod iterator;
910
pub mod magic_method;

tests/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ pub fn build_module(module: ModuleBuilder) -> ModuleBuilder {
1717
module = integration::callable::build_module(module);
1818
module = integration::class::build_module(module);
1919
module = integration::closure::build_module(module);
20+
module = integration::defaults::build_module(module);
2021
module = integration::globals::build_module(module);
2122
module = integration::iterator::build_module(module);
2223
module = integration::magic_method::build_module(module);

0 commit comments

Comments
 (0)