fix(codegen): preserve property key annotations - #25766
Conversation
7aa3f4b to
c44def1
Compare
Merging this PR will improve performance by 3.13%
|
| Mode | Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|---|
| ⚡ | Simulation | property_mangler[binder.ts] |
1.9 ms | 1.8 ms | +3.13% |
Tip
Curious why this is faster? Comment @codspeedbot explain why this is faster on this PR, or directly use the CodSpeed MCP with your agent.
Comparing codex/preserve-property-key-comments (503aecb) with main (c1f7d7d)2
Footnotes
-
9 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩
-
No successful run was found on
main(a824865) during the generation of this report, so c1f7d7d was used instead as the comparison base. There might be some changes unrelated to this pull request in this report. ↩
5f08776 to
2f5cdb1
Compare
c44def1 to
016b115
Compare
|
@codex review |
|
Codex Review: Didn't find any major issues. Another round soon, please! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
8a4bdc2 to
503aecb
Compare
Monitor OxcCommit:
|
Merge activity
|
`@__KEY__` and `#__KEY__` are currently treated as normal comments. Codegen can drop them before a later property-mangling pass. The property may then be renamed while the annotated string keeps its old name.
This classifies the marker as a property-key annotation. Codegen keeps it next to string and no-substitution template literals when annotation comments are enabled, and the property mangler reads that classification instead of scanning source text. Final output still follows the normal comment options, so whitespace-minified or annotation-disabled output removes the marker.
## Example
Input:
```js
const object = { _field: 1 };
const key = /* #__KEY__ */ "_field";
object[key];
```
Before, an intermediate codegen pass could remove the marker:
```js
const object = { _field: 1 };
const key = "_field";
object[key];
```
After, the marker survives for the later property-mangling pass.
Verified with the affected crate suites, `just minsize`, workspace lint, docs, AST generation, and independent review. `just ready` is only blocked locally by existing Node-version and terminal-color snapshot differences.
Implemented with AI assistance (OpenAI Codex). I reviewed and understand the changes and remain responsible for this contribution under the repository AI usage policy.
503aecb to
8ab883a
Compare
oxc-project/oxc#25766 Oxc-Revision: 8ab883afaa98526867fec269a98049a847fc89ef
### 💥 BREAKING CHANGES - 365274e packages/codegen: [**BREAKING**] `printSync` return an object (#25720) (overlookmotel) ### 🚀 Features - 6a7eb60 packages/codegen: Alter capitalization of `sourceFilename` option (#25854) (overlookmotel) - 300763f packages/codegen: Add full source map support (#25585) (camc314) - a169e4a napi/minify: Expose property name mangling options (#24741) (Dunqing) - 2f5cdb1 minifier: Add property name mangling (#24740) (Dunqing) - 4922141 mangler: Deduplicate private accessor names (#25601) (camc314) - 1c4f519 napi: Add Relay transform plugin (#25503) (Boshen) - a4478e9 codegen: Add `oxc-codegen` package (#25488) (overlookmotel) ### 🐛 Bug Fixes - 0fbcf64 codegen: Validate sourcemap options (#25860) (camc314) - 345f981 react_compiler: Skip node_modules by default (#25859) (Boshen) - ab81f3f minifier: Drop side-effect-free additions (#25639) (Dunqing) - 241c559 napi/minify: Accept RegExp for property filters (#25827) (Dunqing) - 4cc7ea4 codegen: Reject invalid indent options (#25807) (camc314) - 53f9295 isolated-declarations: Preserve undefined for defaulted any (#25292) (camc314) - 8ab883a codegen: Preserve property key annotations (#25766) (Dunqing) - b13fd48 minifier: Model uninitialized module vars as undefined (#25497) (Dunqing) - f6000ac ecmascript: Fold `**` with `Number::exponentiate`, not IEEE `pow` (#25644) (Kotaro Chikuba) - b846abc isolated-declarations: Handle ambient expando properties (#25655) (camc314) - dec0a86 react-compiler: Standardize diagnostics (#25702) (Boshen) - fca2e0c parser: Reject initialized lexical declarations in for-in (#25700) (Boshen) - ae9be8f parser: Forbid type parameters on quoted constructors (#25696) (Boshen) - c5f188a react-compiler: Use Babel v1 validation defaults (#25676) (Boshen) - db44651 napi: Disable reuseWorker in browser bindings (#25640) (leaysgur) - ce35d47 react_compiler: Preserve JSX import source pragmas (#25592) (Boshen) - 059784d semantic: Respect shadowed `Infinity` and `NaN` in enum evaluation (#25604) (camc314) - bb5a232 minifier: Keep variable declaration initilized with class when keepNames is enabled (#25584) (sapphi-red) - f49229d minifier: Keep side effects when rotating bitwise operands (#25596) (Kotaro Chikuba) - e82495b ecmascript: Derive `ToNumber` of `!x` from `ToBoolean` (#25595) (Kotaro Chikuba) - 509931b semantic: Classify global references per identifier (#25608) (camc314) - 80484ce mangler: Correct base54 safety comment (#25606) (camc314) - c1369a7 codegen: Resolve private names in class heritage (#25588) (camc314) - c002f29 codegen: Escape sources for empty import specifiers (#25586) (camc314) - 0c68b7f estree: Emit `decorators` on `FormalParameterRest` (#25582) (camc314) - cdf1846 semantic: Allow legacy escapes in JSX attributes (#25576) (Boshen) - e75e102 minifier: Preserve block statement in labeled iteration statements (#25162) (Armano) - 771d79a mangler: Exclude non-manglable symbols from slot assignment (#25539) (sapphi-red) - 76b19f5 minifier: Avoid duplicating large folded strings (#25532) (Dunqing) - 59e8895 codegen: Validate starting indent level (#25550) (camc314) - 88b34f2 clippy: Remove unneeded `unsafe` (#25551) (camc314) - 23a7ad0 parser: Stop delimited lists at end of file (#25542) (Boshen) - 73acba9 parser: Preserve fatal errors during await reparse (#25541) (Boshen) - c3e99d1 minifier: Avoid invalid octal escapes in template folds (#25495) (Dunqing) - b4e6a9e codegen: Output newline after `export default interface` (#25487) (overlookmotel) - 5fcf683 minifier: Correct issue with try finally termination (#25185) (Armano) - 1645d93 react_compiler: Preserve source spans (#25462) (Boshen) - 8d7f9cf react_compiler: Honor eslint suppressions (#25394) (Boshen) ### ⚡ Performance - 568203e ecmascript: Use binary search for known globals (#25817) (Boshen) - c84ede3 estree_tokens: Share JS token update entry point (#25826) (Boshen) - 9a6e862 minifier: Move owned statements directly (#25835) (Dunqing) - 61b2aef minifier: Move owned AST nodes directly (#25837) (Dunqing) - 673b04b minifier: Replace expressions without take_in dummies (#25836) (Dunqing) - 63ff8ef linter: Outline diagnostic construction (#25762) (Boshen) - 621808e diagnostics: Measure graphemes lazily (#25723) (Boshen) - f62ed0e diagnostics: Optimize graphical number rendering (#25715) (Boshen) - 7152834 diagnostics: Reduce graphical formatting overhead (#25714) (Boshen) - 10fc4b7 diagnostics: Reduce graphical rendering allocations (#25711) (Boshen) - 9c8abab diagnostics: Batch graphical reports (#25710) (Boshen) - 757f3d4 mangler: Share allocated names across reused slots (#25605) (camc314) - 5444cbf codegen: Skip escaping harmless `<` tokens (#25564) (camc314) ### 📚 Documentation - 58f7ab9 packages/codegen: Reformat docs and comments (#25848) (overlookmotel) - 627466e transform-react: Document all options (#25800) (Boshen) - ce03ac1 packages/codegen: Fix JSDoc comments for `printSync` (#25722) (overlookmotel) - 386a699 packages/codegen: Correct JSDoc comment (#25716) (overlookmotel) - 31e571d mangler: Update code example (#25599) (camc314) - fd62354 codegen: Revamp package readme (#25560) (camc314) - ffa3153 codegen: Clarify raw transfer Node requirement (#25565) (camc314) - c5d4063 codegen: Clarify binary walk allocations (#25562) (camc314) - 5703d7a codegen: Correct stale printer comments (#25561) (camc314) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
oxc-project/oxc#25766 Oxc-Revision: 8ab883afaa98526867fec269a98049a847fc89ef
oxc-project/oxc#25766 Oxc-Revision: 8ab883afaa98526867fec269a98049a847fc89ef
@__KEY__and#__KEY__are currently treated as normal comments. Codegen can drop them before a later property-mangling pass. The property may then be renamed while the annotated string keeps its old name.This classifies the marker as a property-key annotation. Codegen keeps it next to string and no-substitution template literals when annotation comments are enabled, and the property mangler reads that classification instead of scanning source text. Final output still follows the normal comment options, so whitespace-minified or annotation-disabled output removes the marker.
Example
Input:
Before, an intermediate codegen pass could remove the marker:
After, the marker survives for the later property-mangling pass.
Verified with the affected crate suites,
just minsize, workspace lint, docs, AST generation, and independent review.just readyis only blocked locally by existing Node-version and terminal-color snapshot differences.Implemented with AI assistance (OpenAI Codex). I reviewed and understand the changes and remain responsible for this contribution under the repository AI usage policy.