Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_macro_utils/src/fq_std.rs
6595 views
1
//! This module contains unit structs that should be used inside `quote!` and `spanned_quote!`
2
//! using the variable interpolation syntax in place of their equivalent structs and traits
3
//! present in `std`.
4
//!
5
//! To create hygienic proc macros, all the names must be its fully qualified form. These
6
//! unit structs help us to not specify the fully qualified name every single time.
7
//!
8
//! # Example
9
//! Instead of writing this:
10
//! ```
11
//! # use quote::quote;
12
//! quote!(
13
//! fn get_id() -> Option<i32> {
14
//! Some(0)
15
//! }
16
//! );
17
//! ```
18
//! Or this:
19
//! ```
20
//! # use quote::quote;
21
//! quote!(
22
//! fn get_id() -> ::core::option::Option<i32> {
23
//! ::core::option::Option::Some(0)
24
//! }
25
//! );
26
//! ```
27
//! We should write this:
28
//! ```
29
//! use bevy_macro_utils::fq_std::FQOption;
30
//! # use quote::quote;
31
//!
32
//! quote!(
33
//! fn get_id() -> #FQOption<i32> {
34
//! #FQOption::Some(0)
35
//! }
36
//! );
37
//! ```
38
39
use proc_macro2::TokenStream;
40
use quote::{quote, ToTokens};
41
42
/// Fully Qualified (FQ) short name for [`std::any::Any`]
43
pub struct FQAny;
44
/// Fully Qualified (FQ) short name for [`Box`]
45
pub struct FQBox;
46
/// Fully Qualified (FQ) short name for [`Clone`]
47
pub struct FQClone;
48
/// Fully Qualified (FQ) short name for [`Default`]
49
pub struct FQDefault;
50
/// Fully Qualified (FQ) short name for [`Option`]
51
pub struct FQOption;
52
/// Fully Qualified (FQ) short name for [`Result`]
53
pub struct FQResult;
54
/// Fully Qualified (FQ) short name for [`Send`]
55
pub struct FQSend;
56
/// Fully Qualified (FQ) short name for [`Sync`]
57
pub struct FQSync;
58
59
impl ToTokens for FQAny {
60
fn to_tokens(&self, tokens: &mut TokenStream) {
61
quote!(::core::any::Any).to_tokens(tokens);
62
}
63
}
64
65
impl ToTokens for FQBox {
66
fn to_tokens(&self, tokens: &mut TokenStream) {
67
quote!(::std::boxed::Box).to_tokens(tokens);
68
}
69
}
70
71
impl ToTokens for FQClone {
72
fn to_tokens(&self, tokens: &mut TokenStream) {
73
quote!(::core::clone::Clone).to_tokens(tokens);
74
}
75
}
76
77
impl ToTokens for FQDefault {
78
fn to_tokens(&self, tokens: &mut TokenStream) {
79
quote!(::core::default::Default).to_tokens(tokens);
80
}
81
}
82
83
impl ToTokens for FQOption {
84
fn to_tokens(&self, tokens: &mut TokenStream) {
85
quote!(::core::option::Option).to_tokens(tokens);
86
}
87
}
88
89
impl ToTokens for FQResult {
90
fn to_tokens(&self, tokens: &mut TokenStream) {
91
quote!(::core::result::Result).to_tokens(tokens);
92
}
93
}
94
95
impl ToTokens for FQSend {
96
fn to_tokens(&self, tokens: &mut TokenStream) {
97
quote!(::core::marker::Send).to_tokens(tokens);
98
}
99
}
100
101
impl ToTokens for FQSync {
102
fn to_tokens(&self, tokens: &mut TokenStream) {
103
quote!(::core::marker::Sync).to_tokens(tokens);
104
}
105
}
106
107