ellie_tokenizer/processors/items/
loop_processor.rs

1use crate::{processors::EscapeCharEmitter, syntax::items::loop_type::Loop};
2use ellie_core::{defs, error};
3
4impl crate::processors::Processor for Loop {
5    fn emits_line_endings(&self) -> EscapeCharEmitter {
6        self.iterator.emits_line_endings()
7    }
8
9    fn iterate(
10        &mut self,
11        errors: &mut Vec<error::Error>,
12        cursor: defs::CursorPosition,
13        last_char: char,
14        letter_char: char,
15    ) -> bool {
16        let mut hang = false;
17        if !self.condition_filled {
18            if self.condition.is_complete() && letter_char == '{' {
19                self.condition_filled = true;
20                self.condition_pos = self.condition.current.get_pos();
21            } else {
22                hang = self
23                    .condition
24                    .iterate(errors, cursor, last_char, letter_char);
25            }
26        } else if letter_char == '}' && self.brace_count == 0 {
27            self.complete = true;
28            self.body_pos.range_end = cursor;
29            self.pos.range_end = cursor;
30            self.iterator.finalize();
31            errors.extend(self.iterator.errors.clone());
32            self.body = self.iterator.collected.clone();
33        } else {
34            if letter_char == '{' {
35                self.brace_count += 1;
36            } else if letter_char == '}' && self.brace_count != 0 {
37                self.brace_count -= 1;
38            }
39            self.iterator.pos = cursor;
40            hang = self.iterator.iterate(last_char, letter_char);
41        }
42        hang
43    }
44}