syn::ext

Trait IdentExt

Source
pub trait IdentExt: Sized + Sealed {
    const peek_any: PeekFn = private::PeekFn;

    // Required methods
    fn parse_any(input: ParseStream<'_>) -> Result<Self>;
    fn unraw(&self) -> Ident;
}
Expand description

Additional methods for Ident not provided by proc-macro2 or libproc_macro.

This trait is sealed and cannot be implemented for types outside of Syn. It is implemented only for proc_macro2::Ident.

Provided Associated Constants§

Source

const peek_any: PeekFn = private::PeekFn

Peeks any identifier including keywords. Usage: input.peek(Ident::peek_any)

This is different from input.peek(Ident) which only returns true in the case of an ident which is not a Rust keyword.

Required Methods§

Source

fn parse_any(input: ParseStream<'_>) -> Result<Self>

Parses any identifier including keywords.

This is useful when parsing macro input which allows Rust keywords as identifiers.

§Example
use syn::{Error, Ident, Result, Token};
use syn::ext::IdentExt;
use syn::parse::ParseStream;

mod kw {
    syn::custom_keyword!(name);
}

// Parses input that looks like `name = NAME` where `NAME` can be
// any identifier.
//
// Examples:
//
//     name = anything
//     name = impl
fn parse_dsl(input: ParseStream) -> Result<Ident> {
    input.parse::<kw::name>()?;
    input.parse::<Token![=]>()?;
    let name = input.call(Ident::parse_any)?;
    Ok(name)
}
Source

fn unraw(&self) -> Ident

Strips the raw marker r#, if any, from the beginning of an ident.

  • unraw(x) = x
  • unraw(move) = move
  • unraw(r#move) = move
§Example

In the case of interop with other languages like Python that have a different set of keywords than Rust, we might come across macro input that involves raw identifiers to refer to ordinary variables in the other language with a name that happens to be a Rust keyword.

The function below appends an identifier from the caller’s input onto a fixed prefix. Without using unraw(), this would tend to produce invalid identifiers like __pyo3_get_r#move.

use proc_macro2::Span;
use syn::Ident;
use syn::ext::IdentExt;

fn ident_for_getter(variable: &Ident) -> Ident {
    let getter = format!("__pyo3_get_{}", variable.unraw());
    Ident::new(&getter, Span::call_site())
}

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§