oxc_parser/lexer/
punctuation.rs

1use super::{Kind, Lexer, Token};
2
3impl Lexer<'_> {
4    /// Section 12.8 Punctuators
5    pub(super) fn read_dot(&mut self) -> Kind {
6        if self.peek_2_bytes() == Some([b'.', b'.']) {
7            self.consume_2_chars();
8            return Kind::Dot3;
9        }
10        if self.peek_byte().is_some_and(|b| b.is_ascii_digit()) {
11            self.decimal_literal_after_decimal_point()
12        } else {
13            Kind::Dot
14        }
15    }
16
17    /// returns None for `SingleLineHTMLOpenComment` `<!--` in script mode
18    pub(super) fn read_left_angle(&mut self) -> Option<Kind> {
19        match self.peek_byte() {
20            Some(b'<') => {
21                self.consume_char();
22                if self.next_ascii_byte_eq(b'=') {
23                    Some(Kind::ShiftLeftEq)
24                } else {
25                    Some(Kind::ShiftLeft)
26                }
27            }
28            Some(b'=') => {
29                self.consume_char();
30                Some(Kind::LtEq)
31            }
32            Some(b'!') if self.source_type.is_script() && self.remaining().starts_with("!--") => {
33                None
34            }
35            _ => Some(Kind::LAngle),
36        }
37    }
38
39    /// returns None for `SingleLineHTMLCloseComment` `-->` in script mode
40    pub(super) fn read_minus(&mut self) -> Option<Kind> {
41        match self.peek_byte() {
42            Some(b'-') => {
43                self.consume_char();
44                if self.token.is_on_new_line()
45                    && self.source_type.is_script()
46                    && self.next_ascii_byte_eq(b'>')
47                {
48                    None
49                } else {
50                    Some(Kind::Minus2)
51                }
52            }
53            Some(b'=') => {
54                self.consume_char();
55                Some(Kind::MinusEq)
56            }
57            _ => Some(Kind::Minus),
58        }
59    }
60
61    pub(crate) fn re_lex_right_angle(&mut self) -> Token {
62        self.token.set_start(self.offset());
63        let kind = self.read_right_angle();
64        self.finish_next(kind)
65    }
66
67    fn read_right_angle(&mut self) -> Kind {
68        if self.next_ascii_byte_eq(b'>') {
69            if self.next_ascii_byte_eq(b'>') {
70                if self.next_ascii_byte_eq(b'=') { Kind::ShiftRight3Eq } else { Kind::ShiftRight3 }
71            } else if self.next_ascii_byte_eq(b'=') {
72                Kind::ShiftRightEq
73            } else {
74                Kind::ShiftRight
75            }
76        } else if self.next_ascii_byte_eq(b'=') {
77            Kind::GtEq
78        } else {
79            Kind::RAngle
80        }
81    }
82}