use crate::state::CheckerState;
impl<'a> CheckerState<'a> {
pub(crate) fn validate_regex_literal_flags(&mut self, idx: tsz_parser::parser::NodeIndex) {
use tsz_common::diagnostics::diagnostic_codes;
use tsz_scanner::SyntaxKind;
let Some(node) = self.ctx.arena.get(idx) else {
return;
};
if node.kind != SyntaxKind::RegularExpressionLiteral as u16 {
return;
}
let Some(literal) = self.ctx.arena.get_literal(node) else {
return;
};
let text = &literal.text;
if let Some(last_slash_pos) = text.rfind('/') {
let flags = &text[last_slash_pos + 1..];
let target = self.ctx.compiler_options.target;
for (i, ch) in flags.char_indices() {
let (_required_target, target_name) = match ch {
'u' | 'y' => (tsz_common::ScriptTarget::ES2015, "ES2015"),
's' => (tsz_common::ScriptTarget::ES2018, "ES2018"),
'd' => (tsz_common::ScriptTarget::ES2022, "ES2022"),
'v' => (tsz_common::ScriptTarget::ESNext, "ESNext"),
_ => continue, };
let target_supports_flag = match ch {
'u' | 'y' => target.supports_es2015(),
's' => target.supports_es2018(),
'd' => target.supports_es2022(),
'v' => target == tsz_common::ScriptTarget::ESNext,
_ => true,
};
if !target_supports_flag {
let flag_pos = ((node.pos as usize) + last_slash_pos + 1 + i) as u32;
self.error(
flag_pos,
1,
format!(
"This regular expression flag is only available when targeting '{target_name}' or later."
),
diagnostic_codes::THIS_REGULAR_EXPRESSION_FLAG_IS_ONLY_AVAILABLE_WHEN_TARGETING_OR_LATER,
);
}
}
}
}
}