summaryrefslogtreecommitdiffstats
path: root/vendor/maybe-async/src/parse.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:41:41 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-04 12:41:41 +0000
commit10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87 (patch)
treebdffd5d80c26cf4a7a518281a204be1ace85b4c1 /vendor/maybe-async/src/parse.rs
parentReleasing progress-linux version 1.70.0+dfsg1-9~progress7.99u1. (diff)
downloadrustc-10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87.tar.xz
rustc-10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87.zip
Merging upstream version 1.70.0+dfsg2.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/maybe-async/src/parse.rs')
-rw-r--r--vendor/maybe-async/src/parse.rs49
1 files changed, 49 insertions, 0 deletions
diff --git a/vendor/maybe-async/src/parse.rs b/vendor/maybe-async/src/parse.rs
new file mode 100644
index 000000000..b5a8cf903
--- /dev/null
+++ b/vendor/maybe-async/src/parse.rs
@@ -0,0 +1,49 @@
+use proc_macro2::Span;
+use syn::{
+ parse::{discouraged::Speculative, Parse, ParseStream, Result},
+ Attribute, Error, ItemFn, ItemImpl, ItemStatic, ItemTrait,
+};
+
+pub enum Item {
+ Trait(ItemTrait),
+ Impl(ItemImpl),
+ Fn(ItemFn),
+ Static(ItemStatic),
+}
+
+macro_rules! fork {
+ ($fork:ident = $input:ident) => {{
+ $fork = $input.fork();
+ &$fork
+ }};
+}
+
+impl Parse for Item {
+ fn parse(input: ParseStream) -> Result<Self> {
+ let attrs = input.call(Attribute::parse_outer)?;
+ let mut fork;
+ let item = if let Some(mut item) = fork!(fork = input).parse::<ItemImpl>().ok() {
+ if item.trait_.is_none() {
+ return Err(Error::new(Span::call_site(), "expected a trait impl"));
+ }
+ item.attrs = attrs;
+ Item::Impl(item)
+ } else if let Some(mut item) = fork!(fork = input).parse::<ItemTrait>().ok() {
+ item.attrs = attrs;
+ Item::Trait(item)
+ } else if let Some(mut item) = fork!(fork = input).parse::<ItemFn>().ok() {
+ item.attrs = attrs;
+ Item::Fn(item)
+ } else if let Some(mut item) = fork!(fork = input).parse::<ItemStatic>().ok() {
+ item.attrs = attrs;
+ Item::Static(item)
+ } else {
+ return Err(Error::new(
+ Span::call_site(),
+ "expected trait impl, trait or fn",
+ ));
+ };
+ input.advance_to(&fork);
+ Ok(item)
+ }
+}