blob: 36c6ad75117ac49e3364429f8770363478a5fde3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
#![deny(clippy::all, clippy::pedantic)]
use proc_macro::TokenStream;
use proc_macro_error::{proc_macro_error, ResultExt};
use quote::{format_ident, quote};
use syn::{parse, ImplItem};
use crate::expectation::Expectation;
use crate::mock::Mock;
use crate::mock_input::MockInput;
mod expectation;
mod mock;
mod mock_input;
mod syn_ext;
mod util;
#[proc_macro]
#[proc_macro_error]
pub fn mock(input_stream: TokenStream) -> TokenStream
{
let input = parse::<MockInput>(input_stream.clone()).unwrap_or_abort();
let mock_ident = input.mock;
let mock_mod_ident = format_ident!("__{mock_ident}");
let method_items = input
.item_impl
.items
.into_iter()
.filter_map(|item| match item {
ImplItem::Method(item_method) => Some(item_method),
_ => None,
})
.collect::<Vec<_>>();
let mock = Mock::new(mock_ident.clone(), input.mocked_trait, &method_items);
let expectations = method_items
.iter()
.map(|item_method| Expectation::new(&mock_ident, item_method));
quote! {
mod #mock_mod_ident {
use super::*;
#mock
#(#expectations)*
}
use #mock_mod_ident::#mock_ident;
}
.into()
}
|