diff --git a/clap_derive/src/utils/ty.rs b/clap_derive/src/utils/ty.rs index c2cec83fb56..e180758ea86 100644 --- a/clap_derive/src/utils/ty.rs +++ b/clap_derive/src/utils/ty.rs @@ -44,7 +44,10 @@ pub fn sub_type(ty: &syn::Type) -> Option<&syn::Type> { subty_if(ty, |_| true) } -fn only_last_segment(ty: &syn::Type) -> Option<&PathSegment> { +fn only_last_segment(mut ty: &syn::Type) -> Option<&PathSegment> { + while let syn::Type::Group(syn::TypeGroup { elem, .. }) = ty { + ty = elem; + } match ty { Type::Path(TypePath { qself: None, diff --git a/clap_derive/tests/nested.rs b/clap_derive/tests/nested.rs new file mode 100644 index 00000000000..1642aba04fa --- /dev/null +++ b/clap_derive/tests/nested.rs @@ -0,0 +1,33 @@ +// Copyright 2018 Guillaume Pinot (@TeXitoi) , +// Kevin Knapp (@kbknapp) , and +// Andrew Hobden (@hoverbear) +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +// +// This work was derived from Structopt (https://github.com/TeXitoi/structopt) +// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the +// MIT/Apache 2.0 license. + +use clap::Clap; + +// Tests that clap_derive properly detects an `Option` field +// that results from a macro expansion +#[test] +fn use_option() { + macro_rules! expand_ty { + ($name:ident: $ty:ty) => { + #[derive(Clap)] + struct Outer { + #[clap(short, long)] + #[allow(dead_code)] + $name: $ty, + } + }; + } + + expand_ty!(my_field: Option); +}