From 162e49f007e6b6571f5adfd2e7102e33183cb91b Mon Sep 17 00:00:00 2001 From: Jeong YunWon Date: Fri, 17 Apr 2020 10:51:37 +0900 Subject: [PATCH] Generic support for FromArgs --- derive/src/from_args.rs | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/derive/src/from_args.rs b/derive/src/from_args.rs index 99d701188..42559fba2 100644 --- a/derive/src/from_args.rs +++ b/derive/src/from_args.rs @@ -16,14 +16,11 @@ enum ParameterKind { impl ParameterKind { fn from_ident(ident: &Ident) -> Option { - if ident == "positional_only" { - Some(ParameterKind::PositionalOnly) - } else if ident == "positional_or_keyword" { - Some(ParameterKind::PositionalOrKeyword) - } else if ident == "keyword_only" { - Some(ParameterKind::KeywordOnly) - } else { - None + match ident.to_string().as_str() { + "positional_only" => Some(ParameterKind::PositionalOnly), + "positional_or_keyword" => Some(ParameterKind::PositionalOrKeyword), + "keyword_only" => Some(ParameterKind::KeywordOnly), + _ => None, } } } @@ -150,6 +147,13 @@ fn generate_field(field: &Field) -> Result { }; let name = &field.ident; + if let Some(name) = name { + if name.to_string().starts_with("_phantom") { + return Ok(quote! { + #name: std::marker::PhantomData, + }); + } + } let middle = quote! { .map(|x| ::rustpython_vm::pyobject::TryFromObject::try_from_object(vm, x)).transpose()? }; @@ -210,8 +214,9 @@ pub fn impl_from_args(input: DeriveInput) -> Result { }; let name = input.ident; + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); let output = quote! { - impl ::rustpython_vm::function::FromArgs for #name { + impl #impl_generics ::rustpython_vm::function::FromArgs for #name #ty_generics #where_clause { fn from_args( vm: &::rustpython_vm::VirtualMachine, args: &mut ::rustpython_vm::function::PyFuncArgs