From f062e2f34e55ef9614639ff9a0eabc71870505d0 Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Sat, 25 May 2024 21:45:53 +0200 Subject: [PATCH] contracts: make derive macros do nothing outside nightly channel This allows us to build Topola in stable rust, as our vendored contracts library fork uses try blocks which haven't been stabilized yet. --- vendored/contracts/Cargo.toml | 2 +- vendored/contracts/src/lib.rs | 42 +++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/vendored/contracts/Cargo.toml b/vendored/contracts/Cargo.toml index 515e32e..18970c0 100644 --- a/vendored/contracts/Cargo.toml +++ b/vendored/contracts/Cargo.toml @@ -38,4 +38,4 @@ mirai_assertions = [] syn = { version = "1.0", features = ["extra-traits", "full", "visit", "visit-mut"] } quote = "1.0" proc-macro2 = "1.0" - +rustc_version = "0.4" diff --git a/vendored/contracts/src/lib.rs b/vendored/contracts/src/lib.rs index de9690c..42d3ebf 100644 --- a/vendored/contracts/src/lib.rs +++ b/vendored/contracts/src/lib.rs @@ -180,6 +180,8 @@ extern crate proc_macro; mod implementation; +use rustc_version::{version, version_meta, Channel, Version}; + use implementation::ContractMode; use proc_macro::TokenStream; @@ -197,6 +199,10 @@ use proc_macro::TokenStream; /// ``` #[proc_macro_attribute] pub fn requires(attr: TokenStream, toks: TokenStream) -> TokenStream { + if let Channel::Nightly = version_meta().unwrap().channel { + return toks; + } + let attr = attr.into(); let toks = toks.into(); implementation::requires(ContractMode::Always, attr, toks).into() @@ -207,6 +213,10 @@ pub fn requires(attr: TokenStream, toks: TokenStream) -> TokenStream { /// [`requires`]: attr.requires.html #[proc_macro_attribute] pub fn debug_requires(attr: TokenStream, toks: TokenStream) -> TokenStream { + if let Channel::Nightly = version_meta().unwrap().channel { + return toks; + } + let attr = attr.into(); let toks = toks.into(); implementation::requires(ContractMode::Debug, attr, toks).into() @@ -217,6 +227,10 @@ pub fn debug_requires(attr: TokenStream, toks: TokenStream) -> TokenStream { /// [`requires`]: attr.requires.html #[proc_macro_attribute] pub fn test_requires(attr: TokenStream, toks: TokenStream) -> TokenStream { + if let Channel::Nightly = version_meta().unwrap().channel { + return toks; + } + let attr = attr.into(); let toks = toks.into(); implementation::requires(ContractMode::Test, attr, toks).into() @@ -252,6 +266,10 @@ pub fn test_requires(attr: TokenStream, toks: TokenStream) -> TokenStream { /// ``` #[proc_macro_attribute] pub fn ensures(attr: TokenStream, toks: TokenStream) -> TokenStream { + if let Channel::Nightly = version_meta().unwrap().channel { + return toks; + } + let attr = attr.into(); let toks = toks.into(); implementation::ensures(ContractMode::Always, attr, toks).into() @@ -262,6 +280,10 @@ pub fn ensures(attr: TokenStream, toks: TokenStream) -> TokenStream { /// [`ensures`]: attr.ensures.html #[proc_macro_attribute] pub fn debug_ensures(attr: TokenStream, toks: TokenStream) -> TokenStream { + if let Channel::Nightly = version_meta().unwrap().channel { + return toks; + } + let attr = attr.into(); let toks = toks.into(); implementation::ensures(ContractMode::Debug, attr, toks).into() @@ -272,6 +294,10 @@ pub fn debug_ensures(attr: TokenStream, toks: TokenStream) -> TokenStream { /// [`ensures`]: attr.ensures.html #[proc_macro_attribute] pub fn test_ensures(attr: TokenStream, toks: TokenStream) -> TokenStream { + if let Channel::Nightly = version_meta().unwrap().channel { + return toks; + } + let attr = attr.into(); let toks = toks.into(); implementation::ensures(ContractMode::Test, attr, toks).into() @@ -320,6 +346,10 @@ pub fn test_ensures(attr: TokenStream, toks: TokenStream) -> TokenStream { /// ``` #[proc_macro_attribute] pub fn invariant(attr: TokenStream, toks: TokenStream) -> TokenStream { + if let Channel::Nightly = version_meta().unwrap().channel { + return toks; + } + // Invariant attributes might apply to `impl` blocks as well, where the same // level is simply replicated on all methods. // Function expansions will resolve the actual mode themselves, so the @@ -337,6 +367,10 @@ pub fn invariant(attr: TokenStream, toks: TokenStream) -> TokenStream { /// [`invariant`]: attr.invariant.html #[proc_macro_attribute] pub fn debug_invariant(attr: TokenStream, toks: TokenStream) -> TokenStream { + if let Channel::Nightly = version_meta().unwrap().channel { + return toks; + } + let mode = ContractMode::Debug; let attr = attr.into(); let toks = toks.into(); @@ -348,6 +382,10 @@ pub fn debug_invariant(attr: TokenStream, toks: TokenStream) -> TokenStream { /// [`invariant`]: attr.invariant.html #[proc_macro_attribute] pub fn test_invariant(attr: TokenStream, toks: TokenStream) -> TokenStream { + if let Channel::Nightly = version_meta().unwrap().channel { + return toks; + } + let mode = ContractMode::Test; let attr = attr.into(); let toks = toks.into(); @@ -389,6 +427,10 @@ pub fn test_invariant(attr: TokenStream, toks: TokenStream) -> TokenStream { /// ``` #[proc_macro_attribute] pub fn contract_trait(attrs: TokenStream, toks: TokenStream) -> TokenStream { + if let Channel::Nightly = version_meta().unwrap().channel { + return toks; + } + let attrs: proc_macro2::TokenStream = attrs.into(); let toks: proc_macro2::TokenStream = toks.into();