libdusk/
new_code.rs

1use std::ops::Range;
2
3use dusk_dire::hir::{ExprId, DeclId, ItemId};
4
5use crate::driver::Driver;
6
7macro_rules! generate_new_code {
8    (pub struct $name:ident {
9        $(pub $field_name:ident: Range<$id_ty:ty>),*$(,)*
10    }) => {
11        #[derive(Debug)]
12        pub struct $name {
13            $(pub $field_name: Range<$id_ty>),*,
14        }
15
16        pub struct CodeSnapshot {
17            $($field_name: $id_ty),*,
18        }
19
20        impl Driver {
21            pub fn take_snapshot(&self) -> CodeSnapshot {
22                CodeSnapshot {
23                    exprs: self.code.hir.exprs.next_idx(),
24                    decls: self.code.hir.decls.next_idx(),
25                    items: self.code.hir.items.next_idx(),
26                }
27            }
28
29            pub fn get_new_code_since(&self, before: CodeSnapshot) -> NewCode {
30                let after = self.take_snapshot();
31                NewCode {
32                    $($field_name: before.$field_name..after.$field_name),*,
33                }
34            }
35        }
36
37        impl $name {
38            pub fn placeholder() -> Self {
39                Self {
40                    $($field_name: <$id_ty>::new(0)..<$id_ty>::new(0)),*,
41                }
42            }
43        }
44    }
45}
46
47generate_new_code! {
48    pub struct NewCode {
49        pub exprs: Range<ExprId>,
50        pub decls: Range<DeclId>,
51        pub items: Range<ItemId>,
52    }
53}