swc_ecma_lexer/common/lexer/
state.rs1use 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}