#key-value #compiler #plugin #write #pair #spans #easier

easy-plugin

A compiler plugin that makes it easier to write compiler plugins

42 releases (10 breaking)

Uses old Rust 2015

0.11.8 Jan 19, 2017
0.11.6 Dec 20, 2016
0.11.4 Nov 3, 2016
0.8.0 Jul 29, 2016
0.1.1 Nov 15, 2015

#847 in Development tools


Used in crustacean-plugin

Apache-2.0

25KB
260 lines

easy-plugin

crates.io Travis CI

A compiler plugin that makes it easier to write compiler plugins.

Released under the Apache License 2.0.

Supported Configurations

By default, easy-plugin expects to be compiled by a nightly Rust compiler. easy-plugin is also supported on the stable and beta channels of Rust with syntex. To enable this support, enable the stable Cargo feature.

Note: If the syntex crate is not in sync with the latest nightly, you may not be able to use the latest version of this crate on the stable or beta Rust channels.

Example

The following usage of easy_plugin! defines a plugin which accepts key-value pairs.

easy_plugin! {
    // A key can either be an identifier or a string literal.
    enum Key {
        Ident { $key:ident },
        Lit { $key:lit_str },
    }

    // A key-value pair is a key followed by `=>` and any expression.
    struct KeyValuePair {
        $key:$Key => $value:expr
    }

    // This plugin accepts one or more comma-separated key-value pairs.
    struct Arguments {
        $($kvp:$KeyValuePair), + $(,)?
    }

    pub fn expand_kvp(
        _: &mut ExtCtxt, span: Span, arguments: Arguments
    ) -> PluginResult<Box<MacResult>> {
        for KeyValuePair { key, value } in arguments.kvp {
            match key {
                Key::Ident { key } => println!("Key:   {}", key.node),
                Key::Lit { key } => println!("Key:   {:?}", key.0),
            }
            println!("Value: {}", pprust::expr_to_string(&value));
        }
        Ok(DummyResult::any(span))
    }
}

#[plugin_registrar]
pub fn plugin_registrar(registry: &mut Registry) {
    registry.register_macro("kvp", expand_kvp);
}

Dependencies

~0–1MB
~19K SLoC