easy-plugin 0.6.2

A compiler plugin that makes it easier to write compiler plugins.
use easy_plugin::{PluginResult};

use syntax::codemap::{Span};
use syntax::ext::base::{DummyResult, ExtCtxt, MacResult};

easy_plugin! {
    enum Arguments {
        A { },
        B { [$a:ident $b:ident] },
        C { [$($a:ident $($b:ident)*), +] },
    }

    pub fn expand_enum(
        context: &mut ExtCtxt, span: Span, arguments: Arguments
    ) -> PluginResult<Box<MacResult>> {
        match arguments {
            Arguments::A(_) => { },
            Arguments::B(b) => {
                assert_eq!(b.a.node, context.ident_of("a"));
                assert_eq!(b.b.node, context.ident_of("b"));
            },
            Arguments::C(c) => {
                assert_eq!(c.a.iter().map(|a| a.node).collect::<Vec<_>>(), &[
                    context.ident_of("a"),
                    context.ident_of("b"),
                    context.ident_of("d"),
                ]);
                assert_eq!(c.b.iter().map(|b| {
                    b.iter().map(|b| b.node).collect()
                }).collect::<Vec<Vec<_>>>(), &[
                    vec![],
                    vec![context.ident_of("c")],
                    vec![context.ident_of("e"), context.ident_of("f")],
                ]);
            },
        }
        Ok(DummyResult::any(span))
    }
}

#[test]
fn test_easy_plugin_enum() {
    super::with_tts("", |c, s, a| {
        expand_enum(c, s, a);
    });

    super::with_tts("[a b]", |c, s, a| {
        expand_enum(c, s, a);
    });

    super::with_tts("[a, b c, d e f]", |c, s, a| {
        expand_enum(c, s, a);
    });
}