#![warn(missing_docs)]
mod codegen;
mod kernel_ir;
mod lower;
mod parse;
use proc_macro::TokenStream;
use proc_macro2::TokenStream as TokenStream2;
use syn::ItemFn;
use parse::attrs::parse_kernel_config;
use parse::body::parse_body;
use parse::signature::parse_kernel_signature;
#[proc_macro_attribute]
pub fn gpu_kernel(attr: TokenStream, item: TokenStream) -> TokenStream {
match gpu_kernel_impl(attr.into(), item.into()) {
Ok(tokens) => tokens.into(),
Err(err) => err.to_compile_error().into(),
}
}
fn gpu_kernel_impl(attr: TokenStream2, item: TokenStream2) -> syn::Result<TokenStream2> {
let func: ItemFn = syn::parse2(item)?;
let config = parse_kernel_config(attr)?;
let sig = parse_kernel_signature(&func, config)?;
let body = parse_body(&func.block)?;
codegen::generate_kernel_module(&sig, &body)
}