mirror of
https://github.com/topjohnwu/cxx.git
synced 2025-02-24 01:52:27 +00:00
Support derive(Default) on structs
This commit is contained in:
parent
b600e4f348
commit
a6a9e94e08
@ -14,6 +14,7 @@ pub fn expand_struct(strct: &Struct, actual_derives: &mut Option<TokenStream>) -
|
||||
Trait::Copy => expanded.extend(struct_copy(strct, span)),
|
||||
Trait::Clone => expanded.extend(struct_clone(strct, span)),
|
||||
Trait::Debug => expanded.extend(struct_debug(strct, span)),
|
||||
Trait::Default => expanded.extend(struct_default(strct, span)),
|
||||
Trait::Eq => traits.push(quote_spanned!(span=> ::std::cmp::Eq)),
|
||||
Trait::Ord => expanded.extend(struct_ord(strct, span)),
|
||||
Trait::PartialEq => traits.push(quote_spanned!(span=> ::std::cmp::PartialEq)),
|
||||
@ -50,6 +51,7 @@ pub fn expand_enum(enm: &Enum, actual_derives: &mut Option<TokenStream>) -> Toke
|
||||
has_clone = true;
|
||||
}
|
||||
Trait::Debug => expanded.extend(enum_debug(enm, span)),
|
||||
Trait::Default => unreachable!(),
|
||||
Trait::Eq => {
|
||||
traits.push(quote_spanned!(span=> ::std::cmp::Eq));
|
||||
has_eq = true;
|
||||
@ -136,6 +138,23 @@ fn struct_debug(strct: &Struct, span: Span) -> TokenStream {
|
||||
}
|
||||
}
|
||||
|
||||
fn struct_default(strct: &Struct, span: Span) -> TokenStream {
|
||||
let ident = &strct.name.rust;
|
||||
let fields = strct.fields.iter().map(|field| &field.ident);
|
||||
|
||||
quote_spanned! {span=>
|
||||
impl ::std::default::Default for #ident {
|
||||
fn default() -> Self {
|
||||
#ident {
|
||||
#(
|
||||
#fields: ::std::default::Default::default(),
|
||||
)*
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn struct_ord(strct: &Struct, span: Span) -> TokenStream {
|
||||
let ident = &strct.name.rust;
|
||||
let fields = strct.fields.iter().map(|field| &field.ident);
|
||||
|
@ -3,7 +3,7 @@ use crate::syntax::report::Errors;
|
||||
use crate::syntax::types::TrivialReason;
|
||||
use crate::syntax::{
|
||||
error, ident, Api, Array, Enum, ExternFn, ExternType, Impl, Lang, Receiver, Ref, Signature,
|
||||
SliceRef, Struct, Ty1, Type, Types,
|
||||
SliceRef, Struct, Trait, Ty1, Type, Types,
|
||||
};
|
||||
use proc_macro2::{Delimiter, Group, Ident, TokenStream};
|
||||
use quote::{quote, ToTokens};
|
||||
@ -256,6 +256,15 @@ fn check_api_enum(cx: &mut Check, enm: &Enum) {
|
||||
"explicit #[repr(...)] is required for enum without any variants",
|
||||
);
|
||||
}
|
||||
|
||||
for derive in &enm.derives {
|
||||
if derive.what == Trait::Default {
|
||||
cx.error(
|
||||
derive,
|
||||
"derive(Default) on shared enums is not supported yet",
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn check_api_type(cx: &mut Check, ety: &ExternType) {
|
||||
|
@ -11,6 +11,7 @@ pub enum Trait {
|
||||
Clone,
|
||||
Copy,
|
||||
Debug,
|
||||
Default,
|
||||
Eq,
|
||||
Ord,
|
||||
PartialEq,
|
||||
@ -23,6 +24,7 @@ impl Derive {
|
||||
"Clone" => Trait::Clone,
|
||||
"Copy" => Trait::Copy,
|
||||
"Debug" => Trait::Debug,
|
||||
"Default" => Trait::Default,
|
||||
"Eq" => Trait::Eq,
|
||||
"Ord" => Trait::Ord,
|
||||
"PartialEq" => Trait::PartialEq,
|
||||
@ -46,6 +48,7 @@ impl AsRef<str> for Trait {
|
||||
Trait::Clone => "Clone",
|
||||
Trait::Copy => "Copy",
|
||||
Trait::Debug => "Debug",
|
||||
Trait::Default => "Default",
|
||||
Trait::Eq => "Eq",
|
||||
Trait::Ord => "Ord",
|
||||
Trait::PartialEq => "PartialEq",
|
||||
|
Loading…
x
Reference in New Issue
Block a user