diff --git a/src/lib.rs b/src/lib.rs index 7e5c347..fbbec80 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -246,10 +246,7 @@ mod utils; use syn::{parse_macro_input, ItemFn}; -use crate::parse::{ - fixture::{FixtureInfo, ReplaceFutureAttribute}, - rstest::RsTestInfo, -}; +use crate::parse::{fixture::FixtureInfo, future::ReplaceFutureAttribute, rstest::RsTestInfo}; use parse::ExtendWithFunctionAttrs; use quote::ToTokens; diff --git a/src/parse/fixture.rs b/src/parse/fixture.rs index 01e33a6..e76fd53 100644 --- a/src/parse/fixture.rs +++ b/src/parse/fixture.rs @@ -1,5 +1,3 @@ -use std::mem; - /// `fixture`'s related data and parsing use syn::{ parse::{Parse, ParseStream}, @@ -101,41 +99,6 @@ impl VisitMut for FixturesFunctionExtractor { } } -#[derive(Default)] -pub(crate) struct ReplaceFutureAttribute(Vec); - -impl ReplaceFutureAttribute { - pub(crate) fn replace(item_fn: &mut ItemFn) -> Result<(), ErrorsVec> { - let mut visitor = Self::default(); - visitor.visit_item_fn_mut(item_fn); - if visitor.0.is_empty() { - Ok(()) - } else { - Err(visitor.0.into()) - } - } -} - -impl VisitMut for ReplaceFutureAttribute { - fn visit_fn_arg_mut(&mut self, node: &mut FnArg) { - match node { - FnArg::Typed(t) => { - let attrs = mem::take(&mut t.attrs); - let (futures, attrs): (Vec<_>, Vec<_>) = - attrs.into_iter().partition(|a| attr_is(a, "future")); - if futures.len() > 0 { - let ty = &t.ty; - t.ty = parse_quote! { - impl std::future::Future - } - } - t.attrs = attrs; - } - FnArg::Receiver(_) => {} - } - } -} - /// Simple struct used to visit function attributes and extract fixture default values info and /// eventualy parsing errors #[derive(Default)] diff --git a/src/parse/future.rs b/src/parse/future.rs new file mode 100644 index 0000000..2e05a13 --- /dev/null +++ b/src/parse/future.rs @@ -0,0 +1,38 @@ +use syn::{parse_quote, visit_mut::VisitMut, FnArg, ItemFn}; + +use crate::{error::ErrorsVec, utils::attr_is}; + +#[derive(Default)] +pub(crate) struct ReplaceFutureAttribute(Vec); + +impl ReplaceFutureAttribute { + pub(crate) fn replace(item_fn: &mut ItemFn) -> Result<(), ErrorsVec> { + let mut visitor = Self::default(); + visitor.visit_item_fn_mut(item_fn); + if visitor.0.is_empty() { + Ok(()) + } else { + Err(visitor.0.into()) + } + } +} + +impl VisitMut for ReplaceFutureAttribute { + fn visit_fn_arg_mut(&mut self, node: &mut FnArg) { + match node { + FnArg::Typed(t) => { + let attrs = std::mem::take(&mut t.attrs); + let (futures, attrs): (Vec<_>, Vec<_>) = + attrs.into_iter().partition(|a| attr_is(a, "future")); + if futures.len() > 0 { + let ty = &t.ty; + t.ty = parse_quote! { + impl std::future::Future + } + } + t.attrs = attrs; + } + FnArg::Receiver(_) => {} + } + } +} diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 3e00618..ed9247d 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -30,6 +30,7 @@ pub(crate) mod fixture; pub(crate) mod rstest; pub(crate) mod testcase; pub(crate) mod vlist; +pub(crate) mod future; pub(crate) trait ExtendWithFunctionAttrs { fn extend_with_function_attrs(