ellie_tokenizer/processors/items/
loop_processor.rs1use 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}