1
- use proc_macro2:: { Delimiter , Group , Span , TokenStream , TokenTree } ;
2
- use quote:: quote_spanned ;
1
+ use proc_macro2:: { Span , TokenStream } ;
2
+ use quote:: ToTokens ;
3
3
use serde:: { Deserialize , Serialize } ;
4
4
use std:: collections:: HashMap ;
5
5
use std:: env:: VarError ;
6
6
use std:: fmt:: Write ;
7
7
use std:: fs:: create_dir_all;
8
8
use std:: path:: { Path , PathBuf } ;
9
- use syn:: Error ;
10
-
11
- pub fn parse_qemu_attribute ( item : TokenStream ) -> Result < TokenStream , Error > {
12
- // Get the function body.
13
- let mut output = Vec :: new ( ) ;
14
- let mut state = State :: Start ;
15
- let mut name = None ;
16
- let mut body = None ;
17
-
18
- for t in item {
19
- match & state {
20
- State :: Start => match & t {
21
- TokenTree :: Ident ( i) if i == "fn" => state = State :: Fn ,
22
- _ => { }
23
- } ,
24
- State :: Fn => match & t {
25
- TokenTree :: Ident ( i) => {
26
- name = Some ( i. to_string ( ) ) ;
27
- state = State :: FnName ;
28
- }
29
- _ => unreachable ! ( ) ,
30
- } ,
31
- State :: FnName => match & t {
32
- TokenTree :: Group ( g) if g. delimiter ( ) == Delimiter :: Parenthesis => {
33
- state = State :: Params
34
- }
35
- _ => { }
36
- } ,
37
- State :: Params => match t {
38
- TokenTree :: Group ( g) if g. delimiter ( ) == Delimiter :: Brace => {
39
- body = Some ( g) ;
40
- break ;
41
- }
42
- _ => { }
43
- } ,
44
- }
45
-
46
- output. push ( t) ;
47
- }
9
+ use syn:: { parse_quote, Error , ItemFn } ;
48
10
11
+ pub fn parse_qemu_attribute ( mut item : ItemFn ) -> Result < TokenStream , Error > {
49
12
// Get path for the integration test data.
50
- let item = body. unwrap ( ) ;
51
13
let root = match std:: env:: var ( "CARGO_TARGET_TMPDIR" ) {
52
14
Ok ( v) => PathBuf :: from ( v) ,
53
15
Err ( e) => match e {
54
16
VarError :: NotPresent => {
55
17
// We are not running by the integration test, keep the original function body.
56
- output. push ( TokenTree :: Group ( item) ) ;
57
-
58
- return Ok ( TokenStream :: from_iter ( output) ) ;
18
+ return Ok ( item. into_token_stream ( ) ) ;
59
19
}
60
20
VarError :: NotUnicode ( _) => {
61
21
return Err ( Error :: new (
@@ -67,21 +27,19 @@ pub fn parse_qemu_attribute(item: TokenStream) -> Result<TokenStream, Error> {
67
27
} ;
68
28
69
29
// Generate a test project.
70
- let name = name . unwrap ( ) ;
71
- let span = item. span ( ) ;
30
+ let name = item . sig . ident . to_string ( ) ;
31
+ let body = item. block . brace_token . span . join ( ) . source_text ( ) . unwrap ( ) ;
72
32
73
- generate_test ( root. join ( "project" ) , & name, & span . source_text ( ) . unwrap ( ) ) ?;
33
+ generate_test ( root. join ( "project" ) , & name, & body ) ?;
74
34
75
35
// Construct a new body.
76
36
let root = root. to_str ( ) . unwrap ( ) ;
77
- let body = Group :: new (
78
- Delimiter :: Brace ,
79
- quote_spanned ! ( span=> :: zfi_testing:: run_qemu_test( :: std:: path:: Path :: new( #root) ) ; ) ,
80
- ) ;
81
37
82
- output. push ( TokenTree :: Group ( body) ) ;
38
+ item. block = Box :: new ( parse_quote ! ( {
39
+ :: zfi_testing:: run_qemu_test( :: std:: path:: Path :: new( #root) ) ;
40
+ } ) ) ;
83
41
84
- Ok ( TokenStream :: from_iter ( output ) )
42
+ Ok ( item . into_token_stream ( ) )
85
43
}
86
44
87
45
fn generate_test < P : AsRef < Path > > ( dir : P , name : & str , body : & str ) -> Result < ( ) , Error > {
@@ -223,13 +181,6 @@ fn generate_test<P: AsRef<Path>>(dir: P, name: &str, body: &str) -> Result<(), E
223
181
Ok ( ( ) )
224
182
}
225
183
226
- enum State {
227
- Start ,
228
- Fn ,
229
- FnName ,
230
- Params ,
231
- }
232
-
233
184
#[ derive( Serialize , Deserialize ) ]
234
185
struct Cargo {
235
186
package : Option < Package > ,
0 commit comments