naga/proc/
emitter.rs

1use crate::arena::Arena;
2
3/// Helper class to emit expressions
4#[allow(dead_code)]
5#[derive(Default, Debug)]
6pub struct Emitter {
7    start_len: Option<usize>,
8}
9
10#[allow(dead_code)]
11impl Emitter {
12    pub fn start(&mut self, arena: &Arena<crate::Expression>) {
13        if self.start_len.is_some() {
14            unreachable!("Emitting has already started!");
15        }
16        self.start_len = Some(arena.len());
17    }
18    pub const fn is_running(&self) -> bool {
19        self.start_len.is_some()
20    }
21    #[must_use]
22    pub fn finish(
23        &mut self,
24        arena: &Arena<crate::Expression>,
25    ) -> Option<(crate::Statement, crate::span::Span)> {
26        let start_len = self.start_len.take().unwrap();
27        if start_len != arena.len() {
28            #[allow(unused_mut)]
29            let mut span = crate::span::Span::default();
30            let range = arena.range_from(start_len);
31            for handle in range.clone() {
32                span.subsume(arena.get_span(handle))
33            }
34            Some((crate::Statement::Emit(range), span))
35        } else {
36            None
37        }
38    }
39}