Skip to content

Commit 0fb463e

Browse files
committed
Fix all the new warnings generated by wundergraph_derive
Caused by rust-lang/rust#50504
1 parent 2f662b1 commit 0fb463e

File tree

9 files changed

+154
-166
lines changed

9 files changed

+154
-166
lines changed

wundergraph_derive/src/build_filter.rs

+9-8
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,16 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
3737
None
3838
};
3939

40-
let dummy_mod = model.dummy_mod_name("build_filter");
4140
Ok(wrap_in_dummy_mod(
42-
&dummy_mod,
41+
"build_filter",
42+
&model.name,
4343
&quote! {
44-
use self::wundergraph::filter::build_filter::BuildFilter;
45-
use self::wundergraph::filter::collector::AndCollector;
46-
use self::wundergraph::diesel_ext::BoxableFilter;
47-
use self::wundergraph::diesel::sql_types::Bool;
48-
use self::wundergraph::filter::transformator::Transformator;
44+
use wundergraph::filter::build_filter::BuildFilter;
45+
use wundergraph::filter::collector::AndCollector;
46+
use wundergraph::diesel_ext::BoxableFilter;
47+
use wundergraph::diesel::sql_types::Bool;
48+
use wundergraph::filter::transformator::Transformator;
49+
use wundergraph::diesel;
4950

5051
#pg
5152
#sqlite
@@ -87,6 +88,6 @@ fn impl_build_filter(
8788
fn build_field_filter(field: &Field) -> Result<TokenStream, Diagnostic> {
8889
let field_access = field.rust_name().access();
8990
Ok(
90-
quote!(<_ as self::wundergraph::filter::collector::FilterCollector<_, _>>::append_filter(&mut and, self #field_access, t);),
91+
quote!(<_ as wundergraph::filter::collector::FilterCollector<_, _>>::append_filter(&mut and, self #field_access, t);),
9192
)
9293
}

wundergraph_derive/src/filter.rs

+76-71
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
use diagnostic_shim::Diagnostic;
2+
use field::Field;
23
use model::Model;
3-
use proc_macro2::{Span, TokenStream};
4+
use proc_macro2::{Ident, Span, TokenStream};
45
use syn;
5-
use utils::{
6-
inner_of_option_ty, inner_ty_arg, is_has_many, is_has_one, is_option_ty,
7-
wrap_in_dummy_mod_with_reeport,
8-
};
6+
use utils::{inner_of_option_ty, inner_ty_arg, is_has_many, is_has_one, is_option_ty};
97

108
pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
119
let item_name = &item.ident;
@@ -14,7 +12,6 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
1412
let table_ty = model.table_type()?;
1513
let table = table_ty.to_string();
1614

17-
let dummy_mod = model.dummy_mod_name("wundergraph_filter");
1815
let fields = model
1916
.fields()
2017
.iter()
@@ -25,85 +22,93 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
2522
if f.has_flag("skip") {
2623
None
2724
} else if is_has_one(field_ty) {
28-
let reference_ty =
29-
if is_option_ty(inner_ty_arg(field_ty, "HasOne", 1).expect("It's there")) {
30-
quote!(self::wundergraph::filter::NullableReferenceFilter)
31-
} else {
32-
quote!(self::wundergraph::filter::ReferenceFilter)
33-
};
34-
let remote_table = f.remote_table().map(|t| quote!(#t::table)).unwrap_or_else(
35-
|_| {
36-
let remote_type = inner_of_option_ty(
37-
inner_ty_arg(&f.ty, "HasOne", 1).expect("It's HasOne"),
38-
);
39-
quote!{
40-
<#remote_type as diesel::associations::HasTable>::Table
41-
}
42-
},
43-
);
44-
let remote_filter = f.filter().expect("Filter is missing");
25+
handle_has_one(f, &table_ty)
26+
} else if is_has_many(field_ty) {
27+
handle_has_many(f, item_name, &table_ty)
28+
} else {
4529
let graphql_name = f.graphql_name().to_string();
4630
Some(Ok(quote!{
4731
#[wundergraph(graphql_name = #graphql_name)]
48-
#field_name: Option<#reference_ty<
49-
#table_ty::#sql_name,
50-
#remote_filter,
51-
<#remote_table as diesel::Table>::PrimaryKey,
32+
#field_name: ::std::option::Option<::wundergraph::filter::FilterOption<
33+
#field_ty,
34+
#table_ty::#sql_name,
5235
>>
5336
}))
54-
} else if is_has_many(field_ty) {
55-
let reference_ty = if f.is_nullable_reference() {
56-
quote!(self::wundergraph::filter::ReverseNullableReferenceFilter)
57-
} else {
58-
quote!(self::wundergraph::filter::ReferenceFilter)
59-
};
60-
let remote_table = f.remote_table().map(|t| quote!(#t)).unwrap_or_else(|_| {
37+
}
38+
}).collect::<Result<Vec<_>, _>>()?;
39+
40+
Ok(quote! {
41+
#[derive(Nameable, Debug, Clone, BuildFilter, InnerFilter)]
42+
#[wundergraph(table_name = #table)]
43+
pub struct #filter_name {
44+
#(#fields,)*
45+
}
46+
})
47+
}
48+
49+
fn handle_has_many(
50+
f: &Field,
51+
item_name: &Ident,
52+
table_ty: &Ident,
53+
) -> Option<Result<TokenStream, Diagnostic>> {
54+
let field_name = f.rust_name();
55+
let reference_ty = if f.is_nullable_reference() {
56+
quote!(::wundergraph::filter::ReverseNullableReferenceFilter)
57+
} else {
58+
quote!(::wundergraph::filter::ReferenceFilter)
59+
};
60+
let remote_table = f.remote_table().map(|t| quote!(#t)).unwrap_or_else(|_| {
6161
let remote_type = inner_ty_arg(inner_of_option_ty(&f.ty), "HasMany", 0)
6262
.expect("It is HasMany");
63-
quote!(<<#remote_type as diesel::associations::BelongsTo<#item_name>>::ForeignKeyColumn as diesel::Column>::Table)
63+
quote!(<<#remote_type as ::wundergraph::diesel::associations::BelongsTo<#item_name>>::ForeignKeyColumn as ::wundergraph::diesel::Column>::Table)
6464
});
65-
let foreign_key = f
65+
let foreign_key = f
6666
.foreign_key()
6767
.map(|k| quote!(#remote_table::#k))
6868
.unwrap_or_else(|_| {
6969
let remote_type = inner_ty_arg(inner_of_option_ty(&f.ty), "HasMany", 0)
7070
.expect("It is HasMany");
71-
quote!(<#remote_type as diesel::associations::BelongsTo<#item_name>>::ForeignKeyColumn)
71+
quote!(<#remote_type as ::wundergraph::diesel::associations::BelongsTo<#item_name>>::ForeignKeyColumn)
7272
});
73-
let remote_filter = f.filter().expect("Filter is missing");
74-
let graphql_name = f.graphql_name().to_string();
75-
Some(Ok(quote!{
76-
#[wundergraph(graphql_name = #graphql_name)]
77-
#field_name: Option<#reference_ty<
78-
<#table_ty::table as diesel::Table>::PrimaryKey,
79-
#remote_filter,
80-
#foreign_key,
81-
>>
82-
}))
83-
} else {
84-
let graphql_name = f.graphql_name().to_string();
85-
Some(Ok(quote!{
86-
#[wundergraph(graphql_name = #graphql_name)]
87-
#field_name: Option<self::wundergraph::filter::FilterOption<
88-
#field_ty,
89-
#table_ty::#sql_name,
90-
>>
91-
}))
92-
}
93-
})
94-
.collect::<Result<Vec<_>, _>>()?;
95-
96-
Ok(wrap_in_dummy_mod_with_reeport(
97-
&dummy_mod,
98-
&quote! {
99-
use self::wundergraph::diesel;
73+
let remote_filter = f.filter().expect("Filter is missing");
74+
let graphql_name = f.graphql_name().to_string();
75+
Some(Ok(quote!{
76+
#[wundergraph(graphql_name = #graphql_name)]
77+
#field_name: ::std::option::Option<#reference_ty<
78+
<#table_ty::table as ::wundergraph::diesel::Table>::PrimaryKey,
79+
#remote_filter,
80+
#foreign_key,
81+
>>
82+
}))
83+
}
10084

101-
#[derive(Nameable, BuildFilter, InnerFilter, Debug, Clone)]
102-
#[wundergraph(table_name = #table)]
103-
pub struct #filter_name {
104-
#(#fields,)*
85+
fn handle_has_one(f: &Field, table_ty: &Ident) -> Option<Result<TokenStream, Diagnostic>> {
86+
let field_name = f.rust_name();
87+
let field_ty = &f.ty;
88+
let sql_name = f.sql_name();
89+
let reference_ty = if is_option_ty(inner_ty_arg(field_ty, "HasOne", 1).expect("It's there")) {
90+
quote!(::wundergraph::filter::NullableReferenceFilter)
91+
} else {
92+
quote!(::wundergraph::filter::ReferenceFilter)
93+
};
94+
let remote_table = f
95+
.remote_table()
96+
.map(|t| quote!(#t::table))
97+
.unwrap_or_else(|_| {
98+
let remote_type =
99+
inner_of_option_ty(inner_ty_arg(&f.ty, "HasOne", 1).expect("It's HasOne"));
100+
quote!{
101+
<#remote_type as ::wundergraph::diesel::associations::HasTable>::Table
105102
}
106-
},
107-
&[quote!(#filter_name)],
108-
))
103+
});
104+
let remote_filter = f.filter().expect("Filter is missing");
105+
let graphql_name = f.graphql_name().to_string();
106+
Some(Ok(quote!{
107+
#[wundergraph(graphql_name = #graphql_name)]
108+
#field_name: ::std::option::Option<#reference_ty<
109+
#table_ty::#sql_name,
110+
#remote_filter,
111+
<#remote_table as ::wundergraph::diesel::Table>::PrimaryKey,
112+
>>
113+
}))
109114
}

wundergraph_derive/src/filter_value.rs

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use diagnostic_shim::Diagnostic;
2-
use proc_macro2::{Span, TokenStream};
2+
use proc_macro2::TokenStream;
33
use syn;
44
use utils::wrap_in_dummy_mod;
55

@@ -10,14 +10,11 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
1010
generics.params.push(parse_quote!(__C));
1111
let (impl_generics, _, _) = generics.split_for_impl();
1212

13-
let dummy_mod = format!(
14-
"_impl_filter_value_for_{}",
15-
item.ident.to_string().to_lowercase()
16-
);
1713
Ok(wrap_in_dummy_mod(
18-
&syn::Ident::new(&dummy_mod, Span::call_site()),
14+
"filter_value_for",
15+
&item.ident,
1916
&quote! {
20-
use self::wundergraph::filter::filter_value::FilterValue;
17+
use wundergraph::filter::filter_value::FilterValue;
2118

2219
impl #impl_generics FilterValue<__C> for #item_name #ty_generics
2320
#where_clause

wundergraph_derive/src/from_lookahead.rs

+5-7
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,13 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
2020

2121
let (impl_generics, ty_generics, where_clause) = item.generics.split_for_impl();
2222

23-
let dummy_mod = format!(
24-
"_impl_from_lookahead_for_{}",
25-
item.ident.to_string().to_lowercase()
26-
);
23+
2724
Ok(wrap_in_dummy_mod(
28-
&syn::Ident::new(&dummy_mod, Span::call_site()),
25+
"from_look_ahead",
26+
&item.ident,
2927
&quote! {
30-
use self::wundergraph::helper::FromLookAheadValue;
31-
use self::wundergraph::juniper::LookAheadValue;
28+
use wundergraph::helper::FromLookAheadValue;
29+
use wundergraph::juniper::LookAheadValue;
3230

3331
impl #impl_generics FromLookAheadValue for #item_name #ty_generics
3432
#where_clause

wundergraph_derive/src/inner_filter.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
1616
let to_inner_input_value = build_to_inner_input_value(&model)?;
1717
let register_fields = build_register_fields(&model)?;
1818

19-
let dummy_mod = model.dummy_mod_name("inner_filter");
2019
Ok(wrap_in_dummy_mod(
21-
&dummy_mod,
20+
"inner_filter",
21+
&item_name,
2222
&quote! {
23-
use self::wundergraph::juniper::{self, InputValue, LookAheadValue, Registry};
24-
use self::wundergraph::juniper::meta::Argument;
25-
use self::wundergraph::indexmap::IndexMap;
26-
use self::wundergraph::filter::inner_filter::InnerFilter;
27-
use self::wundergraph::helper::NameBuilder;
23+
use wundergraph::juniper::{self, InputValue, LookAheadValue, Registry};
24+
use wundergraph::juniper::meta::Argument;
25+
use wundergraph::indexmap::IndexMap;
26+
use wundergraph::filter::inner_filter::InnerFilter;
27+
use wundergraph::helper::NameBuilder;
2828

2929
impl #impl_generics InnerFilter for #item_name #ty_generics
3030
#where_clause
@@ -97,7 +97,7 @@ fn build_from_look_ahead(model: &Model) -> Result<TokenStream, Diagnostic> {
9797
quote!{
9898
let #field_name = obj.iter()
9999
.find(|o| o.0 == stringify!(#graphq_name))
100-
.and_then(|o| <#ty as self::wundergraph::helper::FromLookAheadValue>::from_look_ahead(&o.1))
100+
.and_then(|o| <#ty as wundergraph::helper::FromLookAheadValue>::from_look_ahead(&o.1))
101101
#map_box;
102102
}
103103
});

wundergraph_derive/src/model.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ impl Model {
130130
})
131131
.unwrap_or_else(|_| {
132132
Ok(parse_quote!{
133-
self::wundergraph::diesel::r2d2::PooledConnection<
134-
self::wundergraph::diesel::r2d2::ConnectionManager<
133+
wundergraph::diesel::r2d2::PooledConnection<
134+
wundergraph::diesel::r2d2::ConnectionManager<
135135
#connection
136136
>
137137
>
@@ -144,7 +144,7 @@ impl Model {
144144
.get_flag::<syn::Path>("query_modifier")
145145
.unwrap_or_else(|_| {
146146
parse_quote!{
147-
self::wundergraph::query_modifier::DefaultModifier<Self::Context, Self>
147+
wundergraph::query_modifier::DefaultModifier<Self::Context, Self>
148148
}
149149
})
150150
}

wundergraph_derive/src/nameable.rs

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,17 @@
11
use diagnostic_shim::Diagnostic;
2-
use proc_macro2::{Span, TokenStream};
2+
use proc_macro2::TokenStream;
33
use syn;
44
use utils::wrap_in_dummy_mod;
55

66
pub fn derive(item: &syn::DeriveInput) -> Result<TokenStream, Diagnostic> {
77
let item_name = &item.ident;
88
let (impl_generics, ty_generics, where_clause) = item.generics.split_for_impl();
99

10-
let dummy_mod = format!(
11-
"_impl_nameable_for_{}",
12-
item.ident.to_string().to_lowercase()
13-
);
1410
Ok(wrap_in_dummy_mod(
15-
&syn::Ident::new(&dummy_mod, Span::call_site()),
11+
"nameable",
12+
item_name,
1613
&quote! {
17-
use self::wundergraph::helper::Nameable;
14+
use wundergraph::helper::Nameable;
1815

1916
impl #impl_generics Nameable for #item_name #ty_generics
2017
#where_clause

wundergraph_derive/src/utils.rs

+13-23
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,25 @@
1-
use proc_macro2::{Span, TokenStream};
1+
use proc_macro2::{Ident, Span, TokenStream};
22
use syn::*;
33

4-
pub fn wrap_in_dummy_mod(const_name: &Ident, item: &TokenStream) -> TokenStream {
5-
wrap_in_dummy_mod_with_reeport(const_name, item, &[])
6-
}
7-
8-
pub fn wrap_in_dummy_mod_with_reeport(
9-
const_name: &Ident,
4+
pub fn wrap_in_dummy_mod(
5+
name_place_holder: &str,
6+
ident: &Ident,
107
item: &TokenStream,
11-
reexport: &[TokenStream],
128
) -> TokenStream {
13-
let reexport = reexport.iter().map(|r| {
14-
quote!{
15-
#[doc(inline)]
16-
pub use self::#const_name::#r;
17-
}
18-
});
199
let call_site = root_span(Span::call_site());
20-
let use_everything = quote_spanned!(call_site=> __wundergraph_use_everything!());
21-
quote! {
22-
#[allow(non_snake_case)]
23-
mod #const_name {
24-
// https://github.com/rust-lang/rust/issues/47314
10+
let const_name = Ident::new(
11+
&format!("_impl_{}_for_{}", name_place_holder, ident.to_string()).to_uppercase(),
12+
call_site,
13+
);
14+
quote!{
15+
#[doc(hidden)]
16+
const #const_name: () = {
2517
extern crate std;
26-
2718
mod wundergraph {
28-
#use_everything;
19+
__wundergraph_use_everything!();
2920
}
3021
#item
31-
}
32-
#(#reexport)*
22+
};
3323
}
3424
}
3525

0 commit comments

Comments
 (0)