summaryrefslogtreecommitdiff
path: root/vendor/logos-codegen/src/util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/logos-codegen/src/util.rs')
-rw-r--r--vendor/logos-codegen/src/util.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/vendor/logos-codegen/src/util.rs b/vendor/logos-codegen/src/util.rs
new file mode 100644
index 00000000..156de035
--- /dev/null
+++ b/vendor/logos-codegen/src/util.rs
@@ -0,0 +1,64 @@
+use proc_macro2::{Spacing, Span, TokenStream, TokenTree};
+use quote::{quote, ToTokens};
+use syn::Ident;
+
+/// Analog to Option<TokenStream>, except when put into the quote!
+/// macro, `MaybeVoid::Void` will produce `()`
+#[derive(Clone, Default)]
+pub enum MaybeVoid {
+ Some(TokenStream),
+ #[default]
+ Void,
+}
+
+impl MaybeVoid {
+ pub fn replace(&mut self, stream: TokenStream) -> MaybeVoid {
+ std::mem::replace(self, MaybeVoid::Some(stream))
+ }
+
+ pub fn take(&mut self) -> MaybeVoid {
+ std::mem::replace(self, MaybeVoid::Void)
+ }
+}
+
+impl ToTokens for MaybeVoid {
+ fn to_tokens(&self, out: &mut TokenStream) {
+ match self {
+ MaybeVoid::Some(stream) => out.extend(stream.clone()),
+ MaybeVoid::Void => out.extend(quote!(())),
+ }
+ }
+
+ fn to_token_stream(&self) -> TokenStream {
+ match self {
+ MaybeVoid::Some(stream) => stream.clone(),
+ MaybeVoid::Void => quote!(()),
+ }
+ }
+
+ fn into_token_stream(self) -> TokenStream {
+ match self {
+ MaybeVoid::Some(stream) => stream,
+ MaybeVoid::Void => quote!(()),
+ }
+ }
+}
+
+pub fn is_punct(tt: &TokenTree, expect: char) -> bool {
+ matches!(tt, TokenTree::Punct(punct) if punct.as_char() == expect && punct.spacing() == Spacing::Alone)
+}
+
+/// If supplied `tt` is a punct matching a char, returns `None`, else returns `tt`
+pub fn expect_punct(tt: Option<TokenTree>, expect: char) -> Option<TokenTree> {
+ tt.filter(|tt| !is_punct(tt, expect))
+}
+
+pub trait ToIdent {
+ fn to_ident(&self) -> Ident;
+}
+
+impl ToIdent for str {
+ fn to_ident(&self) -> Ident {
+ Ident::new(self, Span::call_site())
+ }
+}