#![recursion_limit = "256"]
#[macro_use]
extern crate quote;
use proc_macro::TokenStream;
macro_rules! parse_quote {
($($inp:tt)*) => {
{
let tt = quote!{$($inp)*};
syn::parse2(tt.clone()).unwrap_or_else(|err| {
panic!("failed to parse `{}` at {}:{}:{}: {}", tt, file!(), line!(), column!(), err)
})
}
}
}
macro_rules! parse_macro_input {
($tokenstream:ident as $ty:ty) => {
match syn::parse::<$ty>($tokenstream.clone()) {
Ok(data) => data,
Err(err) => {
return $crate::token_stream_with_error($tokenstream, err);
}
}
};
}
mod accumulator;
mod db;
mod db_lifetime;
mod debug;
mod fn_util;
mod hygiene;
mod input;
mod interned;
mod options;
mod salsa_struct;
mod supertype;
mod tracked;
mod tracked_fn;
mod tracked_impl;
mod tracked_struct;
mod update;
mod xform;
#[proc_macro_attribute]
pub fn accumulator(args: TokenStream, input: TokenStream) -> TokenStream {
accumulator::accumulator(args, input)
}
#[proc_macro_attribute]
pub fn db(args: TokenStream, input: TokenStream) -> TokenStream {
db::db(args, input)
}
#[proc_macro_attribute]
pub fn interned(args: TokenStream, input: TokenStream) -> TokenStream {
interned::interned(args, input)
}
#[proc_macro_derive(Supertype)]
pub fn supertype(input: TokenStream) -> TokenStream {
supertype::supertype(input)
}
#[proc_macro_attribute]
pub fn input(args: TokenStream, input: TokenStream) -> TokenStream {
input::input(args, input)
}
#[proc_macro_attribute]
pub fn tracked(args: TokenStream, input: TokenStream) -> TokenStream {
tracked::tracked(args, input)
}
#[proc_macro_derive(Update, attributes(update))]
pub fn update(input: TokenStream) -> TokenStream {
let item = parse_macro_input!(input as syn::DeriveInput);
match update::update_derive(item) {
Ok(tokens) => tokens.into(),
Err(error) => error.into_compile_error().into(),
}
}
pub(crate) fn token_stream_with_error(mut tokens: TokenStream, error: syn::Error) -> TokenStream {
tokens.extend(TokenStream::from(error.into_compile_error()));
tokens
}
mod kw {
syn::custom_keyword!(with);
syn::custom_keyword!(maybe_update);
}