swc_ecma_regexp/parser/reader/string_literal_parser/
characters.rs

1pub const LF: char = '\n';
2pub const CR: char = '\r';
3pub const LS: char = '\u{2028}';
4pub const PS: char = '\u{2029}';
5
6// ```
7// LineTerminator ::
8//   <LF>
9//   <CR>
10//   <LS>
11//   <PS>
12// ```
13pub fn is_line_terminator(ch: char) -> bool {
14    matches!(ch, LF | CR | LS | PS)
15}
16
17// ```
18// SingleEscapeCharacter :: one of
19//   ' " \ b f n r t v
20// ```
21pub fn is_single_escape_character(ch: char) -> bool {
22    matches!(ch, '\'' | '"' | '\\' | 'b' | 'f' | 'n' | 'r' | 't' | 'v')
23}
24
25// ```
26// NonEscapeCharacter ::
27//   SourceCharacter but not one of EscapeCharacter or LineTerminator
28//
29// EscapeCharacter ::
30//   SingleEscapeCharacter
31//   DecimalDigit
32//   x
33//   u
34// ```
35pub fn is_non_escape_character(ch: char) -> bool {
36    let is_escape_character =
37        |ch| is_single_escape_character(ch) || ch.is_ascii_digit() || matches!(ch, 'x' | 'u');
38
39    if is_escape_character(ch) || is_line_terminator(ch) {
40        return false;
41    }
42    true
43}