attr.rs |
Example |
28359 |
bigint.rs |
|
1610 |
buffer.rs |
A stably addressed token buffer supporting efficient traversal based on a
cheaply copyable cursor. |
16069 |
classify.rs |
|
13137 |
custom_keyword.rs |
|
7862 |
custom_punctuation.rs |
|
9132 |
data.rs |
|
13747 |
derive.rs |
|
8843 |
discouraged.rs |
Extensions to the parsing API with niche applicability. |
9228 |
drops.rs |
|
1408 |
error.rs |
... |
14105 |
export.rs |
|
1672 |
expr.rs |
... |
136820 |
ext.rs |
Extension traits to provide parsing methods on foreign types. |
3902 |
file.rs |
|
3745 |
fixup.rs |
|
12498 |
gen |
|
|
generics.rs |
|
49158 |
group.rs |
|
7888 |
ident.rs |
|
3143 |
item.rs |
some sane fallback |
122033 |
lib.rs |
|
33797 |
lifetime.rs |
|
3878 |
lit.rs |
... |
56206 |
lookahead.rs |
|
10001 |
mac.rs |
|
8007 |
macros.rs |
|
4693 |
meta.rs |
Facility for interpreting structured content inside of an `Attribute`. |
14137 |
op.rs |
|
8337 |
parse.rs |
... |
47664 |
parse_macro_input.rs |
... |
3496 |
parse_quote.rs |
|
6577 |
pat.rs |
some sane fallback |
32004 |
path.rs |
|
33428 |
precedence.rs |
|
4578 |
print.rs |
|
390 |
punctuated.rs |
A punctuated sequence of syntax tree nodes separated by punctuation.
Lots of things in Rust are punctuated sequences.
- The fields of a struct are `Punctuated<Field, Token![,]>`.
- The segments of a path are `Punctuated<PathSegment, Token![::]>`.
- The bounds on a generic parameter are `Punctuated<TypeParamBound,
Token![+]>`.
- The arguments to a function call are `Punctuated<Expr, Token![,]>`.
This module provides a common representation for these punctuated sequences
in the form of the [`Punctuated<T, P>`] type. We store a vector of pairs of
syntax tree node + punctuation, where every node in the sequence is followed
by punctuation except for possibly the final one.
[`Punctuated<T, P>`]: Punctuated
```text
a_function_call(arg1, arg2, arg3);
~~~~^ ~~~~^ ~~~~
``` |
31235 |
restriction.rs |
|
6135 |
scan_expr.rs |
|
9220 |
sealed.rs |
|
87 |
span.rs |
|
1197 |
spanned.rs |
A trait that can provide the `Span` of the complete contents of a syntax
tree node.
<br>
# Example
Suppose in a procedural macro we have a [`Type`] that we want to assert
implements the [`Sync`] trait. Maybe this is the type of one of the fields
of a struct for which we are deriving a trait implementation, and we need to
be able to pass a reference to one of those fields across threads.
[`Type`]: crate::Type
[`Sync`]: std::marker::Sync
If the field type does *not* implement `Sync` as required, we want the
compiler to report an error pointing out exactly which type it was.
The following macro code takes a variable `ty` of type `Type` and produces a
static assertion that `Sync` is implemented for that type.
```
# extern crate proc_macro;
#
use proc_macro::TokenStream;
use proc_macro2::Span;
use quote::quote_spanned;
use syn::Type;
use syn::spanned::Spanned;
# const IGNORE_TOKENS: &str = stringify! {
#[proc_macro_derive(MyMacro)]
# };
pub fn my_macro(input: TokenStream) -> TokenStream {
# let ty = get_a_type();
/* ... */
let assert_sync = quote_spanned! {ty.span()=>
struct _AssertSync where #ty: Sync;
};
/* ... */
# input
}
#
# fn get_a_type() -> Type {
# unimplemented!()
# }
```
By inserting this `assert_sync` fragment into the output code generated by
our macro, the user's code will fail to compile if `ty` does not implement
`Sync`. The errors they would see look like the following.
```text
error[E0277]: the trait bound `*const i32: std::marker::Sync` is not satisfied
--> src/main.rs:10:21
|
10 | bad_field: *const i32,
| ^^^^^^^^^^ `*const i32` cannot be shared between threads safely
```
In this technique, using the `Type`'s span for the error message makes the
error appear in the correct place underlining the right type.
<br>
# Limitations
The underlying [`proc_macro::Span::join`] method is nightly-only. When
called from within a procedural macro in a nightly compiler, `Spanned` will
use `join` to produce the intended span. When not using a nightly compiler,
only the span of the *first token* of the syntax tree node is returned.
In the common case of wanting to use the joined span as the span of a
`syn::Error`, consider instead using [`syn::Error::new_spanned`] which is
able to span the error correctly under the complete syntax tree node without
needing the unstable `join`.
[`syn::Error::new_spanned`]: crate::Error::new_spanned |
3779 |
stmt.rs |
|
16711 |
thread.rs |
|
1904 |
token.rs |
Tokens representing Rust punctuation, keywords, and delimiters.
The type names in this module can be difficult to keep straight, so we
prefer to use the [`Token!`] macro instead. This is a type-macro that
expands to the token type of the given token.
[`Token!`]: crate::Token
# Example
The [`ItemStatic`] syntax tree node is defined like this.
[`ItemStatic`]: crate::ItemStatic
```
# use syn::{Attribute, Expr, Ident, Token, Type, Visibility};
#
pub struct ItemStatic {
pub attrs: Vec<Attribute>,
pub vis: Visibility,
pub static_token: Token![static],
pub mutability: Option<Token![mut]>,
pub ident: Ident,
pub colon_token: Token![:],
pub ty: Box<Type>,
pub eq_token: Token![=],
pub expr: Box<Expr>,
pub semi_token: Token![;],
}
```
# Parsing
Keywords and punctuation can be parsed through the [`ParseStream::parse`]
method. Delimiter tokens are parsed using the [`parenthesized!`],
[`bracketed!`] and [`braced!`] macros.
[`ParseStream::parse`]: crate::parse::ParseBuffer::parse()
[`parenthesized!`]: crate::parenthesized!
[`bracketed!`]: crate::bracketed!
[`braced!`]: crate::braced!
```
use syn::{Attribute, Result};
use syn::parse::{Parse, ParseStream};
#
# enum ItemStatic {}
// Parse the ItemStatic struct shown above.
impl Parse for ItemStatic {
fn parse(input: ParseStream) -> Result<Self> {
# use syn::ItemStatic;
# fn parse(input: ParseStream) -> Result<ItemStatic> {
Ok(ItemStatic {
attrs: input.call(Attribute::parse_outer)?,
vis: input.parse()?,
static_token: input.parse()?,
mutability: input.parse()?,
ident: input.parse()?,
colon_token: input.parse()?,
ty: input.parse()?,
eq_token: input.parse()?,
expr: input.parse()?,
semi_token: input.parse()?,
})
# }
# unimplemented!()
}
}
```
# Other operations
Every keyword and punctuation token supports the following operations.
- [Peeking] — `input.peek(Token![...])`
- [Parsing] — `input.parse::<Token![...]>()?`
- [Printing] — `quote!( ... #the_token ... )`
- Construction from a [`Span`] — `let the_token = Token![...](sp)`
- Field access to its span — `let sp = the_token.span`
[Peeking]: crate::parse::ParseBuffer::peek()
[Parsing]: crate::parse::ParseBuffer::parse()
[Printing]: https://docs.rs/quote/1.0/quote/trait.ToTokens.html
[`Span`]: https://docs.rs/proc-macro2/1.0/proc_macro2/struct.Span.html |
36268 |
tt.rs |
|
3727 |
ty.rs |
some sane fallback |
44929 |
verbatim.rs |
|
1216 |
whitespace.rs |
|
2103 |