|
1 | 1 | use anyhow::{anyhow, bail, Result};
|
2 | 2 | use quote::ToTokens;
|
3 | 3 | use std::collections::HashMap;
|
4 |
| -use syn::{ReturnType, parse_quote}; |
| 4 | +use syn::{ReturnType, parse_quote, PathArguments, GenericArgument}; |
5 | 5 |
|
6 | 6 | use crate::helpers::get_docs;
|
7 | 7 | use crate::{
|
@@ -380,22 +380,41 @@ fn build_args(
|
380 | 380 | _ => bail!("Invalid parameter type."),
|
381 | 381 | };
|
382 | 382 | let name = param.to_string();
|
383 |
| - |
384 |
| - if let Type::Reference(t) = &*ty.ty { |
| 383 | + |
| 384 | + let mut ty_inner = &*ty.ty; |
| 385 | + let mut is_option = false; |
| 386 | + |
| 387 | + if let Type::Path(t) = ty_inner { |
| 388 | + if t.path.segments[0].ident.to_string() == "Option" { |
| 389 | + if let PathArguments::AngleBracketed(t) = &t.path.segments[0].arguments { |
| 390 | + if let GenericArgument::Type(t) = &t.args[0] { |
| 391 | + ty_inner = t; |
| 392 | + is_option = true; |
| 393 | + } |
| 394 | + } |
| 395 | + } |
| 396 | + } |
| 397 | + let mut is_str = false; |
| 398 | + if let Type::Reference(t) = ty_inner { |
385 | 399 | if t.mutability.is_none() {
|
386 | 400 | if let Type::Path(t) = &*t.elem {
|
387 |
| - if t.path.is_ident("str") { |
388 |
| - hack_tokens.append_all( |
389 |
| - quote! { let #param = unsafe { ::core::mem::transmute::<&str, &'static str>(#param) }; } |
390 |
| - ); |
391 |
| - } else { |
392 |
| - hack_tokens.append_all( |
393 |
| - quote! { let #param = unsafe { ::ext_php_rs::zend::borrow_unchecked(#param) }; } |
394 |
| - ); |
395 |
| - } |
| 401 | + is_str = t.path.is_ident("str"); |
396 | 402 | }
|
397 | 403 | }
|
398 |
| - }; |
| 404 | + } |
| 405 | + hack_tokens.append_all(if is_str { |
| 406 | + if is_option { |
| 407 | + quote! { let #param = #param.and_then(|__temp| Some(unsafe { ::core::mem::transmute::<&str, &'static str>(__temp) })); } |
| 408 | + } else { |
| 409 | + quote! { let #param = unsafe { ::core::mem::transmute::<&str, &'static str>(#param) }; } |
| 410 | + } |
| 411 | + } else { |
| 412 | + if is_option { |
| 413 | + quote! { let #param = #param.and_then(|__temp| Some(unsafe { ::ext_php_rs::zend::borrow_unchecked(__temp) })); } |
| 414 | + } else { |
| 415 | + quote! { let #param = unsafe { ::ext_php_rs::zend::borrow_unchecked(#param) }; } |
| 416 | + } |
| 417 | + }); |
399 | 418 |
|
400 | 419 | let default = defaults.get(&name);
|
401 | 420 | let mut ty = ty.ty.clone();
|
|
0 commit comments