kobold_macros 0.5.0

Macros for Kobold
Documentation
use std::fmt::{self, Debug};

use proc_macro::{Group, Span, TokenStream, TokenTree};

use crate::dom::Node;
use crate::tokenize::prelude::*;

pub struct Expression {
    pub stream: TokenStream,
    pub span: Span,
}

impl Debug for Expression {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        fmt::Display::fmt(&self.stream, f)
    }
}

impl From<Expression> for Node {
    fn from(expr: Expression) -> Node {
        Node::Expression(expr)
    }
}

impl From<TokenTree> for Expression {
    fn from(tt: TokenTree) -> Self {
        if let TokenTree::Group(group) = tt {
            return Expression::from(group);
        }

        let span = tt.span();
        let stream = tt.tokenize();

        Expression { stream, span }
    }
}

impl From<Group> for Expression {
    fn from(group: Group) -> Self {
        Expression {
            stream: group.stream(),
            span: group.span(),
        }
    }
}

impl From<&str> for Expression {
    fn from(code: &str) -> Self {
        Expression {
            stream: code.tokenize(),
            span: Span::call_site(),
        }
    }
}