44 lines
976 B
Rust
44 lines
976 B
Rust
use std::borrow::Cow;
|
|
use std::rc::Rc;
|
|
|
|
use never::Never;
|
|
use orchid_base::interner::Tok;
|
|
use orchid_base::name::Sym;
|
|
use orchid_extension::atom::Atomic;
|
|
use orchid_extension::atom_owned::{OwnedAtom, OwnedVariant};
|
|
use orchid_extension::context::i;
|
|
|
|
use crate::macros::mactree::MacTreeSeq;
|
|
use crate::macros::rule::matcher::Matcher;
|
|
|
|
#[derive(Debug)]
|
|
pub struct MacroData {
|
|
pub module: Sym,
|
|
pub prio: Option<u64>,
|
|
pub rules: Vec<Rule>,
|
|
}
|
|
|
|
#[derive(Clone, Debug)]
|
|
pub struct Macro(pub Rc<MacroData>);
|
|
impl Macro {
|
|
pub async fn canonical_name(&self) -> Sym {
|
|
self.0.module.suffix([self.0.rules[0].body_name.clone()], &i()).await
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct Rule {
|
|
pub pattern: MacTreeSeq,
|
|
pub matcher: Matcher,
|
|
pub placeholders: Vec<Tok<String>>,
|
|
pub body_name: Tok<String>,
|
|
}
|
|
impl Atomic for Macro {
|
|
type Data = ();
|
|
type Variant = OwnedVariant;
|
|
}
|
|
impl OwnedAtom for Macro {
|
|
type Refs = Never;
|
|
async fn val(&self) -> Cow<'_, Self::Data> { Cow::Owned(()) }
|
|
}
|