Skip to content

Commit 57b33ac

Browse files
authored
Parser cleanup (#21)
* cleanup of various issues with parser * remove debug prints, add back nanoserde to testing
1 parent a4a7e90 commit 57b33ac

File tree

5 files changed

+187
-119
lines changed

5 files changed

+187
-119
lines changed

benchmarks/src/lib.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,13 @@ impl TestBench {
8181
#[bench]
8282
fn bench_basic(b: &mut Bencher) {
8383
let mut rng = WyRand::new();
84-
let first = std::hint::black_box(TestBench::generate_random(&mut rng));
84+
let mut first = std::hint::black_box(TestBench::generate_random(&mut rng));
8585
let second = std::hint::black_box(TestBench::generate_random(&mut rng));
8686
b.iter(|| {
8787
let diff = StructDiff::diff(&first, &second);
88-
std::hint::black_box(first.apply_ref(diff))
88+
std::hint::black_box(first.apply_mut(diff));
8989
});
90+
assert_eq!(first.b, second.b);
9091
}
9192

9293
#[bench]
@@ -106,12 +107,13 @@ mod diff_struct_bench {
106107
#[bench]
107108
fn bench_basic(b: &mut Bencher) {
108109
let mut rng = WyRand::new();
109-
let first = std::hint::black_box(TestBench::generate_random(&mut rng));
110+
let mut first = std::hint::black_box(TestBench::generate_random(&mut rng));
110111
let second = std::hint::black_box(TestBench::generate_random(&mut rng));
111112
b.iter(|| {
112113
let diff = Diff::diff(&first, &second);
113-
std::hint::black_box(Diff::apply(&mut first.clone(), &diff))
114+
std::hint::black_box(Diff::apply(&mut first, &diff))
114115
});
116+
assert_eq!(first.b, second.b);
115117
}
116118

117119
#[bench]
@@ -134,21 +136,21 @@ mod serde_diff_bench {
134136
#[bench]
135137
fn bench_basic(b: &mut Bencher) {
136138
let mut rng = WyRand::new();
137-
let first = std::hint::black_box(TestBench::generate_random(&mut rng));
139+
let mut first = std::hint::black_box(TestBench::generate_random(&mut rng));
138140
let second = std::hint::black_box(TestBench::generate_random(&mut rng));
139141
let options = bincode::DefaultOptions::new()
140142
.with_fixint_encoding()
141143
.allow_trailing_bytes();
142144
b.iter(|| {
143-
let mut target = second.clone();
144145
let mut diff = std::hint::black_box(
145146
options
146147
.serialize(&serde_diff::Diff::serializable(&first, &second))
147148
.unwrap(),
148149
);
149150
let mut deserializer = bincode::Deserializer::from_slice(&mut diff[..], options);
150-
serde_diff::Apply::apply(&mut deserializer, &mut target).unwrap();
151+
serde_diff::Apply::apply(&mut deserializer, &mut first).unwrap();
151152
});
153+
assert_eq!(first.b, second.b);
152154
}
153155

154156
#[bench]
@@ -172,7 +174,6 @@ mod serde_diff_bench {
172174
}
173175
}
174176

175-
#[cfg(test)]
176177
mod size_tests {
177178
use super::*;
178179

derive/src/difference.rs

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ pub(crate) fn derive_struct_diff_struct(struct_: &Struct) -> TokenStream {
8282
#[cfg(feature = "generated_setters")]
8383
let mut setters_body = String::new();
8484

85-
let enum_name = String::from("__".to_owned() + struct_.name.as_str() + "StructDiffEnum");
85+
let enum_name = String::from("__".to_owned() + struct_.name.as_ref().unwrap().as_str() + "StructDiffEnum");
8686
let struct_generics_names_hash: HashSet<String> =
8787
struct_.generics.iter().map(|x| x.full()).collect();
8888

@@ -619,7 +619,7 @@ pub(crate) fn derive_struct_diff_struct(struct_: &Struct) -> TokenStream {
619619
.map(|gen| Generic::ident_with_const(gen))
620620
.collect::<Vec<_>>()
621621
.join(", "),
622-
struct_.name.clone(),
622+
struct_.name.clone().unwrap_or_else(|| String::from("Anonymous")),
623623
struct_
624624
.generics
625625
.iter()
@@ -689,7 +689,7 @@ pub(crate) fn derive_struct_diff_struct(struct_: &Struct) -> TokenStream {
689689
type_aliases = type_aliases,
690690
nanoserde_hack = nanoserde_hack,
691691
derives = derives,
692-
struct_name = struct_.name,
692+
struct_name = struct_.name.as_ref().unwrap(),
693693
diff_body = diff_body,
694694
enum_name = enum_name,
695695
enum_body = diff_enum_body,
@@ -805,32 +805,31 @@ pub(crate) fn derive_struct_diff_enum(enum_: &Enum) -> TokenStream {
805805
.iter()
806806
.enumerate()
807807
.for_each(|(_, field)| {
808-
let field_name = &field.name;
809-
if let Some(ty) = &field.ty {
810-
used_generics.extend(enum_.generics.iter().filter(|x| x.full() == ty.ident.path(&ty, false)));
811-
812-
813-
let to_add = enum_.generics.iter().filter(|x| ty.wraps().iter().find(|&wrapped_type| &x.full() == wrapped_type ).is_some());
814-
used_generics.extend(to_add);
815-
816-
used_generics.extend(get_used_lifetimes(&ty).into_iter().filter_map(|x| match struct_generics_names_hash.contains(&x) {
817-
true => Some(enum_.generics.iter().find(|generic| generic.full() == x ).unwrap()),
818-
false => None,
819-
}));
820-
821-
for val in get_array_lens(&ty) {
822-
if let Some(const_gen) = enum_.generics.iter().find(|x| x.full() == val) {
823-
used_generics.push(const_gen)
824-
}
808+
let field_name = field.field_name.as_ref().unwrap();
809+
let ty = &field.ty ;
810+
used_generics.extend(enum_.generics.iter().filter(|x| x.full() == ty.ident.path(&ty, false)));
811+
812+
813+
let to_add = enum_.generics.iter().filter(|x| ty.wraps().iter().find(|&wrapped_type| &x.full() == wrapped_type ).is_some());
814+
used_generics.extend(to_add);
815+
816+
used_generics.extend(get_used_lifetimes(&ty).into_iter().filter_map(|x| match struct_generics_names_hash.contains(&x) {
817+
true => Some(enum_.generics.iter().find(|generic| generic.full() == x ).unwrap()),
818+
false => None,
819+
}));
820+
821+
for val in get_array_lens(&ty) {
822+
if let Some(const_gen) = enum_.generics.iter().find(|x| x.full() == val) {
823+
used_generics.push(const_gen)
825824
}
826825
}
827-
if let Some(ty) = &field.ty {
826+
if !matches!(ty.ident, Category::None) {
828827
match (attrs_recurse(&field.attributes), attrs_collection_type(&field.attributes), ty.base() == "Option") {
829828

830829
(false, None, false) => { // The default case
831830
l!(replace_enum_body, " {}({}),", field_name, ty.full());
832831

833-
if matches!(ty.ident, Category::UnNamed) {
832+
if matches!(ty.ident, Category::AnonymousStruct { .. }) {
834833
l!(
835834
apply_single_body,
836835
"variant @ Self::{}{{..}} => *self = variant,",
@@ -866,13 +865,13 @@ pub(crate) fn derive_struct_diff_enum(enum_: &Enum) -> TokenStream {
866865

867866
l!(
868867
apply_single_body,
869-
"variant @ Self::{}(..) => *self = variant,",
868+
"variant @ Self::{} => *self = variant,",
870869
field_name
871870
);
872871

873872
l!(
874873
diff_body,
875-
"variant @ Self::{}(..) => Self::Diff::Replace(variant),",
874+
"variant @ Self::{} => Self::Diff::Replace(variant),",
876875
field_name
877876
);
878877
};

0 commit comments

Comments
 (0)