Skip to main content

ekege_macros/
lib.rs

1#![allow(missing_docs)]
2//! Procedural macros to be re-exported in [Ekege](https://docs.rs/ekege/).
3//!
4//! Due to some Rustdoc limitations, the documentation for the macros defined here is
5//! in the Ekege crate.
6//!
7//! <div class="warning">
8//!     This crate should not be used directly! It is highly recommended that you
9//!     use the macros from Ekege directly instead.
10//! </div>
11use std::{env, sync::LazyLock};
12
13use equivalence::Equivalence;
14use map::MapSignature;
15use proc_macro_crate::{FoundCrate, crate_name};
16use proc_macro2::Span;
17use quote::{ToTokens, TokenStreamExt, quote};
18use rewrite::Rewrite;
19use rule::TreeRule;
20use syn::{Ident, parse_macro_input};
21use term::TreeTerm;
22
23mod equivalence;
24mod map;
25mod rewrite;
26mod rule;
27mod term;
28
29pub(crate) struct CrateRoot {
30    root: LazyLock<String>,
31}
32
33impl ToTokens for CrateRoot {
34    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
35        let crate_root = Ident::new(&self.root, Span::call_site());
36
37        tokens.append_all(quote! { ::#crate_root });
38    }
39}
40
41pub(crate) static CRATE_ROOT: CrateRoot = CrateRoot {
42    root: LazyLock::new(|| {
43        if env::var("CARGO_PKG_NAME").unwrap() == "ekege" {
44            String::from("ekege")
45        } else if let FoundCrate::Name(root_name) =
46            crate_name("ekege").expect("proc-macro-crate could not detect ekege")
47        {
48            root_name
49        } else {
50            unreachable!()
51        }
52    }),
53};
54
55#[proc_macro]
56pub fn term(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
57    let input = parse_macro_input!(tokens as TreeTerm);
58
59    proc_macro::TokenStream::from(input.to_token_stream())
60}
61
62#[proc_macro]
63pub fn map_signature(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
64    let input = parse_macro_input!(tokens as MapSignature);
65
66    proc_macro::TokenStream::from(input.to_token_stream())
67}
68
69#[proc_macro]
70pub fn rule(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
71    let input = parse_macro_input!(tokens as TreeRule);
72
73    proc_macro::TokenStream::from(input.to_token_stream())
74}
75
76#[proc_macro]
77pub fn rewrite(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
78    let input = parse_macro_input!(tokens as Rewrite);
79
80    proc_macro::TokenStream::from(input.to_token_stream())
81}
82
83#[proc_macro]
84pub fn equivalence(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
85    let input = parse_macro_input!(tokens as Equivalence);
86
87    proc_macro::TokenStream::from(input.to_token_stream())
88}