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}