mirror of
https://github.com/clap-rs/clap
synced 2024-09-20 14:31:58 +00:00
fix(derive): Better flatten type errors
This commit is contained in:
parent
1d533bb31f
commit
4f17f998cb
3 changed files with 44 additions and 21 deletions
|
@ -202,7 +202,7 @@ pub fn gen_augment(
|
|||
#implicit_methods;
|
||||
})
|
||||
}
|
||||
Kind::Flatten => {
|
||||
Kind::Flatten(_) => {
|
||||
let ty = &field.ty;
|
||||
let next_help_heading = item.next_help_heading();
|
||||
let next_display_order = item.next_display_order();
|
||||
|
@ -350,7 +350,7 @@ pub fn gen_augment(
|
|||
.iter()
|
||||
.filter(|(_field, item)| {
|
||||
let kind = item.kind();
|
||||
matches!(*kind, Kind::Flatten)
|
||||
matches!(*kind, Kind::Flatten(_))
|
||||
})
|
||||
.count();
|
||||
if 0 < possible_group_members_len {
|
||||
|
@ -429,8 +429,24 @@ pub fn gen_constructor(fields: &[(&Field, Item)]) -> TokenStream {
|
|||
}
|
||||
}
|
||||
|
||||
Kind::Flatten => quote_spanned! { kind.span()=>
|
||||
#field_name: clap::FromArgMatches::from_arg_matches_mut(#arg_matches)?
|
||||
Kind::Flatten(ty) => {
|
||||
match **ty {
|
||||
Ty::Other => {
|
||||
quote_spanned! { kind.span()=>
|
||||
#field_name: clap::FromArgMatches::from_arg_matches_mut(#arg_matches)?
|
||||
}
|
||||
},
|
||||
Ty::Vec |
|
||||
Ty::Option |
|
||||
Ty::OptionOption |
|
||||
Ty::OptionVec => {
|
||||
abort!(
|
||||
ty.span(),
|
||||
"{} types are not supported for flatten",
|
||||
ty.as_str()
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
Kind::Skip(val, _) => match val {
|
||||
|
@ -506,7 +522,7 @@ pub fn gen_updater(fields: &[(&Field, Item)], use_self: bool) -> TokenStream {
|
|||
}
|
||||
}
|
||||
|
||||
Kind::Flatten => quote_spanned! { kind.span()=> {
|
||||
Kind::Flatten(_) => quote_spanned! { kind.span()=> {
|
||||
#access
|
||||
clap::FromArgMatches::update_from_arg_matches_mut(#field_name, #arg_matches)?;
|
||||
}
|
||||
|
|
|
@ -173,7 +173,7 @@ fn gen_augment(
|
|||
Some(subcommand)
|
||||
}
|
||||
|
||||
Kind::Flatten => match variant.fields {
|
||||
Kind::Flatten(_) => match variant.fields {
|
||||
Unnamed(FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {
|
||||
let ty = &unnamed[0];
|
||||
let deprecations = if !override_required {
|
||||
|
@ -363,7 +363,7 @@ fn gen_has_subcommand(variants: &[(&Variant, Item)]) -> TokenStream {
|
|||
})
|
||||
.partition(|(_, item)| {
|
||||
let kind = item.kind();
|
||||
matches!(&*kind, Kind::Flatten)
|
||||
matches!(&*kind, Kind::Flatten(_))
|
||||
});
|
||||
|
||||
let subcommands = variants.iter().map(|(_variant, item)| {
|
||||
|
@ -464,7 +464,7 @@ fn gen_from_arg_matches(variants: &[(&Variant, Item)]) -> TokenStream {
|
|||
})
|
||||
.partition(|(_, item)| {
|
||||
let kind = item.kind();
|
||||
matches!(&*kind, Kind::Flatten)
|
||||
matches!(&*kind, Kind::Flatten(_))
|
||||
});
|
||||
|
||||
let subcommands = variants.iter().map(|(variant, item)| {
|
||||
|
@ -571,7 +571,7 @@ fn gen_update_from_arg_matches(variants: &[(&Variant, Item)]) -> TokenStream {
|
|||
})
|
||||
.partition(|(_, item)| {
|
||||
let kind = item.kind();
|
||||
matches!(&*kind, Kind::Flatten)
|
||||
matches!(&*kind, Kind::Flatten(_))
|
||||
});
|
||||
|
||||
let subcommands = variants.iter().map(|(variant, item)| {
|
||||
|
|
|
@ -148,7 +148,7 @@ impl Item {
|
|||
}
|
||||
|
||||
match &*res.kind {
|
||||
Kind::Flatten => {
|
||||
Kind::Flatten(_) => {
|
||||
if res.has_explicit_methods() {
|
||||
abort!(
|
||||
res.kind.span(),
|
||||
|
@ -224,7 +224,7 @@ impl Item {
|
|||
}
|
||||
|
||||
match &*res.kind {
|
||||
Kind::Flatten => {
|
||||
Kind::Flatten(_) => {
|
||||
if res.has_explicit_methods() {
|
||||
abort!(
|
||||
res.kind.span(),
|
||||
|
@ -383,7 +383,12 @@ impl Item {
|
|||
let expr = attr.value_or_abort();
|
||||
abort!(expr, "attribute `{}` does not accept a value", attr.name);
|
||||
}
|
||||
let kind = Sp::new(Kind::Flatten, attr.name.clone().span());
|
||||
let ty = self
|
||||
.kind()
|
||||
.ty()
|
||||
.cloned()
|
||||
.unwrap_or_else(|| Sp::new(Ty::Other, self.kind.span()));
|
||||
let kind = Sp::new(Kind::Flatten(ty), attr.name.clone().span());
|
||||
Some(kind)
|
||||
}
|
||||
Some(MagicAttrName::Skip) if actual_attr_kind != AttrKind::Group => {
|
||||
|
@ -902,10 +907,10 @@ impl Item {
|
|||
match (self.kind.get(), kind.get()) {
|
||||
(Kind::Arg(_), Kind::FromGlobal(_))
|
||||
| (Kind::Arg(_), Kind::Subcommand(_))
|
||||
| (Kind::Arg(_), Kind::Flatten)
|
||||
| (Kind::Arg(_), Kind::Flatten(_))
|
||||
| (Kind::Arg(_), Kind::Skip(_, _))
|
||||
| (Kind::Command(_), Kind::Subcommand(_))
|
||||
| (Kind::Command(_), Kind::Flatten)
|
||||
| (Kind::Command(_), Kind::Flatten(_))
|
||||
| (Kind::Command(_), Kind::Skip(_, _))
|
||||
| (Kind::Command(_), Kind::ExternalSubcommand)
|
||||
| (Kind::Value, Kind::Skip(_, _)) => {
|
||||
|
@ -1142,7 +1147,7 @@ pub enum Kind {
|
|||
Value,
|
||||
FromGlobal(Sp<Ty>),
|
||||
Subcommand(Sp<Ty>),
|
||||
Flatten,
|
||||
Flatten(Sp<Ty>),
|
||||
Skip(Option<AttrValue>, AttrKind),
|
||||
ExternalSubcommand,
|
||||
}
|
||||
|
@ -1155,7 +1160,7 @@ impl Kind {
|
|||
Self::Value => "value",
|
||||
Self::FromGlobal(_) => "from_global",
|
||||
Self::Subcommand(_) => "subcommand",
|
||||
Self::Flatten => "flatten",
|
||||
Self::Flatten(_) => "flatten",
|
||||
Self::Skip(_, _) => "skip",
|
||||
Self::ExternalSubcommand => "external_subcommand",
|
||||
}
|
||||
|
@ -1168,7 +1173,7 @@ impl Kind {
|
|||
Self::Value => AttrKind::Value,
|
||||
Self::FromGlobal(_) => AttrKind::Arg,
|
||||
Self::Subcommand(_) => AttrKind::Command,
|
||||
Self::Flatten => AttrKind::Command,
|
||||
Self::Flatten(_) => AttrKind::Command,
|
||||
Self::Skip(_, kind) => *kind,
|
||||
Self::ExternalSubcommand => AttrKind::Command,
|
||||
}
|
||||
|
@ -1176,10 +1181,12 @@ impl Kind {
|
|||
|
||||
pub fn ty(&self) -> Option<&Sp<Ty>> {
|
||||
match self {
|
||||
Self::Arg(ty) | Self::Command(ty) | Self::FromGlobal(ty) | Self::Subcommand(ty) => {
|
||||
Some(ty)
|
||||
}
|
||||
Self::Value | Self::Flatten | Self::Skip(_, _) | Self::ExternalSubcommand => None,
|
||||
Self::Arg(ty)
|
||||
| Self::Command(ty)
|
||||
| Self::Flatten(ty)
|
||||
| Self::FromGlobal(ty)
|
||||
| Self::Subcommand(ty) => Some(ty),
|
||||
Self::Value | Self::Skip(_, _) | Self::ExternalSubcommand => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue