swc_ecma_lexer/common/lexer/
state.rs

1use swc_common::BytePos;
2
3use crate::common::syntax::SyntaxFlags;
4
5pub trait TokenType: TokenKind {
6    fn is_other_and_can_have_trailing_comment(self) -> bool;
7    fn is_other_and_before_expr_is_false(self) -> bool;
8}
9
10pub trait TokenKind: Copy {
11    fn is_dot(self) -> bool;
12    fn is_bin_op(self) -> bool;
13    fn is_semi(self) -> bool;
14    fn is_template(self) -> bool;
15    fn is_keyword(self) -> bool;
16    fn is_colon(self) -> bool;
17    fn is_lbrace(self) -> bool;
18    fn is_rbrace(self) -> bool;
19    fn is_lparen(self) -> bool;
20    fn is_rparen(self) -> bool;
21    fn is_keyword_fn(self) -> bool;
22    fn is_keyword_return(self) -> bool;
23    fn is_keyword_yield(self) -> bool;
24    fn is_keyword_else(self) -> bool;
25    fn is_keyword_class(self) -> bool;
26    fn is_keyword_let(self) -> bool;
27    fn is_keyword_var(self) -> bool;
28    fn is_keyword_const(self) -> bool;
29    fn is_keyword_if(self) -> bool;
30    fn is_keyword_while(self) -> bool;
31    fn is_keyword_for(self) -> bool;
32    fn is_keyword_with(self) -> bool;
33    fn is_lt(self) -> bool;
34    fn is_gt(self) -> bool;
35    fn is_arrow(self) -> bool;
36    fn is_ident(self) -> bool;
37    fn is_known_ident_of(self) -> bool;
38    fn is_slash(self) -> bool;
39    fn is_dollar_lbrace(self) -> bool;
40    fn is_plus_plus(self) -> bool;
41    fn is_minus_minus(self) -> bool;
42    fn is_back_quote(self) -> bool;
43    fn is_jsx_tag_start(self) -> bool;
44    fn is_jsx_tag_end(self) -> bool;
45    fn before_expr(self) -> bool;
46}
47
48pub trait State: Clone {
49    type TokenKind: std::fmt::Debug + Copy + TokenKind + Into<Self::TokenType>;
50    type TokenType: std::fmt::Debug + Copy + TokenType;
51
52    fn is_expr_allowed(&self) -> bool;
53    fn set_is_expr_allowed(&mut self, is_expr_allowed: bool);
54    fn set_next_regexp(&mut self, start: Option<BytePos>);
55    fn had_line_break(&self) -> bool;
56    fn mark_had_line_break(&mut self);
57    fn had_line_break_before_last(&self) -> bool;
58    fn token_contexts(&self) -> &crate::TokenContexts;
59    fn mut_token_contexts(&mut self) -> &mut crate::TokenContexts;
60    fn set_token_type(&mut self, token_type: Self::TokenType);
61    fn token_type(&self) -> Option<Self::TokenType>;
62    fn syntax(&self) -> SyntaxFlags;
63    fn prev_hi(&self) -> BytePos;
64    fn start(&self) -> BytePos;
65
66    fn can_have_trailing_line_comment(&self) -> bool {
67        let Some(t) = self.token_type() else {
68            return true;
69        };
70        !t.is_bin_op()
71    }
72
73    fn can_have_trailing_comment(&self) -> bool {
74        self.token_type().is_some_and(|t| {
75            !t.is_keyword()
76                && (t.is_semi() || t.is_lbrace() || t.is_other_and_can_have_trailing_comment())
77        })
78    }
79
80    fn last_was_tpl_element(&self) -> bool {
81        self.token_type().is_some_and(|t| t.is_template())
82    }
83}