fix(parser): preserve legal comments with @preserve/@license when preceded by other annotations#15929
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. |
CodSpeed Performance ReportMerging #15929 will not alter performanceComparing Summary
Footnotes
|
There was a problem hiding this comment.
Pull Request Overview
This PR fixes a bug where legal comments containing @preserve or @license were not being detected when preceded by other annotations like @foo. The parser was only checking if the first @ annotation matched known patterns, missing legal annotations that appeared later in the comment.
Key changes:
- Added early returns after detecting
__PURE__and__NO_SIDE_EFFECTS__annotations to avoid unnecessary fallthrough - Added fallback check using
contains_license_or_preserve_commentto detect@license/@preserveanywhere in comment text - Added test coverage for comments with unknown annotations preceding legal annotations
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Merge activity
|
…ceded by other annotations (#15929) Legal comments like `/* @foo @preserve */` were not being preserved when legal comment output was enabled. The parser only checked if the first `@` annotation matched known patterns, missing `@preserve`/`@license` later in the comment. ## Changes **Parser (`oxc_parser/src/lexer/trivia_builder.rs`)** - Add fallback check using `contains_license_or_preserve_comment` after `__PURE__`/`__NO_SIDE_EFFECTS__` checks - Ensures `@license`/`@preserve` detected anywhere in comment text ## Example ```javascript // Before: Legal comment not detected by parser /* @foo @preserve */ function foo() {} // Parser classifies as: CommentContent::None ❌ // After: Legal comment correctly detected /* @foo @preserve */ function foo() {} // Parser classifies as: CommentContent::Legal ✅ ``` Related: rolldown/rolldown#7160 <!-- START COPILOT CODING AGENT SUFFIX --> <details> <summary>Original prompt</summary> > `/* @foo @preserve */` should be preserved when legal comment output is enabled even if comment output is disabled. rolldown/rolldown#7160 is related </details> <!-- START COPILOT CODING AGENT TIPS --> --- ✨ Let Copilot coding agent [set things up for you](https://github.com/oxc-project/oxc/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo.
e359825 to
622cb5e
Compare
…ceded by other annotations (#15929) Legal comments like `/* @foo @preserve */` were not being preserved when legal comment output was enabled. The parser only checked if the first `@` annotation matched known patterns, missing `@preserve`/`@license` later in the comment. ## Changes **Parser (`oxc_parser/src/lexer/trivia_builder.rs`)** - Add fallback check using `contains_license_or_preserve_comment` after `__PURE__`/`__NO_SIDE_EFFECTS__` checks - Ensures `@license`/`@preserve` detected anywhere in comment text ## Example ```javascript // Before: Legal comment not detected by parser /* @foo @preserve */ function foo() {} // Parser classifies as: CommentContent::None ❌ // After: Legal comment correctly detected /* @foo @preserve */ function foo() {} // Parser classifies as: CommentContent::Legal ✅ ``` Related: rolldown/rolldown#7160 <!-- START COPILOT CODING AGENT SUFFIX --> <details> <summary>Original prompt</summary> > `/* @foo @preserve */` should be preserved when legal comment output is enabled even if comment output is disabled. rolldown/rolldown#7160 is related </details> <!-- START COPILOT CODING AGENT TIPS --> --- ✨ Let Copilot coding agent [set things up for you](https://github.com/oxc-project/oxc/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo.
### 💥 BREAKING CHANGES - cbb27fd ast: [**BREAKING**] Add `TSGlobalDeclaration` type (#15712) (overlookmotel) ### 🚀 Features - 0c1f82b linter/plugins: Add `tokens` property to `Program` (#16020) (overlookmotel) - 6cff132 span: Add `Span::merge_within` method (#15869) (sapphi-red) - 102365d allocator/vec: Add `Vec::into_bump_slice` method (#15770) (Dunqing) ### 🐛 Bug Fixes - e2ca770 codegen: Add support for printing type arguments in new expressions (#15963) (Ives van Hoorne) - 2bd3cb6 apps, editors, napi: Fix `oxlint-disable` comments (#16014) (overlookmotel) - 622cb5e parser: Preserve legal comments with @preserve/@license when preceded by other annotations (#15929) (copilot-swe-agent) - 7c46a9e transformer/tagged-template-transform: Handle `\n` escape sequences (#15830) (Dunqing) - f386efc minifier: Avoid generating invalid spans (#15778) (sapphi-red) - d4ff004 parser: Forbid invalid modifiers on `module` and `global` (#15723) (overlookmotel) - 2191ae9 semantic: Allow reserved keywords in typescript ambient contexts (#15495) (sapphi-red) - 7d1ebad isolated-declarations: Incorrect nested namespace output in isolated declarations (#15800) (copilot-swe-agent) ### ⚡ Performance - b4b0ed8 transformer/typescript: Reverse order of checks (#15722) (overlookmotel) ### 📚 Documentation - c81a331 data_structures: Doc comments on fields of `Stack` (#15793) (overlookmotel) - cfae31d allocator: Use `allocator` as var name in examples (#15781) (overlookmotel) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
…ceded by other annotations (oxc-project#15929) Legal comments like `/* @foo @preserve */` were not being preserved when legal comment output was enabled. The parser only checked if the first `@` annotation matched known patterns, missing `@preserve`/`@license` later in the comment. ## Changes **Parser (`oxc_parser/src/lexer/trivia_builder.rs`)** - Add fallback check using `contains_license_or_preserve_comment` after `__PURE__`/`__NO_SIDE_EFFECTS__` checks - Ensures `@license`/`@preserve` detected anywhere in comment text ## Example ```javascript // Before: Legal comment not detected by parser /* @foo @preserve */ function foo() {} // Parser classifies as: CommentContent::None ❌ // After: Legal comment correctly detected /* @foo @preserve */ function foo() {} // Parser classifies as: CommentContent::Legal ✅ ``` Related: rolldown/rolldown#7160 <!-- START COPILOT CODING AGENT SUFFIX --> <details> <summary>Original prompt</summary> > `/* @foo @preserve */` should be preserved when legal comment output is enabled even if comment output is disabled. rolldown/rolldown#7160 is related </details> <!-- START COPILOT CODING AGENT TIPS --> --- ✨ Let Copilot coding agent [set things up for you](https://github.com/oxc-project/oxc/issues/new?title=✨+Set+up+Copilot+instructions&body=Configure%20instructions%20for%20this%20repository%20as%20documented%20in%20%5BBest%20practices%20for%20Copilot%20coding%20agent%20in%20your%20repository%5D%28https://gh.io/copilot-coding-agent-tips%29%2E%0A%0A%3COnboard%20this%20repo%3E&assignees=copilot) — coding agent works faster and does higher quality work when set up for your repo.
### 💥 BREAKING CHANGES - cbb27fd ast: [**BREAKING**] Add `TSGlobalDeclaration` type (oxc-project#15712) (overlookmotel) ### 🚀 Features - 0c1f82b linter/plugins: Add `tokens` property to `Program` (oxc-project#16020) (overlookmotel) - 6cff132 span: Add `Span::merge_within` method (oxc-project#15869) (sapphi-red) - 102365d allocator/vec: Add `Vec::into_bump_slice` method (oxc-project#15770) (Dunqing) ### 🐛 Bug Fixes - e2ca770 codegen: Add support for printing type arguments in new expressions (oxc-project#15963) (Ives van Hoorne) - 2bd3cb6 apps, editors, napi: Fix `oxlint-disable` comments (oxc-project#16014) (overlookmotel) - 622cb5e parser: Preserve legal comments with @preserve/@license when preceded by other annotations (oxc-project#15929) (copilot-swe-agent) - 7c46a9e transformer/tagged-template-transform: Handle `\n` escape sequences (oxc-project#15830) (Dunqing) - f386efc minifier: Avoid generating invalid spans (oxc-project#15778) (sapphi-red) - d4ff004 parser: Forbid invalid modifiers on `module` and `global` (oxc-project#15723) (overlookmotel) - 2191ae9 semantic: Allow reserved keywords in typescript ambient contexts (oxc-project#15495) (sapphi-red) - 7d1ebad isolated-declarations: Incorrect nested namespace output in isolated declarations (oxc-project#15800) (copilot-swe-agent) ### ⚡ Performance - b4b0ed8 transformer/typescript: Reverse order of checks (oxc-project#15722) (overlookmotel) ### 📚 Documentation - c81a331 data_structures: Doc comments on fields of `Stack` (oxc-project#15793) (overlookmotel) - cfae31d allocator: Use `allocator` as var name in examples (oxc-project#15781) (overlookmotel) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Legal comments like
/* @foo @preserve */were not being preserved when legal comment output was enabled. The parser only checked if the first@annotation matched known patterns, missing@preserve/@licenselater in the comment.Changes
Parser (
oxc_parser/src/lexer/trivia_builder.rs)contains_license_or_preserve_commentafter__PURE__/__NO_SIDE_EFFECTS__checks@license/@preservedetected anywhere in comment textExample
Related: rolldown/rolldown#7160
Original prompt
✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.