Macro syn::parse_quote

source ·
macro_rules! parse_quote {
    ($($tt:tt)*) => { ... };
}
Expand description

Quasi-quotation macro that accepts input like the quote! macro but uses type inference to figure out a return type for those tokens.

The return type can be any syntax tree node that implements the Parse trait.

use quote::quote;
use syn::{parse_quote, Stmt};

fn main() {
    let name = quote!(v);
    let ty = quote!(u8);

    let stmt: Stmt = parse_quote! {
        let #name: #ty = Default::default();
    };

    println!("{:#?}", stmt);
}

This macro is available only if Syn is built with both the "parsing" and "printing" features.

Example

The following helper function adds a bound T: HeapSize to every type parameter T in the input generics.

use syn::{parse_quote, Generics, GenericParam};

// Add a bound `T: HeapSize` to every type parameter T.
fn add_trait_bounds(mut generics: Generics) -> Generics {
    for param in &mut generics.params {
        if let GenericParam::Type(type_param) = param {
            type_param.bounds.push(parse_quote!(HeapSize));
        }
    }
    generics
}

Special cases

This macro can parse the following additional types as a special case even though they do not implement the Parse trait.

  • Attribute — parses one attribute, allowing either outer like #[...] or inner like #![...]
  • Punctuated<T, P> — parses zero or more T separated by punctuation P with optional trailing punctuation
  • Vec<Stmt> — parses the same as Block::parse_within

Panics

Panics if the tokens fail to parse as the expected syntax tree type. The caller is responsible for ensuring that the input tokens are syntactically valid.