//! This module contains unit structs that should be used inside `quote!` and `spanned_quote!`1//! using the variable interpolation syntax in place of their equivalent structs and traits2//! present in `std`.3//!4//! To create hygienic proc macros, all the names must be its fully qualified form. These5//! unit structs help us to not specify the fully qualified name every single time.6//!7//! # Example8//! Instead of writing this:9//! ```10//! # use quote::quote;11//! quote!(12//! fn get_id() -> Option<i32> {13//! Some(0)14//! }15//! );16//! ```17//! Or this:18//! ```19//! # use quote::quote;20//! quote!(21//! fn get_id() -> ::core::option::Option<i32> {22//! ::core::option::Option::Some(0)23//! }24//! );25//! ```26//! We should write this:27//! ```28//! use bevy_macro_utils::fq_std::FQOption;29//! # use quote::quote;30//!31//! quote!(32//! fn get_id() -> #FQOption<i32> {33//! #FQOption::Some(0)34//! }35//! );36//! ```3738use proc_macro2::TokenStream;39use quote::{quote, ToTokens};4041/// Fully Qualified (FQ) short name for [`std::any::Any`]42pub struct FQAny;43/// Fully Qualified (FQ) short name for [`Box`]44pub struct FQBox;45/// Fully Qualified (FQ) short name for [`Clone`]46pub struct FQClone;47/// Fully Qualified (FQ) short name for [`Default`]48pub struct FQDefault;49/// Fully Qualified (FQ) short name for [`Option`]50pub struct FQOption;51/// Fully Qualified (FQ) short name for [`Result`]52pub struct FQResult;53/// Fully Qualified (FQ) short name for [`Send`]54pub struct FQSend;55/// Fully Qualified (FQ) short name for [`Sync`]56pub struct FQSync;5758impl ToTokens for FQAny {59fn to_tokens(&self, tokens: &mut TokenStream) {60quote!(::core::any::Any).to_tokens(tokens);61}62}6364impl ToTokens for FQBox {65fn to_tokens(&self, tokens: &mut TokenStream) {66quote!(::std::boxed::Box).to_tokens(tokens);67}68}6970impl ToTokens for FQClone {71fn to_tokens(&self, tokens: &mut TokenStream) {72quote!(::core::clone::Clone).to_tokens(tokens);73}74}7576impl ToTokens for FQDefault {77fn to_tokens(&self, tokens: &mut TokenStream) {78quote!(::core::default::Default).to_tokens(tokens);79}80}8182impl ToTokens for FQOption {83fn to_tokens(&self, tokens: &mut TokenStream) {84quote!(::core::option::Option).to_tokens(tokens);85}86}8788impl ToTokens for FQResult {89fn to_tokens(&self, tokens: &mut TokenStream) {90quote!(::core::result::Result).to_tokens(tokens);91}92}9394impl ToTokens for FQSend {95fn to_tokens(&self, tokens: &mut TokenStream) {96quote!(::core::marker::Send).to_tokens(tokens);97}98}99100impl ToTokens for FQSync {101fn to_tokens(&self, tokens: &mut TokenStream) {102quote!(::core::marker::Sync).to_tokens(tokens);103}104}105106107