jetcrab\lexer\scanners/
comment.rs

1use crate::lexer::{LexerError, TokenKind};
2
3pub trait CommentReader {
4    fn read_line_comment(&mut self) -> Result<TokenKind, LexerError>;
5    fn read_block_comment(&mut self) -> Result<TokenKind, LexerError>;
6}
7
8impl<T> CommentReader for T
9where
10    T: LexerCore + LexerCoreExt,
11{
12    fn read_line_comment(&mut self) -> Result<TokenKind, LexerError> {
13        self.advance_pos();
14        self.advance_pos();
15
16        let mut comment = String::new();
17
18        while self.pos() < self.source().len() {
19            let c = self.source()[self.pos()];
20            if c == '\n' {
21                break;
22            }
23            comment.push(c);
24            self.advance_pos();
25        }
26
27        Ok(TokenKind::Comment(comment))
28    }
29
30    fn read_block_comment(&mut self) -> Result<TokenKind, LexerError> {
31        self.advance_pos();
32        self.advance_pos();
33
34        let mut comment = String::new();
35        let mut found_closing_comment = false;
36
37        while self.pos() < self.source().len() {
38            let c = self.source()[self.pos()];
39
40            if c == '*' && self.peek_char(1) == Some('/') {
41                self.advance_pos();
42                self.advance_pos();
43                found_closing_comment = true;
44                break;
45            }
46
47            comment.push(c);
48            self.advance_pos();
49        }
50
51        if !found_closing_comment {
52            return Err(LexerError::UnterminatedComment);
53        }
54
55        Ok(TokenKind::Comment(comment))
56    }
57}
58
59use crate::lexer::scanners::{LexerCore, LexerCoreExt};