Release 0.6.0
2 files changed
tree: ab8d70cc50742965b195d521a9e85dbdd43e1221
  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

// lib.rs
#![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()
}
# Cargo.toml
# ...
[dependencies]
syn = "0.5"
quote = "0.1"

[lib]
rustc-macro = true

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.