Allow taking an Arc<Deterministic> in [gpui::test]-decorated tests

This commit is contained in:
Antonio Scandurra 2022-04-11 10:58:57 +02:00
parent 28f44a3252
commit bb8dc6120b

View file

@ -75,23 +75,37 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
match last_segment.map(|s| s.ident.to_string()).as_deref() { match last_segment.map(|s| s.ident.to_string()).as_deref() {
Some("StdRng") => { Some("StdRng") => {
inner_fn_args.extend(quote!(rand::SeedableRng::seed_from_u64(seed),)); inner_fn_args.extend(quote!(rand::SeedableRng::seed_from_u64(seed),));
continue;
} }
Some("bool") => { Some("bool") => {
inner_fn_args.extend(quote!(is_last_iteration,)); inner_fn_args.extend(quote!(is_last_iteration,));
continue;
} }
_ => { Some("Arc") => {
return TokenStream::from( if let syn::PathArguments::AngleBracketed(args) =
syn::Error::new_spanned(arg, "invalid argument") &last_segment.unwrap().arguments
.into_compile_error(), {
) if let Some(syn::GenericArgument::Type(syn::Type::Path(ty))) =
args.args.last()
{
let last_segment = ty.path.segments.last();
if let Some("Deterministic") =
last_segment.map(|s| s.ident.to_string()).as_deref()
{
inner_fn_args.extend(quote!(deterministic.clone(),));
continue;
} }
} }
}
}
_ => {}
}
} else if let Type::Reference(ty) = &*arg.ty { } else if let Type::Reference(ty) = &*arg.ty {
match &*ty.elem { if let Type::Path(ty) = &*ty.elem {
Type::Path(ty) => {
let last_segment = ty.path.segments.last(); let last_segment = ty.path.segments.last();
match last_segment.map(|s| s.ident.to_string()).as_deref() { if let Some("TestAppContext") =
Some("TestAppContext") => { last_segment.map(|s| s.ident.to_string()).as_deref()
{
let first_entity_id = ix * 100_000; let first_entity_id = ix * 100_000;
let cx_varname = format_ident!("cx_{}", ix); let cx_varname = format_ident!("cx_{}", ix);
cx_vars.extend(quote!( cx_vars.extend(quote!(
@ -111,33 +125,16 @@ pub fn test(args: TokenStream, function: TokenStream) -> TokenStream {
#cx_varname.update(|_| {}); // flush effects #cx_varname.update(|_| {}); // flush effects
)); ));
inner_fn_args.extend(quote!(&mut #cx_varname,)); inner_fn_args.extend(quote!(&mut #cx_varname,));
} continue;
_ => {
return TokenStream::from(
syn::Error::new_spanned(arg, "invalid argument")
.into_compile_error(),
)
} }
} }
} }
_ => {
return TokenStream::from(
syn::Error::new_spanned(arg, "invalid argument")
.into_compile_error(),
)
} }
}
} else {
return TokenStream::from( return TokenStream::from(
syn::Error::new_spanned(arg, "invalid argument").into_compile_error(), syn::Error::new_spanned(arg, "invalid argument").into_compile_error(),
); );
} }
} else {
return TokenStream::from(
syn::Error::new_spanned(arg, "invalid argument").into_compile_error(),
);
}
}
parse_quote! { parse_quote! {
#[test] #[test]