#![doc(html_root_url = "https://docs.rs/proc_assertions/0.1.1")]
#![doc(
html_logo_url = "https://raw.githubusercontent.com/anton-mel/proc-assertions/main/static/proc_assertions_logo.png"
)]
#![deny(missing_docs)]
extern crate quote;
extern crate proc_macro;
extern crate syn;
mod parser;
mod macros;
use parser::whitelist;
use parser::field_whitelist;
use macros::private_fields;
use macros::size_align;
use macros::consumes;
use macros::mutates;
use macros::calls;
use proc_macro::TokenStream;
use syn::{
parse_macro_input, DeriveInput,
ItemStruct, ItemFn};
#[proc_macro_attribute]
pub fn private_fields(attr: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as ItemStruct);
let fields = parse_macro_input!(attr as whitelist::WhitelistArgs);
private_fields::assert_private_fields_impl(&fields.values, input).into()
}
#[proc_macro_attribute]
pub fn assert_align_size(attr: TokenStream, item: TokenStream) -> TokenStream {
let size_align = parse_macro_input!(attr as size_align::SizeAlign);
let size_align::SizeAlign { size, align } = size_align;
let input = parse_macro_input!(item as DeriveInput);
size_align::assert_align_size_impl(size, align, &input).into()
}
#[proc_macro_attribute]
pub fn consumes(attr: TokenStream, item: TokenStream) -> TokenStream {
let types = parse_macro_input!(attr as whitelist::WhitelistArgs);
let input = parse_macro_input!(item as ItemFn);
consumes::assert_function_consumes_impl(&types.values, input).into()
}
#[proc_macro_attribute]
pub fn calls(attr: TokenStream, item: TokenStream) -> TokenStream {
let whitelist = parse_macro_input!(attr as whitelist::WhitelistArgs);
let input = parse_macro_input!(item as ItemFn);
calls::assert_call_impl(&whitelist.values, &input).into()
}
#[proc_macro_attribute]
pub fn mutates(attr: TokenStream, item: TokenStream) -> TokenStream {
let macro_data = parse_macro_input!(attr as field_whitelist::WhitelistArgs);
let input = parse_macro_input!(item as ItemFn);
mutates::assert_mutate_impl(¯o_data, &input, false).into()
}
#[proc_macro_attribute]
pub fn nomutates(attr: TokenStream, item: TokenStream) -> TokenStream {
let macro_data = parse_macro_input!(attr as field_whitelist::WhitelistArgs);
let input = parse_macro_input!(item as ItemFn);
mutates::assert_mutate_impl(¯o_data, &input, true).into()
}