|
@@ -1,43 +1,38 @@
|
|
|
extern crate proc_macro;
|
|
extern crate proc_macro;
|
|
|
|
|
|
|
|
-// This file littered with these essential cfgs so ensure them.
|
|
|
|
|
-#[cfg(not(any(RUSTC_WITH_SPECIALIZATION, RUSTC_WITHOUT_SPECIALIZATION)))]
|
|
|
|
|
-compile_error!("rustc_version is missing in build dependency and build.rs is not specified");
|
|
|
|
|
-
|
|
|
|
|
-#[cfg(any(RUSTC_WITH_SPECIALIZATION, RUSTC_WITHOUT_SPECIALIZATION))]
|
|
|
|
|
use proc_macro::TokenStream;
|
|
use proc_macro::TokenStream;
|
|
|
|
|
|
|
|
// Define dummy macro_attribute and macro_derive for stable rustc
|
|
// Define dummy macro_attribute and macro_derive for stable rustc
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITHOUT_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(not(feature = "frozen-abi"))]
|
|
|
#[proc_macro_attribute]
|
|
#[proc_macro_attribute]
|
|
|
pub fn frozen_abi(_attrs: TokenStream, item: TokenStream) -> TokenStream {
|
|
pub fn frozen_abi(_attrs: TokenStream, item: TokenStream) -> TokenStream {
|
|
|
item
|
|
item
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITHOUT_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(not(feature = "frozen-abi"))]
|
|
|
#[proc_macro_derive(AbiExample)]
|
|
#[proc_macro_derive(AbiExample)]
|
|
|
pub fn derive_abi_sample(_item: TokenStream) -> TokenStream {
|
|
pub fn derive_abi_sample(_item: TokenStream) -> TokenStream {
|
|
|
"".parse().unwrap()
|
|
"".parse().unwrap()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITHOUT_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(not(feature = "frozen-abi"))]
|
|
|
#[proc_macro_derive(AbiEnumVisitor)]
|
|
#[proc_macro_derive(AbiEnumVisitor)]
|
|
|
pub fn derive_abi_enum_visitor(_item: TokenStream) -> TokenStream {
|
|
pub fn derive_abi_enum_visitor(_item: TokenStream) -> TokenStream {
|
|
|
"".parse().unwrap()
|
|
"".parse().unwrap()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
use proc_macro2::{Span, TokenStream as TokenStream2, TokenTree};
|
|
use proc_macro2::{Span, TokenStream as TokenStream2, TokenTree};
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
use quote::{quote, ToTokens};
|
|
use quote::{quote, ToTokens};
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
use syn::{
|
|
use syn::{
|
|
|
parse_macro_input, Attribute, Error, Fields, Ident, Item, ItemEnum, ItemStruct, ItemType,
|
|
parse_macro_input, Attribute, Error, Fields, Ident, Item, ItemEnum, ItemStruct, ItemType,
|
|
|
LitStr, Variant,
|
|
LitStr, Variant,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn filter_serde_attrs(attrs: &[Attribute]) -> bool {
|
|
fn filter_serde_attrs(attrs: &[Attribute]) -> bool {
|
|
|
fn contains_skip(tokens: TokenStream2) -> bool {
|
|
fn contains_skip(tokens: TokenStream2) -> bool {
|
|
|
for token in tokens.into_iter() {
|
|
for token in tokens.into_iter() {
|
|
@@ -72,7 +67,7 @@ fn filter_serde_attrs(attrs: &[Attribute]) -> bool {
|
|
|
false
|
|
false
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn filter_allow_attrs(attrs: &mut Vec<Attribute>) {
|
|
fn filter_allow_attrs(attrs: &mut Vec<Attribute>) {
|
|
|
attrs.retain(|attr| {
|
|
attrs.retain(|attr| {
|
|
|
let ss = &attr.path().segments.first().unwrap().ident.to_string();
|
|
let ss = &attr.path().segments.first().unwrap().ident.to_string();
|
|
@@ -80,7 +75,7 @@ fn filter_allow_attrs(attrs: &mut Vec<Attribute>) {
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn derive_abi_sample_enum_type(input: ItemEnum) -> TokenStream {
|
|
fn derive_abi_sample_enum_type(input: ItemEnum) -> TokenStream {
|
|
|
let type_name = &input.ident;
|
|
let type_name = &input.ident;
|
|
|
|
|
|
|
@@ -157,7 +152,7 @@ fn derive_abi_sample_enum_type(input: ItemEnum) -> TokenStream {
|
|
|
result.into()
|
|
result.into()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn derive_abi_sample_struct_type(input: ItemStruct) -> TokenStream {
|
|
fn derive_abi_sample_struct_type(input: ItemStruct) -> TokenStream {
|
|
|
let type_name = &input.ident;
|
|
let type_name = &input.ident;
|
|
|
let mut sample_fields = quote! {};
|
|
let mut sample_fields = quote! {};
|
|
@@ -212,7 +207,7 @@ fn derive_abi_sample_struct_type(input: ItemStruct) -> TokenStream {
|
|
|
result.into()
|
|
result.into()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
#[proc_macro_derive(AbiExample)]
|
|
#[proc_macro_derive(AbiExample)]
|
|
|
pub fn derive_abi_sample(item: TokenStream) -> TokenStream {
|
|
pub fn derive_abi_sample(item: TokenStream) -> TokenStream {
|
|
|
let item = parse_macro_input!(item as Item);
|
|
let item = parse_macro_input!(item as Item);
|
|
@@ -226,7 +221,7 @@ pub fn derive_abi_sample(item: TokenStream) -> TokenStream {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn do_derive_abi_enum_visitor(input: ItemEnum) -> TokenStream {
|
|
fn do_derive_abi_enum_visitor(input: ItemEnum) -> TokenStream {
|
|
|
let type_name = &input.ident;
|
|
let type_name = &input.ident;
|
|
|
let mut serialized_variants = quote! {};
|
|
let mut serialized_variants = quote! {};
|
|
@@ -264,7 +259,7 @@ fn do_derive_abi_enum_visitor(input: ItemEnum) -> TokenStream {
|
|
|
}).into()
|
|
}).into()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
#[proc_macro_derive(AbiEnumVisitor)]
|
|
#[proc_macro_derive(AbiEnumVisitor)]
|
|
|
pub fn derive_abi_enum_visitor(item: TokenStream) -> TokenStream {
|
|
pub fn derive_abi_enum_visitor(item: TokenStream) -> TokenStream {
|
|
|
let item = parse_macro_input!(item as Item);
|
|
let item = parse_macro_input!(item as Item);
|
|
@@ -277,7 +272,7 @@ pub fn derive_abi_enum_visitor(item: TokenStream) -> TokenStream {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn quote_for_test(
|
|
fn quote_for_test(
|
|
|
test_mod_ident: &Ident,
|
|
test_mod_ident: &Ident,
|
|
|
type_name: &Ident,
|
|
type_name: &Ident,
|
|
@@ -321,12 +316,12 @@ fn quote_for_test(
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn test_mod_name(type_name: &Ident) -> Ident {
|
|
fn test_mod_name(type_name: &Ident) -> Ident {
|
|
|
Ident::new(&format!("{type_name}_frozen_abi"), Span::call_site())
|
|
Ident::new(&format!("{type_name}_frozen_abi"), Span::call_site())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn frozen_abi_type_alias(input: ItemType, expected_digest: &str) -> TokenStream {
|
|
fn frozen_abi_type_alias(input: ItemType, expected_digest: &str) -> TokenStream {
|
|
|
let type_name = &input.ident;
|
|
let type_name = &input.ident;
|
|
|
let test = quote_for_test(&test_mod_name(type_name), type_name, expected_digest);
|
|
let test = quote_for_test(&test_mod_name(type_name), type_name, expected_digest);
|
|
@@ -337,7 +332,7 @@ fn frozen_abi_type_alias(input: ItemType, expected_digest: &str) -> TokenStream
|
|
|
result.into()
|
|
result.into()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn frozen_abi_struct_type(input: ItemStruct, expected_digest: &str) -> TokenStream {
|
|
fn frozen_abi_struct_type(input: ItemStruct, expected_digest: &str) -> TokenStream {
|
|
|
let type_name = &input.ident;
|
|
let type_name = &input.ident;
|
|
|
let test = quote_for_test(&test_mod_name(type_name), type_name, expected_digest);
|
|
let test = quote_for_test(&test_mod_name(type_name), type_name, expected_digest);
|
|
@@ -348,7 +343,7 @@ fn frozen_abi_struct_type(input: ItemStruct, expected_digest: &str) -> TokenStre
|
|
|
result.into()
|
|
result.into()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn quote_sample_variant(
|
|
fn quote_sample_variant(
|
|
|
type_name: &Ident,
|
|
type_name: &Ident,
|
|
|
ty_generics: &syn::TypeGenerics,
|
|
ty_generics: &syn::TypeGenerics,
|
|
@@ -394,7 +389,7 @@ fn quote_sample_variant(
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
fn frozen_abi_enum_type(input: ItemEnum, expected_digest: &str) -> TokenStream {
|
|
fn frozen_abi_enum_type(input: ItemEnum, expected_digest: &str) -> TokenStream {
|
|
|
let type_name = &input.ident;
|
|
let type_name = &input.ident;
|
|
|
let test = quote_for_test(&test_mod_name(type_name), type_name, expected_digest);
|
|
let test = quote_for_test(&test_mod_name(type_name), type_name, expected_digest);
|
|
@@ -405,7 +400,7 @@ fn frozen_abi_enum_type(input: ItemEnum, expected_digest: &str) -> TokenStream {
|
|
|
result.into()
|
|
result.into()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#[cfg(RUSTC_WITH_SPECIALIZATION)]
|
|
|
|
|
|
|
+#[cfg(feature = "frozen-abi")]
|
|
|
#[proc_macro_attribute]
|
|
#[proc_macro_attribute]
|
|
|
pub fn frozen_abi(attrs: TokenStream, item: TokenStream) -> TokenStream {
|
|
pub fn frozen_abi(attrs: TokenStream, item: TokenStream) -> TokenStream {
|
|
|
let mut expected_digest: Option<String> = None;
|
|
let mut expected_digest: Option<String> = None;
|