-
-
Notifications
You must be signed in to change notification settings - Fork 665
feat(regex-parser): parse simple TemplateLiterals
#13265
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(regex-parser): parse simple TemplateLiterals
#13265
Conversation
How to use the Graphite Merge QueueAdd either label to this PR to merge it via the merge queue:
You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
CodSpeed Instrumentation Performance ReportMerging #13265 will not alter performanceComparing Summary
Footnotes
|
f146713
to
ada0a39
Compare
crates/oxc_regular_expression/src/parser/reader/string_literal_parser/mod.rs
Outdated
Show resolved
Hide resolved
a2bde20
to
e7f8ca4
Compare
TemplateLiterals
TemplateLiterals
e7f8ca4
to
f2c2e12
Compare
c94aa23
to
c2a7238
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR implements parsing of simple template literals in the regex parser, extending support beyond string literals to include template literals like new RegExp(\
pattern`)`. The implementation skips parsing when template literals contain expressions/substitutions.
- Adds a new
template_literal_parser
module with full template literal parsing capability - Refactors shared code (AST types, options, characters) to be accessible by both string and template literal parsers
- Updates regex utility functions to handle template literal arguments in RegExp constructors
Reviewed Changes
Copilot reviewed 15 out of 18 changed files in this pull request and generated 4 comments.
Show a summary per file
File | Description |
---|---|
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/parser_impl.rs |
Core template literal parser implementation with escape sequence handling |
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/mod.rs |
Module definition and comprehensive test cases |
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/diagnostics.rs |
Error diagnostics specific to template literal parsing |
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/ast.rs |
AST structure for template literals |
crates/oxc_regular_expression/src/parser/reader/reader_impl.rs |
Updated reader to detect and parse template literals |
crates/oxc_regular_expression/src/parser/reader/mod.rs |
Module restructuring to expose shared components |
crates/oxc_regular_expression/src/parser/reader/ast.rs |
Shared CodePoint AST structure moved from string parser |
crates/oxc_linter/src/utils/regex.rs |
Enhanced regex utilities to handle template literal arguments |
Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/parser_impl.rs
Show resolved
Hide resolved
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/parser_impl.rs
Show resolved
Hide resolved
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/parser_impl.rs
Show resolved
Hide resolved
@Sysix somehow this has ended up with conflicts 🫠 |
c2a7238
to
1774721
Compare
1774721
to
0eaa86f
Compare
a82939e
to
7e78e39
Compare
0eaa86f
to
455236e
Compare
455236e
to
b7a07ca
Compare
d8ce816
to
ca4f52f
Compare
Sorry for the slow response! 🙇🏻 I try to review by Saturday(during the flight), or at the latest by next Tuesday. |
No need to rush, glad you're offering your help with the regex parser |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Sysix Sorry for the delay!
As you noticed, there is still room for reducing duplicate lines, but I think we can address that at another time.
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/README.md
Show resolved
Hide resolved
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/parser_impl.rs
Outdated
Show resolved
Hide resolved
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/parser_impl.rs
Outdated
Show resolved
Hide resolved
crates/oxc_regular_expression/src/parser/reader/template_literal_parser/parser_impl.rs
Outdated
Show resolved
Hide resolved
ca4f52f
to
7ae6a05
Compare
7ae6a05
to
02a2ba8
Compare
Merge activity
|
@leaysgur thanks you, your approval is needed 🫶 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🚀
This PR adds the function to parse `TemplateLiteral`s. If the `new RegExp(`${variable}`)` or `new RegExp("", `${foo}`)` the parsing will be skipped, this is a different behavior then for `StringLiteral`s. https://github.com/eslint/eslint/blob/5082fc206de6946d9d4c20e57301f78839b3b9f2/tests/lib/rules/no-misleading-character-class.js#L91-L93 I would like to have a strict algo, when a regexp will be parsed and not. Currently, every rule does it by its own. https://github.com/oxc-project/oxc/blob/2cd4c7b42cd7d4d455dd1f64ee453e05d5da26ef/crates/oxc_linter/src/rules/eslint/no_control_regex.rs#L322 Moved some structs into the parent directory, so it can be consumed by both parsers. I guess `ParserTrait` could be helpful to share common methods like - consume_hex_digits - parse_unicode_escape_sequence
02a2ba8
to
9a205d1
Compare
## [1.16.0] - 2025-09-16 ### 🚀 Features - 97c8d06 linter: Add `preserve-caught-error` rule (#13748) (孔辉) - 8c19b18 linter/exhaustive-deps: Implement fixer for dep in global scope (#13783) (camc314) - 06bce8f linter/exhaustive-deps: Implement fixer for missing dep (#13782) (camc314) - a8675f4 linter: Add eslint/class-methods-use-this rule (#12977) (Peter Cardenas) - db33196 parser: Adds typescript rule for empty argument list (#13730) (Karan Kiri) - 2751193 linter: Add `eslint/no-useless-computed-key` rule (#13428) (yefan) - 9a205d1 regex-parser: Parse simple `TemplateLiterals` (#13265) (Sysix) ### 🐛 Bug Fixes - a2c91cd linter: Drop `rules` to allow mutable access to `ctx_host` in `run_external_rules` (#13832) (camc314) - 3af1e5d linter/no-unsafe-declaration-merging: Always mark first span as primary (#13830) (camc314) - 1c43c7c linter: Keep message when merging composite fixes (#13827) (camc314) - 26af302 linter/exhaustive-deps: Check stable value is on lhs of assignment expr (#13815) (camc314) - 4bc12d0 linter/exhaustive-deps: Remove impossible comparison with parent kind (#13814) (camc314) - 12baf5e linter/exhaustive-deps: Respect primary span when identifying disable directive location (#13781) (camc314) - fa7400a linter/no-undef: False positive with `arguments` in functions (#13763) (camc314) - 50e6e3c editor: Restrict servers paths for `oxc.path.server` (#13740) (Sysix) - b45077d editor: Strip leading slash for bin path on windows (#13738) (Sysix) - 8fa6227 editor: Don't allow `oxc.path.server` for untrusted workspaces (#13734) (Sysix) - 56da114 linter/react/jsx-handler-names: Do not detect the function name within the inline-function's body block (#13456) (Takuji Shimokawa) - b2bc5b4 linter/react-perf/jsx-no-new-object-as-prop: Skip as/satisfies exprs (#13718) (camc314) - ab51394 raw_transfer: Disable layout assertions on some 32-bit platforms (#13716) (overlookmotel) - 09428f6 linter/plugins: Remove outdated comment (#13691) (overlookmotel) - a294721 linter/plugins: Exit early if JS plugins enabled on unsupported platforms (#13689) (overlookmotel) - 68a2280 linter/plugins: More graceful exit for `--experimental-js-plugins` CLI option (#13688) (overlookmotel) ### 🚜 Refactor - 395d40d linter: Derive inmpls for `PartialEq`, `Eq` over manual ones (#13828) (camc314) - 8e4cd8f linter/func-names: Use `run_once` over looping over all nodes (#13798) (camc314) - 7f4e2fe eslint/func-names: Clean up implementation and improve documentation (#13601) (Antoine Zanardi) - 137896a language_server: Split options for linting and formatting (#13627) (Sysix) - 7346099 linter: Move `oxlint` application code into separate module (#13745) (overlookmotel) - 6dd4107 linter: Remove `#[cfg(test)]` attributes from `tester` module (#13714) (overlookmotel) - c40c6ef linter/plugins: Directory for JS plugins-related code (#13701) (overlookmotel) - a0022c1 linter/plugins: Improve error messages for JS plugins (#13699) (overlookmotel) - 1fd993f napi/oxlint: Rename `napi/oxlint2` to `napi/oxlint` (#13682) (overlookmotel) ### ⚡ Performance - 90c8286 linter: Detect node types from `let..else` statements (#13690) (camchenry) - 08c05df semantic: Make CFG construction a compile-time feature (#13678) (Boshen) ### 🎨 Styling - 99a7638 linter: Add comments + re-organise imports (#13715) (overlookmotel) ### 🧪 Testing - 18a1145 linter: Add debug assertions for skipping rules (#13724) (camc314) - cb080de linter/no-unused-vars: Add test for non ASCII chars in JSX components (#13820) (camc314) - b6eba27 linter/no-undef: Add more test cases for `arguments` (#13764) (camc314) - fb2d087 linter: Set CWD for tests (#13722) (overlookmotel) Co-authored-by: camc314 <[email protected]>
This PR adds the function to parse
TemplateLiteral
s.If the
new RegExp(
${variable})
ornew RegExp("",
${foo})
the parsing will be skipped, this is a different behavior then forStringLiteral
s.https://github.com/eslint/eslint/blob/5082fc206de6946d9d4c20e57301f78839b3b9f2/tests/lib/rules/no-misleading-character-class.js#L91-L93
I would like to have a strict algo, when a regexp will be parsed and not. Currently, every rule does it by its own.
oxc/crates/oxc_linter/src/rules/eslint/no_control_regex.rs
Line 322 in 2cd4c7b
Moved some structs into the parent directory, so it can be consumed by both parsers. I guess
ParserTrait
could be helpful to share common methods like