Version number in macros 1.1 example
1 file changed
tree: 4ba736f094d304cea9c62a0adbcf18013a604736
  1. src/
  2. tests/
  3. .gitignore
  4. .travis.yml
  5. Cargo.toml
  6. LICENSE-APACHE
  7. LICENSE-MIT
  8. README.md
README.md

Nom parser for Rust items

Build Status Latest Version Rust Documentation

Parse Rust structs and enums without a Syntex dependency, intended for use with Macros 1.1.

Designed for fast compile time.

  • Compile time for syn (from scratch including all dependencies): 4 seconds
  • Compile time for the syntex/quasi/aster stack: 60+ seconds
[dependencies]
syn = "0.6"
extern crate syn;

let raw = "
    #[derive(Debug, Clone, Eq, PartialEq)]
    pub struct Item {
        pub ident: Ident,
        pub vis: Visibility,
        pub attrs: Vec<Attribute>,
        pub generics: Generics,
        pub body: Body,
    }
";

let ast = syn::parse_macro_input(raw).unwrap();

Usage with Macros 1.1

[dependencies]
syn = "0.6"
quote = "0.1"

[lib]
rustc-macro = true
#![crate_type = "rustc-macro"]
#![feature(rustc_macro, rustc_macro_lib)]

extern crate rustc_macro;

#[macro_use]
extern crate quote;
extern crate syn;

use rustc_macro::TokenStream;

#[rustc_macro_derive(SpecialItem)]
pub fn special_item(input: TokenStream) -> TokenStream {
    let source = input.to_string();

    // Parse a string of items to an AST
    let ast = syn::parse_macro_input(&source).unwrap();

    // Build the output, possibly using quasi-quotation
    let expanded = quote! {
        // ...
    };

    // Parse this back to a token stream and return it
    expanded.to_string().parse().unwrap()
}

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.