1#![feature(proc_macro_diagnostic)]
8#![allow(
9 clippy::empty_enum,
10 clippy::from_iter_instead_of_collect,
11 clippy::match_same_arms,
12 clippy::module_name_repetitions,
13 clippy::use_self,
14 clippy::wildcard_imports
15)]
16
17extern crate proc_macro;
18
19mod ast;
20mod cursor;
21mod error;
22mod sexpr;
23mod span;
24mod token;
25
26mod parse {
27 #![allow(clippy::all, clippy::pedantic)]
28
29 include!(concat!(env!("OUT_DIR"), "/parse.rs"));
30}
31
32use crate::cursor::Cursor;
33use crate::error::NoUserError;
34use crate::parse::{ExprParser, TypeParser};
35use crate::span::Span;
36use crate::token::Token;
37use lalrpop_util::ParseError;
38use proc_macro::{Delimiter, Group, Literal, TokenStream, TokenTree};
39
40#[proc_macro]
41pub fn s_type(input: TokenStream) -> TokenStream {
42 match TypeParser::new().parse(Cursor::new(input)) {
43 Ok(t) => string_literal(&t.to_string()),
44 Err(err) => parse_error(err),
45 }
46}
47
48#[proc_macro]
49pub fn s_expr(input: TokenStream) -> TokenStream {
50 match ExprParser::new().parse(Cursor::new(input)) {
51 Ok(e) => string_literal(&e.to_string()),
52 Err(err) => parse_error(err),
53 }
54}
55
56fn string_literal(s: &str) -> TokenStream {
57 let lit = Literal::string(s);
58 TokenStream::from(TokenTree::Literal(lit))
59}
60
61fn parse_error(err: ParseError<Span, Token, NoUserError>) -> TokenStream {
62 error::emit(err);
63 let group = Group::new(Delimiter::Brace, TokenStream::new());
64 TokenStream::from(TokenTree::Group(group))
65}