From d3cd490ac0294ea173a0aea3ed33451f39817bf6 Mon Sep 17 00:00:00 2001 From: Peter Holloway Date: Wed, 4 Oct 2023 21:32:12 +0100 Subject: [PATCH] Use fully qualified paths in generated code If user code has a type alias (or custom type) called `Result` or `Option` etc, this would be used instead of the intended standard library types causing surprising compile errors from generated code. Using the fully qualified path allows the generated code to be isolated from user types. Includes two basic regression tests covering `Result` and `Send`. Fixes #1194 --- juniper_codegen/src/common/deprecation.rs | 10 +++--- juniper_codegen/src/common/field/arg.rs | 6 ++-- juniper_codegen/src/common/field/mod.rs | 10 +++--- juniper_codegen/src/common/gen.rs | 10 +++--- juniper_codegen/src/graphql_enum/mod.rs | 30 ++++++++-------- .../src/graphql_input_object/mod.rs | 18 +++++----- juniper_codegen/src/graphql_interface/mod.rs | 36 +++++++++---------- juniper_codegen/src/graphql_object/mod.rs | 18 +++++----- juniper_codegen/src/graphql_scalar/mod.rs | 20 +++++------ .../src/graphql_subscription/mod.rs | 14 ++++---- juniper_codegen/src/graphql_union/derive.rs | 2 +- juniper_codegen/src/graphql_union/mod.rs | 29 +++++++-------- juniper_codegen/src/scalar_value/mod.rs | 34 +++++++++--------- tests/codegen/pass/local_results.rs | 12 +++++++ tests/codegen/pass/local_send.rs | 12 +++++++ tests/codegen/src/lib.rs | 7 ++++ 16 files changed, 150 insertions(+), 118 deletions(-) create mode 100644 tests/codegen/pass/local_results.rs create mode 100644 tests/codegen/pass/local_send.rs diff --git a/juniper_codegen/src/common/deprecation.rs b/juniper_codegen/src/common/deprecation.rs index 9efd6ef08..51eed8252 100644 --- a/juniper_codegen/src/common/deprecation.rs +++ b/juniper_codegen/src/common/deprecation.rs @@ -102,12 +102,12 @@ impl Directive { impl ToTokens for Directive { fn to_tokens(&self, into: &mut TokenStream) { - let reason = self - .reason - .as_ref() - .map_or_else(|| quote! { None }, |text| quote! { Some(#text) }); + let reason = self.reason.as_ref().map_or_else( + || quote! { ::core::option::Option::None }, + |text| quote! { ::core::option::Option::Some(#text) }, + ); quote! { - .deprecated(::std::option::Option::#reason) + .deprecated(#reason) } .to_tokens(into); } diff --git a/juniper_codegen/src/common/field/arg.rs b/juniper_codegen/src/common/field/arg.rs index afbe53ed8..b425eb193 100644 --- a/juniper_codegen/src/common/field/arg.rs +++ b/juniper_codegen/src/common/field/arg.rs @@ -335,13 +335,13 @@ impl OnMethod { ::juniper::IntoFieldError::<#scalar>::into_field_error(e) .map_message(|m| format!(#err_text, m)) }) - }, Ok)) + }, ::core::result::Result::Ok)) }; if for_async { quote! { match #arg { - Ok(v) => v, - Err(e) => return Box::pin(async { Err(e) }), + ::core::result::Result::Ok(v) => v, + ::core::result::Result::Err(e) => return ::std::boxed::Box::pin(async { ::core::result::Result::Err(e) }), } } } else { diff --git a/juniper_codegen/src/common/field/mod.rs b/juniper_codegen/src/common/field/mod.rs index 8e8cd2973..dedcd1bcb 100644 --- a/juniper_codegen/src/common/field/mod.rs +++ b/juniper_codegen/src/common/field/mod.rs @@ -227,7 +227,7 @@ impl Definition { ty_name: &str, ) -> TokenStream { quote! { - return Err(::juniper::FieldError::from(::std::format!( + return ::core::result::Result::Err(::juniper::FieldError::from(::std::format!( "Field `{}` not found on type `{}`", field, >::name(info) @@ -354,18 +354,18 @@ impl Definition { async move { let ex = executor.as_executor(); match res2 { - Ok(Some((ctx, r))) => { + ::core::result::Result::Ok(::core::option::Option::Some((ctx, r))) => { let sub = ex.replaced_context(ctx); sub.resolve_with_ctx_async(&(), &r) .await .map_err(|e| ex.new_error(e)) } - Ok(None) => Ok(::juniper::Value::null()), - Err(e) => Err(ex.new_error(e)), + ::core::result::Result::Ok(::core::option::Option::None) => ::core::result::Result::Ok(::juniper::Value::null()), + ::core::result::Result::Err(e) => ::core::result::Result::Err(ex.new_error(e)), } } }); - Ok(::juniper::Value::Scalar::< + ::core::result::Result::Ok(::juniper::Value::Scalar::< ::juniper::ValuesStream::<#scalar> >(::juniper::futures::StreamExt::boxed(stream))) }) diff --git a/juniper_codegen/src/common/gen.rs b/juniper_codegen/src/common/gen.rs index a0b5e7315..d40807725 100644 --- a/juniper_codegen/src/common/gen.rs +++ b/juniper_codegen/src/common/gen.rs @@ -13,8 +13,8 @@ pub(crate) fn sync_resolving_code() -> TokenStream { quote! { ::juniper::IntoResolvable::into_resolvable(res, executor.context()) .and_then(|res| match res { - Some((ctx, r)) => executor.replaced_context(ctx).resolve_with_ctx(info, &r), - None => Ok(::juniper::Value::null()), + ::core::option::Option::Some((ctx, r)) => executor.replaced_context(ctx).resolve_with_ctx(info, &r), + ::core::option::Option::None => ::core::result::Result::Ok(::juniper::Value::null()), }) } } @@ -34,13 +34,13 @@ pub(crate) fn async_resolving_code(ty: Option<&syn::Type>) -> TokenStream { let ty = ty.map(|t| quote! { : #t }); quote! { - Box::pin(::juniper::futures::FutureExt::then(fut, move |res #ty| async move { + ::std::boxed::Box::pin(::juniper::futures::FutureExt::then(fut, move |res #ty| async move { match ::juniper::IntoResolvable::into_resolvable(res, executor.context())? { - Some((ctx, r)) => { + ::core::option::Option::Some((ctx, r)) => { let subexec = executor.replaced_context(ctx); subexec.resolve_with_ctx_async(info, &r).await }, - None => Ok(::juniper::Value::null()), + ::core::option::Option::None => ::core::result::Result::Ok(::juniper::Value::null()), } })) } diff --git a/juniper_codegen/src/graphql_enum/mod.rs b/juniper_codegen/src/graphql_enum/mod.rs index c14356f65..d6f30c10e 100644 --- a/juniper_codegen/src/graphql_enum/mod.rs +++ b/juniper_codegen/src/graphql_enum/mod.rs @@ -450,8 +450,8 @@ impl Definition { for #ident #ty_generics #where_clause { - fn name(_ : &Self::TypeInfo) -> Option<&'static str> { - Some(#name) + fn name(_ : &Self::TypeInfo) -> ::core::option::Option<&'static ::core::primitive::str> { + ::core::option::Option::Some(#name) } fn meta<'r>( @@ -489,13 +489,13 @@ impl Definition { let name = &v.name; quote! { - Self::#ident => Ok(::juniper::Value::scalar(String::from(#name))), + Self::#ident => ::core::result::Result::Ok(::juniper::Value::scalar(::std::string::String::from(#name))), } }); let ignored = self.has_ignored_variants.then(|| { quote! { - _ => Err(::juniper::FieldError::<#scalar>::from( + _ => ::core::result::Result::Err(::juniper::FieldError::<#scalar>::from( "Cannot resolve ignored enum variant", )), } @@ -509,14 +509,14 @@ impl Definition { type Context = #context; type TypeInfo = (); - fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> Option<&'__i str> { + fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> ::core::option::Option<&'__i ::core::primitive::str> { >::name(info) } fn resolve( &self, _: &(), - _: Option<&[::juniper::Selection<#scalar>]>, + _: ::core::option::Option<&[::juniper::Selection<#scalar>]>, _: &::juniper::Executor, ) -> ::juniper::ExecutionResult<#scalar> { match self { @@ -549,11 +549,11 @@ impl Definition { fn resolve_async<'__a>( &'__a self, info: &'__a Self::TypeInfo, - selection_set: Option<&'__a [::juniper::Selection<#scalar>]>, + selection_set: ::core::option::Option<&'__a [::juniper::Selection<#scalar>]>, executor: &'__a ::juniper::Executor, ) -> ::juniper::BoxFuture<'__a, ::juniper::ExecutionResult<#scalar>> { let v = ::juniper::GraphQLValue::resolve(self, info, selection_set, executor); - Box::pin(::juniper::futures::future::ready(v)) + ::std::boxed::Box::pin(::juniper::futures::future::ready(v)) } } } @@ -577,7 +577,7 @@ impl Definition { let name = &v.name; quote! { - Some(#name) => Ok(Self::#ident), + ::core::option::Option::Some(#name) => ::core::result::Result::Ok(Self::#ident), } }); @@ -588,10 +588,10 @@ impl Definition { { type Error = ::std::string::String; - fn from_input_value(v: &::juniper::InputValue<#scalar>) -> Result { + fn from_input_value(v: &::juniper::InputValue<#scalar>) -> ::core::result::Result { match v.as_enum_value().or_else(|| v.as_string_value()) { #( #variants )* - _ => Err(::std::format!("Unknown enum value: {}", v)), + _ => ::core::result::Result::Err(::std::format!("Unknown enum value: {}", v)), } } } @@ -617,14 +617,14 @@ impl Definition { quote! { #ident::#var_ident => ::juniper::InputValue::<#scalar>::scalar( - String::from(#name), + ::std::string::String::from(#name), ), } }); let ignored = self.has_ignored_variants.then(|| { quote! { - _ => panic!("Cannot resolve ignored enum variant"), + _ => ::core::panic!("Cannot resolve ignored enum variant"), } }); @@ -730,13 +730,13 @@ impl Definition { generics .make_where_clause() .predicates - .push(parse_quote! { #self_ty: Sync }); + .push(parse_quote! { #self_ty: ::core::marker::Sync }); if scalar.is_generic() { generics .make_where_clause() .predicates - .push(parse_quote! { #scalar: Send + Sync }); + .push(parse_quote! { #scalar: ::core::marker::Send + ::core::marker::Sync }); } } diff --git a/juniper_codegen/src/graphql_input_object/mod.rs b/juniper_codegen/src/graphql_input_object/mod.rs index 93c21d6f8..9d3c3ad27 100644 --- a/juniper_codegen/src/graphql_input_object/mod.rs +++ b/juniper_codegen/src/graphql_input_object/mod.rs @@ -479,8 +479,8 @@ impl Definition { for #ident #ty_generics #where_clause { - fn name(_: &Self::TypeInfo) -> Option<&'static str> { - Some(#name) + fn name(_: &Self::TypeInfo) -> ::core::option::Option<&'static ::core::primitive::str> { + ::core::option::Option::Some(#name) } fn meta<'r>( @@ -524,7 +524,7 @@ impl Definition { type Context = #context; type TypeInfo = (); - fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> Option<&'__i str> { + fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> ::core::option::Option<&'__i ::core::primitive::str> { >::name(info) } } @@ -594,11 +594,11 @@ impl Definition { quote! { match obj.get(#name) { - Some(v) => { + ::core::option::Option::Some(v) => { ::juniper::FromInputValue::<#scalar>::from_input_value(v) .map_err(::juniper::IntoFieldError::into_field_error)? } - None => { #fallback } + ::core::option::Option::None => { #fallback } } } }; @@ -616,14 +616,14 @@ impl Definition { fn from_input_value( value: &::juniper::InputValue<#scalar>, - ) -> Result { + ) -> ::core::result::Result { let obj = value .to_object_value() .ok_or_else(|| ::juniper::FieldError::<#scalar>::from( ::std::format!("Expected input object, found: {}", value)) )?; - Ok(#ident { + ::core::result::Result::Ok(#ident { #( #fields )* }) } @@ -763,13 +763,13 @@ impl Definition { generics .make_where_clause() .predicates - .push(parse_quote! { #self_ty: Sync }); + .push(parse_quote! { #self_ty: ::core::marker::Sync }); if scalar.is_generic() { generics .make_where_clause() .predicates - .push(parse_quote! { #scalar: Send + Sync }); + .push(parse_quote! { #scalar: ::core::marker::Send + ::core::marker::Sync }); } } diff --git a/juniper_codegen/src/graphql_interface/mod.rs b/juniper_codegen/src/graphql_interface/mod.rs index afb856e14..9a1ec21ca 100644 --- a/juniper_codegen/src/graphql_interface/mod.rs +++ b/juniper_codegen/src/graphql_interface/mod.rs @@ -460,7 +460,7 @@ impl Definition { syn::GenericParam::Const(_) => return None, }; Some(quote! { - ::std::marker::PhantomData<::std::sync::atomic::AtomicPtr>> + ::core::marker::PhantomData<::std::sync::atomic::AtomicPtr>> }) }); quote! { __Phantom(#(#phantom_params),*) } @@ -487,7 +487,7 @@ impl Definition { quote! { #[automatically_derived] - #[derive(Clone, Copy, Debug)] + #[derive(::std::clone::Clone, ::core::marker::Copy, ::std::fmt::Debug)] #[doc = #enum_doc] #vis enum #enum_ident #enum_gens { #( #[doc(hidden)] #variants_idents(#variant_gens_pars), )* @@ -523,12 +523,12 @@ impl Definition { quote! {{ const SUPPRESS_DEAD_CODE: () = { - let none = Option::<#ident #const_gens>::None; + let none = ::core::option::Option::<#ident #const_gens>::None; match none { - Some(unreachable) => { + ::core::option::Option::Some(unreachable) => { #( let _ = unreachable.#fields; )* } - None => {} + ::core::option::Option::None => {} } }; let _ = SUPPRESS_DEAD_CODE; @@ -715,8 +715,8 @@ impl Definition { for #ty #ty_generics #where_clause { - fn name(_ : &Self::TypeInfo) -> Option<&'static str> { - Some(#name) + fn name(_ : &Self::TypeInfo) -> ::core::option::Option<&'static ::core::primitive::str> { + ::std::option::Option::Some(#name) } fn meta<'r>( @@ -784,14 +784,14 @@ impl Definition { type Context = #context; type TypeInfo = (); - fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> Option<&'__i str> { + fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> std::option::Option<&'__i ::core::primitive::str> { >::name(info) } fn resolve_field( &self, info: &Self::TypeInfo, - field: &str, + field: &::core::primitive::str, args: &::juniper::Arguments<'_, #scalar>, executor: &::juniper::Executor<'_, '_, Self::Context, #scalar>, ) -> ::juniper::ExecutionResult<#scalar> { @@ -805,15 +805,15 @@ impl Definition { &self, context: &Self::Context, info: &Self::TypeInfo, - ) -> String { + ) -> ::std::string::String { #downcast_check } fn resolve_into_type( &self, info: &Self::TypeInfo, - type_name: &str, - _: Option<&[::juniper::Selection<'_, #scalar>]>, + type_name: &::core::primitive::str, + _: ::core::option::Option<&[::juniper::Selection<'_, #scalar>]>, executor: &::juniper::Executor<'_, '_, Self::Context, #scalar>, ) -> ::juniper::ExecutionResult<#scalar> { #downcast @@ -862,21 +862,21 @@ impl Definition { fn resolve_field_async<'b>( &'b self, info: &'b Self::TypeInfo, - field: &'b str, + field: &'b ::core::primitive::str, args: &'b ::juniper::Arguments<'_, #scalar>, executor: &'b ::juniper::Executor<'_, '_, Self::Context, #scalar>, ) -> ::juniper::BoxFuture<'b, ::juniper::ExecutionResult<#scalar>> { match field { #( #fields_resolvers )* - _ => Box::pin(async move { #no_field_err }), + _ => ::std::boxed::Box::pin(async move { #no_field_err }), } } fn resolve_into_type_async<'b>( &'b self, info: &'b Self::TypeInfo, - type_name: &str, - _: Option<&'b [::juniper::Selection<'b, #scalar>]>, + type_name: &::core::primitive::str, + _: ::core::option::Option<&'b [::juniper::Selection<'b, #scalar>]>, executor: &'b ::juniper::Executor<'b, 'b, Self::Context, #scalar> ) -> ::juniper::BoxFuture<'b, ::juniper::ExecutionResult<#scalar>> { #downcast @@ -1360,13 +1360,13 @@ impl Definition { generics .make_where_clause() .predicates - .push(parse_quote! { #self_ty: Sync }); + .push(parse_quote! { #self_ty: ::core::marker::Sync }); if scalar.is_generic() { generics .make_where_clause() .predicates - .push(parse_quote! { #scalar: Send + Sync }); + .push(parse_quote! { #scalar: ::core::marker::Send + ::core::marker::Sync }); } } diff --git a/juniper_codegen/src/graphql_object/mod.rs b/juniper_codegen/src/graphql_object/mod.rs index facc73002..8d772561d 100644 --- a/juniper_codegen/src/graphql_object/mod.rs +++ b/juniper_codegen/src/graphql_object/mod.rs @@ -310,13 +310,13 @@ impl Definition { generics .make_where_clause() .predicates - .push(parse_quote! { #self_ty: Sync }); + .push(parse_quote! { #self_ty: ::core::marker::Sync }); if scalar.is_generic() { generics .make_where_clause() .predicates - .push(parse_quote! { #scalar: Send + Sync }); + .push(parse_quote! { #scalar: ::core::marker::Send + ::core::marker::Sync }); } } @@ -457,8 +457,8 @@ impl Definition { #[automatically_derived] impl #impl_generics ::juniper::GraphQLType<#scalar> for #ty #where_clause { - fn name(_ : &Self::TypeInfo) -> Option<&'static str> { - Some(#name) + fn name(_ : &Self::TypeInfo) -> ::core::option::Option<&'static ::core::primitive::str> { + ::core::option::Option::Some(#name) } fn meta<'r>( @@ -783,14 +783,14 @@ impl Definition { type Context = #context; type TypeInfo = (); - fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> Option<&'__i str> { + fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> ::core::option::Option<&'__i ::core::primitive::str> { >::name(info) } fn resolve_field( &self, info: &Self::TypeInfo, - field: &str, + field: &::core::primitive::str, args: &::juniper::Arguments<'_, #scalar>, executor: &::juniper::Executor<'_, '_, Self::Context, #scalar>, ) -> ::juniper::ExecutionResult<#scalar> { @@ -804,7 +804,7 @@ impl Definition { &self, _: &Self::Context, _: &Self::TypeInfo, - ) -> String { + ) -> ::std::string::String { #name.into() } } @@ -847,13 +847,13 @@ impl Definition { fn resolve_field_async<'b>( &'b self, info: &'b Self::TypeInfo, - field: &'b str, + field: &'b ::core::primitive::str, args: &'b ::juniper::Arguments<'_, #scalar>, executor: &'b ::juniper::Executor<'_, '_, Self::Context, #scalar>, ) -> ::juniper::BoxFuture<'b, ::juniper::ExecutionResult<#scalar>> { match field { #( #fields_resolvers )* - _ => Box::pin(async move { #no_field_err }), + _ => ::std::boxed::Box::pin(async move { #no_field_err }), } } } diff --git a/juniper_codegen/src/graphql_scalar/mod.rs b/juniper_codegen/src/graphql_scalar/mod.rs index 2280d9c24..ae4d53773 100644 --- a/juniper_codegen/src/graphql_scalar/mod.rs +++ b/juniper_codegen/src/graphql_scalar/mod.rs @@ -375,8 +375,8 @@ impl Definition { impl #impl_gens ::juniper::GraphQLType<#scalar> for #ty #where_clause { - fn name(_: &Self::TypeInfo) -> Option<&'static str> { - Some(#name) + fn name(_: &Self::TypeInfo) -> ::core::option::Option<&'static ::core::primitive::str> { + ::core::option::Option::Some(#name) } fn meta<'r>( @@ -416,14 +416,14 @@ impl Definition { type Context = (); type TypeInfo = (); - fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> Option<&'i str> { + fn type_name<'i>(&self, info: &'i Self::TypeInfo) -> ::core::option::Option<&'i ::core::primitive::str> { >::name(info) } fn resolve( &self, info: &(), - selection: Option<&[::juniper::Selection<'_, #scalar>]>, + selection: ::core::option::Option<&[::juniper::Selection<'_, #scalar>]>, executor: &::juniper::Executor<'_, '_, Self::Context, #scalar>, ) -> ::juniper::ExecutionResult<#scalar> { #resolve @@ -451,12 +451,12 @@ impl Definition { fn resolve_async<'b>( &'b self, info: &'b Self::TypeInfo, - selection_set: Option<&'b [::juniper::Selection<'_, #scalar>]>, + selection_set: ::core::option::Option<&'b [::juniper::Selection<'_, #scalar>]>, executor: &'b ::juniper::Executor<'_, '_, Self::Context, #scalar>, ) -> ::juniper::BoxFuture<'b, ::juniper::ExecutionResult<#scalar>> { use ::juniper::futures::future; let v = ::juniper::GraphQLValue::resolve(self, info, selection_set, executor); - Box::pin(future::ready(v)) + ::std::boxed::Box::pin(future::ready(v)) } } } @@ -507,7 +507,7 @@ impl Definition { { type Error = ::juniper::executor::FieldError<#scalar>; - fn from_input_value(input: &::juniper::InputValue<#scalar>) -> Result { + fn from_input_value(input: &::juniper::InputValue<#scalar>) -> ::core::result::Result { #from_input_value .map_err(::juniper::executor::IntoFieldError::<#scalar>::into_field_error) } @@ -646,13 +646,13 @@ impl Definition { generics .make_where_clause() .predicates - .push(parse_quote! { #self_ty: Sync }); + .push(parse_quote! { #self_ty: ::core::marker::Sync }); if scalar.is_generic() { generics .make_where_clause() .predicates - .push(parse_quote! { #scalar: Send + Sync }); + .push(parse_quote! { #scalar: ::core::marker::Send + ::core::marker::Sync }); } } @@ -720,7 +720,7 @@ impl Methods { to_output: Some(to_output), .. } => { - quote! { Ok(#to_output(self)) } + quote! { ::core::result::Result::Ok(#to_output(self)) } } Self::Delegated { field, .. } => { quote! { diff --git a/juniper_codegen/src/graphql_subscription/mod.rs b/juniper_codegen/src/graphql_subscription/mod.rs index c8d2fb422..37b99d867 100644 --- a/juniper_codegen/src/graphql_subscription/mod.rs +++ b/juniper_codegen/src/graphql_subscription/mod.rs @@ -49,18 +49,18 @@ impl Definition { type Context = #context; type TypeInfo = (); - fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> Option<&'__i str> { + fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> ::core::option::Option<&'__i ::core::primitive::str> { >::name(info) } fn resolve_field( &self, _: &Self::TypeInfo, - _: &str, + _: &::core::primitive::str, _: &::juniper::Arguments<'_, #scalar>, _: &::juniper::Executor<'_, '_, Self::Context, #scalar>, ) -> ::juniper::ExecutionResult<#scalar> { - Err(::juniper::FieldError::from( + ::core::result::Result::Err(::juniper::FieldError::from( "Called `resolve_field` on subscription object", )) } @@ -69,7 +69,7 @@ impl Definition { &self, _: &Self::Context, _: &Self::TypeInfo, - ) -> String { + ) -> ::std::string::String { #name.into() } } @@ -94,7 +94,7 @@ impl Definition { .as_mut() .unwrap() .predicates - .push(parse_quote! { #scalar: Send + Sync }); + .push(parse_quote! { #scalar: ::core::marker::Send + ::core::marker::Sync }); } let ty = &self.ty; let ty_name = ty.to_token_stream().to_string(); @@ -116,7 +116,7 @@ impl Definition { >( &'s self, info: &'i Self::TypeInfo, - field: &'fi str, + field: &'fi ::core::primitive::str, args: ::juniper::Arguments<'args, #scalar>, executor: &'ref_e ::juniper::Executor<'ref_e, 'e, Self::Context, #scalar>, ) -> ::juniper::BoxFuture<'f, std::result::Result< @@ -134,7 +134,7 @@ impl Definition { { match field { #( #fields_resolvers )* - _ => Box::pin(async move { #no_field_err }), + _ => ::std::boxed::Box::pin(async move { #no_field_err }), } } } diff --git a/juniper_codegen/src/graphql_union/derive.rs b/juniper_codegen/src/graphql_union/derive.rs index a10be60cc..c4bbaf6dd 100644 --- a/juniper_codegen/src/graphql_union/derive.rs +++ b/juniper_codegen/src/graphql_union/derive.rs @@ -151,7 +151,7 @@ fn parse_variant_from_enum_variant( } } else { parse_quote! { - match self { #enum_ident::#var_ident(ref v) => Some(v), _ => None, } + match self { #enum_ident::#var_ident(ref v) => ::core::option::Option::Some(v), _ => ::core::option::Option::None, } } }; diff --git a/juniper_codegen/src/graphql_union/mod.rs b/juniper_codegen/src/graphql_union/mod.rs index fa585b004..4ff361c8a 100644 --- a/juniper_codegen/src/graphql_union/mod.rs +++ b/juniper_codegen/src/graphql_union/mod.rs @@ -338,7 +338,8 @@ impl Definition { let mut ty_full = quote! { #ty #ty_generics }; if self.is_trait_object { - ty_full = quote! { dyn #ty_full + '__obj + Send + Sync }; + ty_full = + quote! { dyn #ty_full + '__obj + ::core::marker::Send + ::core::marker::Sync }; } let mut generics = self.generics.clone(); @@ -382,13 +383,13 @@ impl Definition { generics .make_where_clause() .predicates - .push(parse_quote! { #self_ty: Sync }); + .push(parse_quote! { #self_ty: ::core::marker::Sync }); if scalar.is_generic() { generics .make_where_clause() .predicates - .push(parse_quote! { #scalar: Send + Sync }); + .push(parse_quote! { #scalar: ::core::marker::Send + ::core::marker::Sync }); } } @@ -472,8 +473,8 @@ impl Definition { #[automatically_derived] impl #impl_generics ::juniper::GraphQLType<#scalar> for #ty_full #where_clause { - fn name(_ : &Self::TypeInfo) -> Option<&'static str> { - Some(#name) + fn name(_ : &Self::TypeInfo) -> ::core::option::Option<&'static ::core::primitive::str> { + ::core::option::Option::Some(#name) } fn meta<'r>( @@ -524,7 +525,7 @@ impl Definition { type Context = #context; type TypeInfo = (); - fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> Option<&'__i str> { + fn type_name<'__i>(&self, info: &'__i Self::TypeInfo) -> Option<&'__i ::core::primitive::str> { >::name(info) } @@ -532,7 +533,7 @@ impl Definition { &self, context: &Self::Context, info: &Self::TypeInfo, - ) -> String { + ) -> ::std::string::String { #( #match_variant_names )* ::std::panic!( "GraphQL union `{}` cannot be resolved into any of its \ @@ -544,13 +545,13 @@ impl Definition { fn resolve_into_type( &self, info: &Self::TypeInfo, - type_name: &str, - _: Option<&[::juniper::Selection<'_, #scalar>]>, + type_name: &::core::primitive::str, + _: ::core::option::Option<&[::juniper::Selection<'_, #scalar>]>, executor: &::juniper::Executor<'_, '_, Self::Context, #scalar>, ) -> ::juniper::ExecutionResult<#scalar> { let context = executor.context(); #( #variant_resolvers )* - return Err(::juniper::FieldError::from(::std::format!( + return ::core::result::Result::Err(::juniper::FieldError::from(::std::format!( "Concrete type `{}` is not handled by instance \ resolvers on GraphQL union `{}`", type_name, #name, @@ -586,8 +587,8 @@ impl Definition { fn resolve_into_type_async<'b>( &'b self, info: &'b Self::TypeInfo, - type_name: &str, - _: Option<&'b [::juniper::Selection<'b, #scalar>]>, + type_name: &::core::primitive::str, + _: ::core::option::Option<&'b [::juniper::Selection<'b, #scalar>]>, executor: &'b ::juniper::Executor<'b, 'b, Self::Context, #scalar> ) -> ::juniper::BoxFuture<'b, ::juniper::ExecutionResult<#scalar>> { let context = executor.context(); @@ -735,13 +736,13 @@ impl VariantDefinition { quote! { match <#ty as ::juniper::GraphQLType<#scalar>>::name(info) { - Some(name) => { + ::core::option::Option::Some(name) => { if type_name == name { let fut = ::juniper::futures::future::ready({ #expr }); return #resolving_code; } } - None => return ::juniper::macros::helper::err_unnamed_type_fut(#ty_name), + ::core::option::Option::None => return ::juniper::macros::helper::err_unnamed_type_fut(#ty_name), } } } diff --git a/juniper_codegen/src/scalar_value/mod.rs b/juniper_codegen/src/scalar_value/mod.rs index e0a0d78b5..97294df92 100644 --- a/juniper_codegen/src/scalar_value/mod.rs +++ b/juniper_codegen/src/scalar_value/mod.rs @@ -250,46 +250,46 @@ impl Definition { let methods = [ ( Method::AsInt, - quote! { fn as_int(&self) -> Option }, - quote! { i32::from(*v) }, + quote! { fn as_int(&self) -> ::core::option::Option<::core::primitive::i32> }, + quote! { ::core::primitive::i32::from(*v) }, ), ( Method::AsFloat, - quote! { fn as_float(&self) -> Option }, - quote! { f64::from(*v) }, + quote! { fn as_float(&self) -> ::core::option::Option<::core::primitive::f64> }, + quote! { ::core::primitive::f64::from(*v) }, ), ( Method::AsStr, - quote! { fn as_str(&self) -> Option<&str> }, + quote! { fn as_str(&self) -> ::core::option::Option<&::core::primitive::str> }, quote! { ::std::convert::AsRef::as_ref(v) }, ), ( Method::AsString, - quote! { fn as_string(&self) -> Option }, + quote! { fn as_string(&self) -> ::core::option::Option<::std::string::String> }, quote! { ::std::string::ToString::to_string(v) }, ), ( Method::IntoString, - quote! { fn into_string(self) -> Option }, + quote! { fn into_string(self) -> ::core::option::Option<::std::string::String> }, quote! { ::std::string::String::from(v) }, ), ( Method::AsBool, - quote! { fn as_bool(&self) -> Option }, - quote! { bool::from(*v) }, + quote! { fn as_bool(&self) -> ::core::option::Option<::core::primitive::bool> }, + quote! { ::core::primitive::bool::from(*v) }, ), ]; let methods = methods.iter().map(|(m, sig, def)| { let arms = self.methods.get(m).into_iter().flatten().map(|v| { let arm = v.match_arm(); let call = v.expr.as_ref().map_or(def.clone(), |f| quote! { #f(v) }); - quote! { #arm => Some(#call), } + quote! { #arm => ::core::option::Option::Some(#call), } }); quote! { #sig { match self { #(#arms)* - _ => None, + _ => ::core::option::Option::None, } } } @@ -341,28 +341,28 @@ impl Definition { } #[automatically_derived] - impl #impl_gen ::std::convert::From<#ty_ident #ty_gen> for Option<#var_ty> + impl #impl_gen ::std::convert::From<#ty_ident #ty_gen> for ::core::option::Option<#var_ty> #where_clause { fn from(ty: #ty_ident #ty_gen) -> Self { if let #ty_ident::#var_ident #var_field = ty { - Some(v) + ::core::option::Option::Some(v) } else { - None + ::core::option::Option::None } } } #[automatically_derived] impl #lf_impl_gen ::std::convert::From<&'___a #ty_ident #ty_gen> for - Option<&'___a #var_ty> + ::core::option::Option<&'___a #var_ty> #where_clause { fn from(ty: &'___a #ty_ident #ty_gen) -> Self { if let #ty_ident::#var_ident #var_field = ty { - Some(v) + ::core::option::Option::Some(v) } else { - None + ::core::option::Option::None } } } diff --git a/tests/codegen/pass/local_results.rs b/tests/codegen/pass/local_results.rs new file mode 100644 index 000000000..ab3026ecd --- /dev/null +++ b/tests/codegen/pass/local_results.rs @@ -0,0 +1,12 @@ +// Local types overriding the stdlib Result should not affect generated code + +type Result = std::result::Result; + +#[derive(juniper::GraphQLInputObject)] +#[graphql(name = "UserInformation")] +pub struct Update { + pub email: Option, + pub username: Option, +} + +pub fn main() {} diff --git a/tests/codegen/pass/local_send.rs b/tests/codegen/pass/local_send.rs new file mode 100644 index 000000000..2d07b2d05 --- /dev/null +++ b/tests/codegen/pass/local_send.rs @@ -0,0 +1,12 @@ +// Local types overriding the stdlib Send should not affect generated code + +trait Send {} + +#[derive(juniper::GraphQLInputObject)] +#[graphql(name = "UserInformation")] +pub struct Update { + pub email: Option, + pub username: Option, +} + +pub fn main() {} diff --git a/tests/codegen/src/lib.rs b/tests/codegen/src/lib.rs index abdcf2032..f497321ad 100644 --- a/tests/codegen/src/lib.rs +++ b/tests/codegen/src/lib.rs @@ -7,3 +7,10 @@ fn test_failing_compilation() { let t = trybuild::TestCases::new(); t.compile_fail("fail/**/*.rs"); } + +#[rustversion::nightly] +#[test] +fn test_passing_compilation() { + let t = trybuild::TestCases::new(); + t.pass("pass/**/*.rs"); +}