mirror of https://codeberg.org/topola/topola.git
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.
This commit is contained in:
parent
93b628ae02
commit
f062e2f34e
|
|
@ -38,4 +38,4 @@ mirai_assertions = []
|
||||||
syn = { version = "1.0", features = ["extra-traits", "full", "visit", "visit-mut"] }
|
syn = { version = "1.0", features = ["extra-traits", "full", "visit", "visit-mut"] }
|
||||||
quote = "1.0"
|
quote = "1.0"
|
||||||
proc-macro2 = "1.0"
|
proc-macro2 = "1.0"
|
||||||
|
rustc_version = "0.4"
|
||||||
|
|
|
||||||
|
|
@ -180,6 +180,8 @@ extern crate proc_macro;
|
||||||
|
|
||||||
mod implementation;
|
mod implementation;
|
||||||
|
|
||||||
|
use rustc_version::{version, version_meta, Channel, Version};
|
||||||
|
|
||||||
use implementation::ContractMode;
|
use implementation::ContractMode;
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
|
|
||||||
|
|
@ -197,6 +199,10 @@ use proc_macro::TokenStream;
|
||||||
/// ```
|
/// ```
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn requires(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
pub fn requires(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
||||||
|
if let Channel::Nightly = version_meta().unwrap().channel {
|
||||||
|
return toks;
|
||||||
|
}
|
||||||
|
|
||||||
let attr = attr.into();
|
let attr = attr.into();
|
||||||
let toks = toks.into();
|
let toks = toks.into();
|
||||||
implementation::requires(ContractMode::Always, attr, 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
|
/// [`requires`]: attr.requires.html
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn debug_requires(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
pub fn debug_requires(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
||||||
|
if let Channel::Nightly = version_meta().unwrap().channel {
|
||||||
|
return toks;
|
||||||
|
}
|
||||||
|
|
||||||
let attr = attr.into();
|
let attr = attr.into();
|
||||||
let toks = toks.into();
|
let toks = toks.into();
|
||||||
implementation::requires(ContractMode::Debug, attr, 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
|
/// [`requires`]: attr.requires.html
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn test_requires(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
pub fn test_requires(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
||||||
|
if let Channel::Nightly = version_meta().unwrap().channel {
|
||||||
|
return toks;
|
||||||
|
}
|
||||||
|
|
||||||
let attr = attr.into();
|
let attr = attr.into();
|
||||||
let toks = toks.into();
|
let toks = toks.into();
|
||||||
implementation::requires(ContractMode::Test, attr, 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]
|
#[proc_macro_attribute]
|
||||||
pub fn ensures(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
pub fn ensures(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
||||||
|
if let Channel::Nightly = version_meta().unwrap().channel {
|
||||||
|
return toks;
|
||||||
|
}
|
||||||
|
|
||||||
let attr = attr.into();
|
let attr = attr.into();
|
||||||
let toks = toks.into();
|
let toks = toks.into();
|
||||||
implementation::ensures(ContractMode::Always, attr, 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
|
/// [`ensures`]: attr.ensures.html
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn debug_ensures(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
pub fn debug_ensures(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
||||||
|
if let Channel::Nightly = version_meta().unwrap().channel {
|
||||||
|
return toks;
|
||||||
|
}
|
||||||
|
|
||||||
let attr = attr.into();
|
let attr = attr.into();
|
||||||
let toks = toks.into();
|
let toks = toks.into();
|
||||||
implementation::ensures(ContractMode::Debug, attr, 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
|
/// [`ensures`]: attr.ensures.html
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn test_ensures(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
pub fn test_ensures(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
||||||
|
if let Channel::Nightly = version_meta().unwrap().channel {
|
||||||
|
return toks;
|
||||||
|
}
|
||||||
|
|
||||||
let attr = attr.into();
|
let attr = attr.into();
|
||||||
let toks = toks.into();
|
let toks = toks.into();
|
||||||
implementation::ensures(ContractMode::Test, attr, 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]
|
#[proc_macro_attribute]
|
||||||
pub fn invariant(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
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
|
// Invariant attributes might apply to `impl` blocks as well, where the same
|
||||||
// level is simply replicated on all methods.
|
// level is simply replicated on all methods.
|
||||||
// Function expansions will resolve the actual mode themselves, so the
|
// 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
|
/// [`invariant`]: attr.invariant.html
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn debug_invariant(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
pub fn debug_invariant(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
||||||
|
if let Channel::Nightly = version_meta().unwrap().channel {
|
||||||
|
return toks;
|
||||||
|
}
|
||||||
|
|
||||||
let mode = ContractMode::Debug;
|
let mode = ContractMode::Debug;
|
||||||
let attr = attr.into();
|
let attr = attr.into();
|
||||||
let toks = toks.into();
|
let toks = toks.into();
|
||||||
|
|
@ -348,6 +382,10 @@ pub fn debug_invariant(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
||||||
/// [`invariant`]: attr.invariant.html
|
/// [`invariant`]: attr.invariant.html
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn test_invariant(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
pub fn test_invariant(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
||||||
|
if let Channel::Nightly = version_meta().unwrap().channel {
|
||||||
|
return toks;
|
||||||
|
}
|
||||||
|
|
||||||
let mode = ContractMode::Test;
|
let mode = ContractMode::Test;
|
||||||
let attr = attr.into();
|
let attr = attr.into();
|
||||||
let toks = toks.into();
|
let toks = toks.into();
|
||||||
|
|
@ -389,6 +427,10 @@ pub fn test_invariant(attr: TokenStream, toks: TokenStream) -> TokenStream {
|
||||||
/// ```
|
/// ```
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn contract_trait(attrs: TokenStream, toks: TokenStream) -> TokenStream {
|
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 attrs: proc_macro2::TokenStream = attrs.into();
|
||||||
let toks: proc_macro2::TokenStream = toks.into();
|
let toks: proc_macro2::TokenStream = toks.into();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue