summaryrefslogtreecommitdiff
path: root/tests/full/main.rs
blob: 95a1f60396213abc4c4fe31d0328806eb1750cda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use std::error::Error;

use chomp::{
    chomp::{
        ast::substitute::Reduce,
        typed::{
            context::Context,
            lower::{Backend, GenerateCode},
            TypeInfer,
        },
        visit::Visitable,
    },
    lower::RustBackend,
    nibble::{
        convert::{self, Convert},
        Statement,
    },
};
use proc_macro2::{Span, TokenStream};

fn chomp(input: &str) -> Result<TokenStream, Box<dyn Error>> {
    syn::parse_str::<Statement>(&input)
        .map_err(|e| Box::new(e) as Box<dyn Error>)
        .and_then(|nibble: Statement| {
            nibble
                .convert(&mut convert::Context::default())
                .map_err(|e| Box::new(e) as Box<dyn Error>)
        })
        .and_then(|expr| {
            expr.fold(&mut Reduce)
                .map_err(|e| Box::new(e) as Box<dyn Error>)
        })
        .and_then(|term| {
            let mut context = Context::default();
            term.fold(&mut TypeInfer {
                context: &mut context,
            })
            .map_err(|e| Box::new(e) as Box<dyn Error>)
        })
        .map(|typed| {
            let mut backend = RustBackend::default();
            let id = typed.gen(&mut backend);
            backend.emit_code(None, Span::call_site(), id)
        })
}

macro_rules! compile {
    ($name:ident, $file:literal) => {
        #[test]
        fn $name() {
            let input = include_str!($file);
            chomp(input).unwrap();
        }
    };
}

compile!(compile_sheep, "nibble/sheep.nb");
compile!(compile_ratata, "nibble/ratata.nb");
compile!(compile_regex, "nibble/regex.nb");
compile!(compile_regex_fix, "nibble/regex_fix.nb");
compile!(compile_nibble, "nibble/nibble_exp.nb");