Skip to content

Commit aa7bdb5

Browse files
committed
Uses syn to parse integration test body
1 parent d269277 commit aa7bdb5

File tree

2 files changed

+16
-63
lines changed

2 files changed

+16
-63
lines changed

testing-macros/src/lib.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use self::qemu::parse_qemu_attribute;
22
use proc_macro::TokenStream;
3-
use syn::Error;
3+
use syn::{parse_macro_input, Error, ItemFn};
44

55
mod qemu;
66

@@ -10,7 +10,9 @@ mod qemu;
1010
/// must put everything that are needed within this function.
1111
#[proc_macro_attribute]
1212
pub fn qemu(_: TokenStream, item: TokenStream) -> TokenStream {
13-
parse_qemu_attribute(item.into())
13+
let item = parse_macro_input!(item as ItemFn);
14+
15+
parse_qemu_attribute(item)
1416
.unwrap_or_else(Error::into_compile_error)
1517
.into()
1618
}

testing-macros/src/qemu.rs

+12-61
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,21 @@
1-
use proc_macro2::{Delimiter, Group, Span, TokenStream, TokenTree};
2-
use quote::quote_spanned;
1+
use proc_macro2::{Span, TokenStream};
2+
use quote::ToTokens;
33
use serde::{Deserialize, Serialize};
44
use std::collections::HashMap;
55
use std::env::VarError;
66
use std::fmt::Write;
77
use std::fs::create_dir_all;
88
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};
4810

11+
pub fn parse_qemu_attribute(mut item: ItemFn) -> Result<TokenStream, Error> {
4912
// Get path for the integration test data.
50-
let item = body.unwrap();
5113
let root = match std::env::var("CARGO_TARGET_TMPDIR") {
5214
Ok(v) => PathBuf::from(v),
5315
Err(e) => match e {
5416
VarError::NotPresent => {
5517
// 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());
5919
}
6020
VarError::NotUnicode(_) => {
6121
return Err(Error::new(
@@ -67,21 +27,19 @@ pub fn parse_qemu_attribute(item: TokenStream) -> Result<TokenStream, Error> {
6727
};
6828

6929
// 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();
7232

73-
generate_test(root.join("project"), &name, &span.source_text().unwrap())?;
33+
generate_test(root.join("project"), &name, &body)?;
7434

7535
// Construct a new body.
7636
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-
);
8137

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+
}));
8341

84-
Ok(TokenStream::from_iter(output))
42+
Ok(item.into_token_stream())
8543
}
8644

8745
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
223181
Ok(())
224182
}
225183

226-
enum State {
227-
Start,
228-
Fn,
229-
FnName,
230-
Params,
231-
}
232-
233184
#[derive(Serialize, Deserialize)]
234185
struct Cargo {
235186
package: Option<Package>,

0 commit comments

Comments
 (0)