rapx/preprocess/
dummy_fns.rs1use super::set_attrs;
2use rustc_ast::*;
3use rustc_span::{DUMMY_SP, symbol::Ident};
4use thin_vec::ThinVec;
5
6fn make_dummy_fn_sig() -> FnSig {
7 let fn_decl = FnDecl {
8 inputs: ThinVec::new(),
9 output: FnRetTy::Default(DUMMY_SP),
10 };
11
12 FnSig {
13 decl: Box::new(fn_decl),
14 header: FnHeader {
15 safety: Safety::Default,
16 constness: Const::No,
17 ext: Extern::None,
18 coroutine_kind: None,
19 },
20 span: DUMMY_SP,
21 }
22}
23
24fn make_dummy_block() -> Block {
25 Block {
26 stmts: ThinVec::new(),
27 id: DUMMY_NODE_ID,
28 rules: BlockCheckMode::Default,
29 span: DUMMY_SP,
30 tokens: None,
31 }
32}
33
34fn make_dummy_fn(ident_name: &str, build_std: bool) -> Box<Item> {
35 let ident = Ident::from_str(ident_name);
36
37 let fn_ast = Fn {
38 #[cfg(rapx_rustc_ge_196)]
39 defaultness: Defaultness::Implicit,
40 #[cfg(not(rapx_rustc_ge_196))]
41 defaultness: Defaultness::Final,
42 ident,
43 generics: Generics::default(),
44 sig: make_dummy_fn_sig(),
45 contract: None,
46 define_opaque: None,
47 #[cfg(rapx_rustc_ge_196)]
48 eii_impls: Default::default(),
49 body: Some(Box::new(make_dummy_block())),
50 };
51
52 Box::new(Item {
53 attrs: set_attrs(build_std),
54 id: DUMMY_NODE_ID,
55 kind: ItemKind::Fn(Box::new(fn_ast)),
56 vis: Visibility {
57 span: DUMMY_SP,
58 kind: VisibilityKind::Public,
59 tokens: None,
60 },
61 span: DUMMY_SP,
62 tokens: None,
63 })
64}
65
66pub(crate) fn create_dummy_fns(krate: &mut Crate, build_std: bool) {
67 let raw_ptr_fn = make_dummy_fn("__raw_ptr_deref_dummy", build_std);
68 let static_mut_fn = make_dummy_fn("__static_mut_deref_dummy", build_std);
69
70 krate.items.push(raw_ptr_fn);
71 krate.items.push(static_mut_fn);
72}