hax_lib_macros_types/
lib.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
18#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
19#[serde(rename = "HaUid")]
20pub struct ItemUid {
21 pub uid: String,
23}
24
25impl ItemUid {
26 pub fn fresh() -> Self {
27 use uuid::Uuid;
28 let uid = format!("{}", Uuid::new_v4().simple());
29 ItemUid { uid }
30 }
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
35#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
36#[serde(rename = "HaItemStatus")]
37pub enum ItemStatus {
38 Included {
40 late_skip: bool,
42 },
43 Excluded { modeled_by: Option<String> },
45}
46
47#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
51#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
52#[serde(rename = "HaAssocRole")]
53pub enum AssociationRole {
54 Requires,
55 Ensures,
56 Decreases,
57 SMTPat,
58 Refine,
59 ItemQuote,
62 ProcessRead,
63 ProcessWrite,
64 ProcessInit,
65 ProtocolMessages,
66}
67
68#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
70#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
71#[serde(rename = "HaItemQuotePosition")]
72pub enum ItemQuotePosition {
73 Before,
75 After,
77}
78
79#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
81#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
82#[serde(rename = "HaItemQuoteFStarOpts")]
83pub struct ItemQuoteFStarOpts {
84 pub intf: bool,
86 pub r#impl: bool,
88}
89
90#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
94#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
95#[serde(rename = "HaItemQuote")]
96pub struct ItemQuote {
97 pub position: ItemQuotePosition,
98 pub fstar_options: Option<ItemQuoteFStarOpts>,
99}
100
101#[derive(Debug, Clone, Serialize, Deserialize)]
105#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
106#[serde(rename = "HaPayload")]
107pub enum AttrPayload {
108 ItemStatus(ItemStatus),
109 AssociatedItem {
111 role: AssociationRole,
113 item: ItemUid,
115 },
116 Uid(ItemUid),
117 ItemQuote(ItemQuote),
119 NeverErased,
123 NewtypeAsRefinement,
124 Lemma,
126 Language,
127 ProcessRead,
128 ProcessWrite,
129 ProcessInit,
130 ProtocolMessages,
131 PVConstructor,
132 PVHandwritten,
133 TraitMethodNoPrePost,
134 Erased,
136 Order(i32),
143}
144
145pub const HAX_TOOL: &str = "_hax";
146pub const HAX_CFG_OPTION_NAME: &str = "hax_compilation";
147
148pub struct HaxTool;
149pub struct HaxCfgOptionName;
150pub struct DebugOrHaxCfgExpr;
151impl ToTokens for HaxTool {
152 fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
153 format_ident!("{}", HAX_TOOL).to_tokens(tokens)
154 }
155}
156impl ToTokens for HaxCfgOptionName {
157 fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
158 format_ident!("{}", HAX_CFG_OPTION_NAME).to_tokens(tokens)
159 }
160}
161impl ToTokens for DebugOrHaxCfgExpr {
162 fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
163 quote! {any(#HaxCfgOptionName, debug_assertions)}.to_tokens(tokens)
164 }
165}
166
167use quote::*;
168
169impl From<&AttrPayload> for proc_macro2::TokenStream {
170 fn from(payload: &AttrPayload) -> Self {
171 let payload: String = serde_json::to_string(payload).unwrap();
172 quote! {#[cfg_attr(#HaxCfgOptionName, #HaxTool::json(#payload))]}
173 }
174}
175
176impl ToTokens for AttrPayload {
177 fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
178 proc_macro2::TokenStream::from(self).to_tokens(tokens)
179 }
180}