naga/proc/
emitter.rs

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