//! Definitions for compatibility with syn 2 //! //! This, along with `compat_syn_1.rs` and //! [`compat_syn_common`](super::compat_syn_common) //! exists to minimise the delta in the commit which switches to syn 2. //! //! This approach would also allow us to support *both* syn 1 and syn 2, //! and correspondingly reduce our MSRV back to 1.54, //! eg via cargo features, //! if that turns out to be desirable. use super::prelude::*; pub use proc_macro2::extra::DelimSpan; //---------- Spanned ---------- /// Local version of `Spanned` /// /// Works around `Spanned` being sealed in syn 2. /// . /// (Not needed with syn 1, but would be harmless there.) pub trait Spanned { fn span(&self) -> Span; } impl Spanned for T { fn span(&self) -> Span { syn::spanned::Spanned::span(self) } } //---------- Attribute methods ---------- impl AttributeExt12 for syn::Attribute { fn call_in_parens(&self, f: F) -> syn::Result where F: FnOnce(ParseStream<'_>) -> syn::Result, { let list = self.meta.require_list()?; let _paren: syn::token::Paren = match list.delimiter { syn::MacroDelimiter::Paren(p) => p, _ => return Err(list.error("expected parenthesised attributes")), }; f.parse2(list.tokens.clone()) } } //---------- VisPublic ---------- pub trait VisPublicExt { /// syn 1 has a separate `VisPublic` type with a `pub_token` field fn pub_token(self) -> syn::token::Pub; } impl VisPublicExt for syn::token::Pub { fn pub_token(self) -> syn::token::Pub { self } }