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

easy-plugin

一个使编写编译器插件更加容易的编译器插件。

42 个版本 (10 个重大更改)

使用旧 Rust 2015

0.11.8 2017年1月19日
0.11.6 2016年12月20日
0.11.4 2016年11月3日
0.8.0 2016年7月29日
0.1.1 2015年11月15日

#847开发工具


被用于 crustacean-plugin

Apache-2.0 许可协议

25KB
260 代码行

easy-plugin

crates.io Travis CI

一个使编写编译器插件更加容易的编译器插件。

在 Apache License 2.0 许可协议下发布。

支持配置

  • Nightly Rust 频道 (文档)
  • 稳定和 beta Rust 频道 (文档)

默认情况下,easy-plugin 需要使用 nightly Rust 编译器进行编译。 easy-plugin 也支持 Rust 的稳定和 beta 频道,使用 syntex。要启用此支持,请启用 stable Cargo 功能。

注意: 如果 syntex crate 与最新 nightly 版本不一致,您可能无法在稳定或 beta Rust 频道上使用此 crate 的最新版本。

示例

以下使用 easy_plugin! 的示例定义了一个接受键值对的插件。

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);
}

依赖项

~0–1MB
~19K SLoC