Parsing tokens
In the previous exercise, both #[vanilla_test] and the default #[test] macro had to be specified on top of
the test function. Without adding #[test], the annotated function is not picked up by the test runner.
Detecting existing attributes
You'll augment #[vanilla_test]:
- If the annotated function has been annotated with
#[test], it should emit the code unchanged. - If the annotated function has not been annotated with
#[test], it should add#[test]to the function.
This is how #[googletest::gtest] works, for example.
The toolkit
When the macro game is serious, you can't get by using the built-in proc_macro crate.
Almost all macros written in Rust are built on top of three ecosystem crates:
synfor parsing tokens into abstract syntax tree nodes (AST node)quotefor expressing the generated code with aprintln!-style syntaxproc-macro2, a wrapper aroundproc_macro's types
Exercise
The exercise for this section is located in 08_macros/02_test