pub trait IdentExt: Sized + Sealed {
const peek_any: PeekFn = private::PeekFn;
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
.
This trait is available only if Syn is built with the "parsing"
feature.
Provided Associated Constants
Required Methods
sourcefn parse_any(input: ParseStream<'_>) -> Result<Self>
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)
}
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())
}