Skip to content

Commit 20583fc

Browse files
committed
deser macros: prepare for second lifetime parameter
As DeserializeValue and DeserializeRow are going to be parametrized by two lifetimes instead of one, the common code for generating unique lifetimes in derive macros is adjusted to generate two lifetimes. For now, only the first generated lifetime is used (the second is ignored), because DeserializeValue and DeserializeRow still have only one lifetime.
1 parent 025342c commit 20583fc

File tree

3 files changed

+41
-26
lines changed

3 files changed

+41
-26
lines changed

scylla-macros/src/deserialize/mod.rs

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ struct StructDescForDeserialize<Attrs, Field> {
4040
attrs: Attrs,
4141
fields: Vec<Field>,
4242
constraint_trait: syn::Path,
43-
constraint_lifetime: syn::Lifetime,
43+
constraint_lifetimes: (syn::Lifetime, syn::Lifetime),
4444

4545
generics: syn::Generics,
4646
}
@@ -70,14 +70,14 @@ where
7070
.map(Field::from_field)
7171
.collect::<Result<_, _>>()?;
7272

73-
let constraint_lifetime = generate_unique_lifetime_for_impl(&input.generics);
73+
let constraint_lifetimes = generate_pair_of_unique_lifetimes_for_impl(&input.generics);
7474

7575
Ok(Self {
7676
name: input.ident.clone(),
7777
attrs,
7878
fields,
7979
constraint_trait,
80-
constraint_lifetime,
80+
constraint_lifetimes,
8181
generics: input.generics.clone(),
8282
})
8383
}
@@ -86,8 +86,8 @@ where
8686
&self.attrs
8787
}
8888

