diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-02-01 21:49:12 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2021-02-01 21:49:29 +0100 |
| commit | f9b6a64b845dabdf1773da49f248def479659934 (patch) | |
| tree | f434d4606f5827d393c20712e2a527a9395d6ad7 /tihdy_derive/src | |
| parent | 8089ff61f5ca608e0801e74360203c6fd789b5d7 (diff) | |
| download | sylt-f9b6a64b845dabdf1773da49f248def479659934.tar.gz | |
tihdy -> sylt
Diffstat (limited to 'tihdy_derive/src')
| -rw-r--r-- | tihdy_derive/src/lib.rs | 87 |
1 files changed, 0 insertions, 87 deletions
diff --git a/tihdy_derive/src/lib.rs b/tihdy_derive/src/lib.rs deleted file mode 100644 index c0806ab..0000000 --- a/tihdy_derive/src/lib.rs +++ /dev/null @@ -1,87 +0,0 @@ -use proc_macro::TokenStream; -use quote::quote; -use syn::{Expr, Pat, Token, parse::{Parse, ParseStream, Result}, parse_macro_input}; - -struct ExternBlock { - pattern: Pat, - _arrow: Token![->], - return_ty: Expr, - _fat_arrow: Token![=>], - block: Expr, - _comma: Token![,], -} - -struct ExternFunction { - function: syn::Ident, - blocks: Vec<ExternBlock> -} - -impl Parse for ExternBlock { - fn parse(input: ParseStream) -> Result<Self> { - Ok(Self { - pattern: input.parse()?, - _arrow: input.parse()?, - return_ty: input.parse()?, - _fat_arrow: input.parse()?, - block: input.parse()?, - _comma: input.parse()?, - }) - } -} - -impl Parse for ExternFunction { - fn parse(input: ParseStream) -> Result<Self> { - let mut res = Self { - function: input.parse()?, - blocks: Vec::new(), - }; - while !input.is_empty() { - res.blocks.push(input.parse()?); - } - Ok(res) - } -} - -#[proc_macro] -pub fn extern_function(tokens: TokenStream) -> TokenStream { - let parsed: ExternFunction = parse_macro_input!(tokens); - let function = parsed.function; - - let typecheck_blocks: Vec<_> = parsed.blocks.iter().map(|block| { - let pat = block.pattern.clone(); - let ty = block.return_ty.clone(); - quote! { - #pat => { Ok(#ty.as_value()) } - } - }).collect(); - - let eval_blocks: Vec<_> = parsed.blocks.iter().map(|block| { - let pat = block.pattern.clone(); - let expr = block.block.clone(); - quote! { - #pat => #expr - } - }).collect(); - - let tokens = quote! { - pub fn #function ( - __values: &[tihdy::Value], - __typecheck: bool - ) -> ::std::result::Result<tihdy::Value, tihdy::error::ErrorKind> - { - if __typecheck { - #[allow(unused_variables)] - match __values { - #(#typecheck_blocks),* - _ => Err(tihdy::error::ErrorKind::ExternTypeMismatch(stringify!(#function).to_string(), __values.iter().map(|v| tihdy::Type::from(v)).collect())) - } - } else { - match __values { - #(#eval_blocks),* - _ => Err(tihdy::error::ErrorKind::ExternTypeMismatch(stringify!(#function).to_string(), __values.iter().map(|v| tihdy::Type::from(v)).collect())) - } - } - } - }; - TokenStream::from(tokens) -} |
