# 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 the `"parsing"` feature, although interpolation of syntax tree nodes into the quoted tokens is only supported if Syn is built with the `"printing"` feature as well.

## 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.