89-
fn constraint_lifetime(&self) -> &syn::Lifetime {
90-
&self.constraint_lifetime
89+
fn constraint_lifetimes(&self) -> &(syn::Lifetime, syn::Lifetime) {
90+
&self.constraint_lifetimes
9191
}
9292

9393
fn fields(&self) -> &[Field] {
@@ -99,7 +99,7 @@ where
9999
trait_: syn::Path,
100100
items: impl IntoIterator<Item = syn::ImplItem>,
101101
) -> syn::ItemImpl {
102-
let constraint_lifetime = &self.constraint_lifetime;
102+
let (constraint_lifetime, _) = self.constraint_lifetimes();
103103
let (_, ty_generics, _) = self.generics.split_for_impl();
104104
let impl_generics = &self.generics.params;
105105

@@ -108,7 +108,7 @@ where
108108
let predicates = generate_lifetime_constraints_for_impl(
109109
&self.generics,
110110
self.constraint_trait.clone(),
111-
&self.constraint_lifetime,
111+
constraint_lifetime,
112112
)
113113
.chain(generate_default_constraints(&self.fields));
114114
let trait_: syn::Path = parse_quote!(#macro_internal::#trait_);
@@ -168,16 +168,31 @@ fn generate_lifetime_constraints_for_impl<'a>(
168168
lifetime_constraints.chain(type_constraints)
169169
}
170170

171-
/// Generates a new lifetime parameter, with a different name to any of the
171+
/// Generates a pair of new lifetime parameters, with a different name to any of the
172172
/// existing generic lifetimes.
173-
fn generate_unique_lifetime_for_impl(generics: &syn::Generics) -> syn::Lifetime {
173+
fn generate_pair_of_unique_lifetimes_for_impl(
174+
generics: &syn::Generics,
175+
) -> (syn::Lifetime, syn::Lifetime) {
174176
let mut constraint_lifetime_name = "'lifetime".to_string();
175-
while generics
176-
.lifetimes()
177-
.any(|l| l.lifetime.to_string() == constraint_lifetime_name)
178-
{
177+
fn lifetime_occupied(generics: &syn::Generics, lifetime_name: &str) -> bool {
178+
generics
179+
.lifetimes()
180+
.any(|l| l.lifetime.to_string() == lifetime_name)
181+
}
182+
183+
while lifetime_occupied(generics, &constraint_lifetime_name) {
184+
// Extend the lifetime name with another underscore.
185+
constraint_lifetime_name += "_";
186+
}
187+
188+
let lifetime1 = syn::Lifetime::new(&constraint_lifetime_name, Span::call_site());
189+
constraint_lifetime_name += "_";
190+
191+
while lifetime_occupied(generics, &constraint_lifetime_name) {
179192
// Extend the lifetime name with another underscore.
180193
constraint_lifetime_name += "_";
181194
}
182-
syn::Lifetime::new(&constraint_lifetime_name, Span::call_site())
195+
let lifetime2 = syn::Lifetime::new(&constraint_lifetime_name, Span::call_site());
196+
197+
(lifetime1, lifetime2)
183198
}

scylla-macros/src/deserialize/row.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ impl<'sd> TypeCheckAssumeOrderGenerator<'sd> {
206206
// of the columns correspond fields' names/types.
207207

208208
let macro_internal = self.0.struct_attrs().macro_internal_path();
209-
let constraint_lifetime = self.0.constraint_lifetime();
209+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
210210

211211
let required_fields_iter = || {
212212
self.0
@@ -281,7 +281,7 @@ impl<'sd> DeserializeAssumeOrderGenerator<'sd> {
281281
let macro_internal = self.0.struct_attrs().macro_internal_path();
282282
let cql_name_literal = field.cql_name_literal();
283283
let deserializer = field.deserialize_target();
284-
let constraint_lifetime = self.0.constraint_lifetime();
284+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
285285

286286
let name_check: Option<syn::Stmt> = (!self.0.struct_attrs().skip_name_checks).then(|| parse_quote! {
287287
if col.spec.name() != #cql_name_literal {
@@ -315,7 +315,7 @@ impl<'sd> DeserializeAssumeOrderGenerator<'sd> {
315315

316316
fn generate(&self) -> syn::ImplItemFn {
317317
let macro_internal = self.0.struct_attrs().macro_internal_path();
318-
let constraint_lifetime = self.0.constraint_lifetime();
318+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
319319

320320
let fields = self.0.fields();
321321
let field_idents = fields.iter().map(|f| f.ident.as_ref().unwrap());
@@ -362,7 +362,7 @@ impl<'sd> TypeCheckUnorderedGenerator<'sd> {
362362
fn generate_type_check(&self, field: &Field) -> Option<syn::Block> {
363363
(!field.skip).then(|| {
364364
let macro_internal = self.0.struct_attrs().macro_internal_path();
365-
let constraint_lifetime = self.0.constraint_lifetime();
365+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
366366
let visited_flag = Self::visited_flag_variable(field);
367367
let typ = field.deserialize_target();
368368
let cql_name_literal = field.cql_name_literal();
@@ -516,7 +516,7 @@ impl<'sd> DeserializeUnorderedGenerator<'sd> {
516516
fn generate_deserialization(&self, column_index: usize, field: &Field) -> syn::Expr {
517517
assert!(!field.skip);
518518
let macro_internal = self.0.struct_attrs().macro_internal_path();
519-
let constraint_lifetime = self.0.constraint_lifetime();
519+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
520520
let deserialize_field = Self::deserialize_field_variable(field);
521521
let deserializer = field.deserialize_target();
522522

@@ -557,7 +557,7 @@ impl<'sd> DeserializeUnorderedGenerator<'sd> {
557557

558558
fn generate(&self) -> syn::ImplItemFn {
559559
let macro_internal = self.0.struct_attrs().macro_internal_path();
560-
let constraint_lifetime = self.0.constraint_lifetime();
560+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
561561
let fields = self.0.fields();
562562

563563
let deserialize_field_decls = fields

scylla-macros/src/deserialize/value.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ impl<'sd> TypeCheckAssumeOrderGenerator<'sd> {
229229
// Generates name and type validation for given Rust struct's field.
230230
fn generate_field_validation(&self, rust_field_idx: usize, field: &Field) -> syn::Expr {
231231
let macro_internal = self.0.struct_attrs().macro_internal_path();
232-
let constraint_lifetime = self.0.constraint_lifetime();
232+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
233233
let rust_field_name = field.cql_name_literal();
234234
let rust_field_typ = field.deserialize_target();
235235
let default_when_missing = field.default_when_missing;
@@ -413,7 +413,7 @@ impl<'sd> DeserializeAssumeOrderGenerator<'sd> {
413413
let macro_internal = self.0.struct_attrs().macro_internal_path();
414414
let cql_name_literal = field.cql_name_literal();
415415
let deserializer = field.deserialize_target();
416-
let constraint_lifetime = self.0.constraint_lifetime();
416+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
417417
let default_when_missing = field.default_when_missing;
418418
let default_when_null = field.default_when_null;
419419
let skip_name_checks = self.0.attrs.skip_name_checks;
@@ -532,7 +532,7 @@ impl<'sd> DeserializeAssumeOrderGenerator<'sd> {
532532
// We can assume that type_check was called.
533533

534534
let macro_internal = self.0.struct_attrs().macro_internal_path();
535-
let constraint_lifetime = self.0.constraint_lifetime();
535+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
536536
let fields = self.0.fields();
537537

538538
let field_idents = fields.iter().map(|f| f.ident.as_ref().unwrap());
@@ -592,7 +592,7 @@ impl<'sd> TypeCheckUnorderedGenerator<'sd> {
592592
fn generate_type_check(&self, field: &Field) -> Option<syn::Block> {
593593
(!field.skip).then(|| {
594594
let macro_internal = self.0.struct_attrs().macro_internal_path();
595-
let constraint_lifetime = self.0.constraint_lifetime();
595+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
596596
let visited_flag = Self::visited_flag_variable(field);
597597
let typ = field.deserialize_target();
598598
let cql_name_literal = field.cql_name_literal();
@@ -770,7 +770,7 @@ impl<'sd> DeserializeUnorderedGenerator<'sd> {
770770
fn generate_deserialization(&self, field: &Field) -> Option<syn::Expr> {
771771
(!field.skip).then(|| {
772772
let macro_internal = self.0.struct_attrs().macro_internal_path();
773-
let constraint_lifetime = self.0.constraint_lifetime();
773+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
774774
let deserialize_field = Self::deserialize_field_variable(field);
775775
let cql_name_literal = field.cql_name_literal();
776776
let deserializer = field.deserialize_target();
@@ -833,7 +833,7 @@ impl<'sd> DeserializeUnorderedGenerator<'sd> {
833833

834834
fn generate(&self) -> syn::ImplItemFn {
835835
let macro_internal = self.0.struct_attrs().macro_internal_path();
836-
let constraint_lifetime = self.0.constraint_lifetime();
836+
let (constraint_lifetime, _) = self.0.constraint_lifetimes();
837837
let fields = self.0.fields();
838838

839839
let deserialize_field_decls = fields.iter().map(Self::generate_deserialize_field_decl);

0 commit comments

Comments
 (0)