-
-
Notifications
You must be signed in to change notification settings - Fork 488
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
fix(ast): fix ContentEq
and ContentHash
impls for literal types
#8426
fix(ast): fix ContentEq
and ContentHash
impls for literal types
#8426
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 Performance ReportMerging #8426 will not alter performanceComparing Summary
|
@Boshen would you mind taking a look at this? Sounds like you're using I think it's all uncontroversial except: NaN in
|
fa8e631
to
afd202f
Compare
f712380
to
b29655f
Compare
afd202f
to
21aa03e
Compare
Merge activity
|
…8426) Fix implementations of `ContentEq` and `ContentHash` for literal AST types: * `NullLiteral::content_hash` is a no-op, same as other types which only contain a `Span`. * `NumericLiteral::content_eq` and `content_hash` ignore `base` field. * `NumericLiteral::content_hash` works around `0.0 == -0.0`. * `BigIntLiteral::content_eq` and `content_hash` ignore `base` field. * `StringLiteral::content_hash` ignore `raw` field. * `RegExpLiteral::content_eq` and `content_hash` consider 2 `RegExp`s to be equal if they are printed the same (regardless of whether they were parsed by `oxc_regular_expression` or not). Additionally, implement `StringLiteral::content_eq` manually to avoid "special case" logic in `oxc_ast_tools`.
21aa03e
to
97a7992
Compare
Not a huge deal if we don't minify a piece of code that contain literals |
## [0.45.0] - 2025-01-11 - 7f69561 ast: [**BREAKING**] `oxc_ast` do not export `BigUint` (#8428) (overlookmotel) - d8b27af ast: [**BREAKING**] No unneccesary trailing underscores on `AstBuilder` method names (#8283) (overlookmotel) - 5106088 ast: [**BREAKING**] Remove `FromIn<Expression> for Statement` (#8280) (overlookmotel) ### Features - 6c7acac allocator: Implement `IntoIterator` for `&mut Vec` (#8389) (overlookmotel) - 3212bcd ast_tools: Ignore `raw` field of `NumericLiteral` and `StringLiteral` in `ContentEq` (#8417) (Boshen) - ad146bb codegen: Print real newline when `\n` is inside template literals (#8178) (Boshen) - 41ddf60 minfier: Add `CompressOptions::target` (#8179) (Boshen) - d56020b minifier: Drop `0` from `new Int8Array(0)` and other TypedArrays (#8431) (sapphi-red) - f935d94 minifier: Remove `new` from NativeErrors / `AggregateError` (#8430) (sapphi-red) - dab7a51 minifier: Minimize not `!(x === undefined)` -> `x !== undefined` (#8429) (Boshen) - 0e7bab8 minifier: Remove `if(false){}` in a single pass (#8421) (Boshen) - 5b5b844 minifier: Fold `ambiguous if else` (#8415) (Boshen) - 438a6e7 minifier: Minimize conditions in boolean context (#8381) (Boshen) - 793cb43 minifier: `a != null ? a : b` -> `a ?? b` (#8352) (camc314) - 814da55 minifier: Compress `x = x || 1` to `x ||= 1` (#8368) (sapphi-red) - a596821 minifier: Compress `a.b = a.b + c` to `a.b += c` (#8367) (sapphi-red) - 579eb60 minifier: Compress `a.b || (a.b = c)` to `a.b ||= c` (#8366) (sapphi-red) - f367a16 minifier: Port esbuild conditional expr minification (#8351) (camc314) - 8d52cd0 minifier: Merge assign expression in conditional expression (#8345) (sapphi-red) - a69d15f minifier: Compress `new Array(2)` -> `[,,]` (#8344) (sapphi-red) - 819c475 minifier: Compress `new Array(7n)` -> `[7n]` (#8343) (sapphi-red) - e085d66 minifier: Remove empty IIFE (#8340) (Boshen) - 2c2e483 minifier: Fold object spread `({ ...null })` -> `({})` (#8339) (Boshen) - 6220e05 minifier: Remove empty if statment `if (test) {}` -> `test` (#8336) (Boshen) - a76dfae minifier: Remove label statement with empty body (#8333) (Boshen) - e88a6bd minifier: Minimize `!0 + null !== 1` -> `!0 + null != 1` (#8332) (Boshen) - ec88c68 minifier: Compress `a || (a = b)` to `a ||= b` (#8315) (sapphi-red) - e6fe84d minifier: Compress `a = a + b` to `a += b` (#8314) (sapphi-red) - 9ea4e31 minifier: Remove `new` from `new Error`/`new Function`/`new RegExp` (#8313) (sapphi-red) - 051fbb6 minifier: Minimize `x["0"]` -> x[0] (#8316) (Boshen) - a542013 minifier: Minimize `do{}while(true)` -> `do;while(true)` (#8311) (Boshen) - e3ff81e minifier: Minimize `(x = 1) === 1` -> `(x = 1) == 1` (#8310) (Boshen) - 4b68cc0 minifier: Minimize empty `try` statement (#8309) (Boshen) - 922c514 minifier: Fold `.toString()` (#8308) (Boshen) - 66a2443 minifier: Minify sequence expressions (#8305) (camc314) - af65c36 minifier: Minimize double negated binary expressions (#8304) (camc314) - 76c778b minifier: Remove logical nots when arg is a delete expression (#8303) (camc314) - 5ed439b minifier: Minify typeof in binary expressions (#8302) (camc314) - 6afc590 minifier: Compress typeof addition string (#8301) (camc314) - ecc789f minifier: Fold `if(x >> y == 0){}` -> `if(!(x >> y)){}` (#8277) (Boshen) - 0e3b79a minifier: Fold `String()` -> `''`, `Number()` -> `false` (#8274) (Boshen) - c9cf593 minifier: Compress property key `{[1]: _}` -> {1: _} (#8272) (Boshen) - b92b2ab minifier: Fold `BigInt(1n)` -> `1n` (#8270) (Boshen) - a4df387 minifier: Compress loose equals undefined (#8268) (camc314) - f000596 minifier: Minify call expressionsto `Number` (#8267) (camc314) - 092aeaf minifier: Flatten spread args in call expressions (#8266) (camc314) - 04ec38d minifier: Remove unused arrow function expressions (#8262) (camc314) - e446c15 minifier: Improve minimizing unary not expressions (#8261) (camc314) - 7f19211 minifier: Minimize unary expression statements (#8256) (camc314) - cec63e2 minifier: `{}` evals to `f64::NaN` (Boshen) - 4d8a08d minifier: Improve constant evaluation (#8252) (Boshen) - e84f267 minifier: Compress more property keys (#8253) (Boshen) - d1224f9 minifier: Improve minimizing conditional expressions (#8251) (camc314) - 65f46f5 minifier: Constant fold `String.fromCharCode` (#8248) (Boshen) - bd8d677 minifier: Minimize `~undefined`, `~null`, `~true`, `~false` (#8247) (Boshen) - f73dc9e minifier: Constant fold `'x'.toString()` and `true.toString()` (#8246) (Boshen) - fd5af73 minifier: Minimize `Number` constructor (#8245) (Boshen) - 2f52f33 minifier: Minsize `!!!foo ? bar : baz` -> `foo ? baz : bar` (#8244) (Boshen) - ccdc039 minifier: Always put literals on the rhs of equal op `1==x` => `x==1` (#8240) (Boshen) - 39353b2 minifier: Improve minimizing conditionals (#8238) (Cameron) - c90fc16 minifier: Restore conditional minification and fix edge case (#8235) (camc314) - 6c8ee9f minifier: Remove last redundant `return` statement (#8234) (Boshen) - 51f4792 minifier: Minimize `foo ? foo : bar` and `foo ? bar : foo` (#8229) (Boshen) - 6e2ec17 minifier: Statement fusion switch cases; improved minimize exit poitns (#8228) (Boshen) - 574a242 minifier: Minimize all variants of `typeof x == 'undefined'` (#8227) (Boshen) - 2041477 minifier: Fold `if(x)return;y` -> `if(!x)y` (#8226) (Boshen) - 9c1afa4 minifier: Optional catch binding when catch param is unused (#8221) (Boshen) - 4a29845 minifier: Add `ConvertToDottedProperties` (#8212) (Boshen) - 2786dea minifier: Add `RemoveUnusedCode` (#8210) (Boshen) - cd274ee minifier: Minimize logical exprs (#8209) (Cameron) - 4ae15df minifier: Imprve more conditional expr minification with boolean lit (#8208) (camc314) - 3202b4f minifier: Imprve conditional expr minification with boolean lit (#8207) (camc314) - 3b45011 minifier: Handle conditional expr with boolean lit (#8206) (camc314) - 4c2059a minifier: Reverse negated conditional exprs (#8205) (camc314) - 4804933 minifier: Add `MinimizeExitPoints` and ExploitAssigns` boilerplate (#8203) (Boshen) - bf266e1 minifier: Try collapse conditional to logical or expr (#8197) (Cameron) - 06e1780 minifier: Improve `StatementFusion` (#8194) (Boshen) - 42e211a minifier: Only constant fold numbers when result is smaller (#8092) (Boshen) - d0de560 minifier: Change `NaN` to `f64::NAN` (#8191) (Boshen) - cef8eb8 minifier: Change `foo?.['bar']` to `foo?.bar` (#8176) (翠 / green) - 8149e34 minifier: Optional catch binding when es target >= es2019 (#8180) (Boshen) - fc43ec5 minifier: Fold `string.length` / `array.length` (#8172) (sapphi-red) - 29dc0dc minifier: Change `foo['bar']` -> foo.bar (#8169) (Boshen) - 3c5718d minifier: Fold `typeof foo == undefined` into `foo == undefined` when possible (#8160) (翠 / green) - f3a36e1 minifier: Fold `typeof foo != "undefined"` into `typeof foo < "u"` (#8159) (翠 / green) - 37c9959 minifier: Normalize `Infinity` into `f64::Infinity` (#8148) (Boshen) - 8fb71f5 minifier: Minify string `PropertyKey` (#8147) (Boshen) - 6615e1e minifier: Constant fold `instanceof` (#8142) (翠 / green) - 2b2a373 minifier: Minimize `a + 'b' + 'c'` -> `a + 'bc'` (#8137) (Boshen) - 213364a minifier: Minimize `if (x) if (y) z` -> `if (x && y) z` (#8136) (Boshen) - 6b51e6d minifier: Minimize `if(foo) bar else baz` -> `foo ? bar : baz` (#8133) (Boshen) - f615bfa minifier: Minimize `if (x) return; return 1` -> `return x ? void 0 : 1` (#8130) (Boshen) - f0b1ee5 minifier: Minimize `if(!x) foo()` -> `x || foo()` (#8122) (Boshen) - f8200a8 minifier: Minimize `if(foo) bar` -> `foo && bar` (#8121) (Boshen) - 72d9967 minifier: Add `Normalize` ast pass (#8120) (Boshen) - fef0b25 minifier: Collapse `var` into for loop initializer (#8119) (Boshen) - 2331ea8 minifier: `typeof foo === 'number'` => `typeof foo == 'number'` (#8112) (Boshen) - ad9a0a9 mininifier: Minimize variants of `a instanceof b == true` (#8241) (Boshen) - 2da4365 parser: Missing initializer in destructuring declaration inside for loop head (#8222) (Boshen) - 55744fd semantic: Allow getting mutable reference to symbols table (#8189) (Max Stoumen) - 0592a8b transformer/class-properties: Transform private in expression (#8202) (Dunqing) - ad77ad5 transformer/class-properties: Transform static/instance accessor methods (#8132) (Dunqing) - e405f79 transformer/class-properties: Transform static private method invoking (#8117) (Dunqing) - 3303e99 transformer/class-properties: Insert statements after statement of class expression (#8116) (Dunqing) - 0cc71cf transformer/class-properties: Transform super expressions and identifiers that refers to class binding in private method (#8106) (Dunqing) - 58ed832 transformer/class-properties: Transform private field expression which invokes private method (#8102) (Dunqing) - f14567a transformer/class-properties: Transform callee which invokes private method (#8100) (Dunqing) - 13349ef transformer/class-properties: Transform private methods (#8099) (Dunqing) ### Bug Fixes - eb25bc0 allocator: Fix lifetimes on `IntoIterator` for `Vec` (#8388) (overlookmotel) - 97a7992 ast: Fix `ContentEq` and `ContentHash` impls for literal types (#8426) (overlookmotel) - a1752a0 codegen: Fix incorrect minified `return 1n` output (#8374) (Boshen) - 5a648bc codegen: Fix white space issue with do statements (#8348) (Boshen) - b6d16f4 codegen: Print parenthesis on negative bigint lit when neccessary (#8258) (camc314) - 8ed9766 codegen: Source map builder panicked because it attempted to subtract with overflow in `search_original_line_and_column` (#8185) (Dunqing) - ad61e70 codegen: Print if else without block with proper indentation (#8135) (Boshen) - 74572de ecmascript: Incorrect `to_int_32` value for Infinity (#8144) (翠 / green) - e1f8ea4 lexer: `Source` is not `Clone` (#8294) (overlookmotel) - 5c63414 mangler: Keep exported symbols for `top_level: true` (#7927) (翠 / green) - 3c93549 minifier: Dce if statement should keep side effects and vars (#8433) (Boshen) - 52f88c0 minifier: Rotate associative operators to make it more idempotent (#8424) (camc314) - a80460c minifier: Correctly set `self.changed` when minimizing if stmts (#8420) (camc314) - d4ca8d4 minifier: `!!x` is not idempotent in `RemoveDeadCode` (#8419) (Boshen) - 357b61d minifier: Do not minify `Object.defineProperty` in sequence expressions (#8416) (Boshen) - 0efc845 minifier: `+0n` produces `TypeError` (#8410) (Boshen) - 7ce6a7c minifier: `a in b` has error throwing side effect (#8406) (Boshen) - 2f3a9dc minifier: Cannot transform property key `#constructor` (#8405) (Boshen) - c0a3dda minifier: `instanceof` has error throwing side effect (#8378) (Boshen) - 5516f7f minifier: Do not fold object comparisons (#8375) (Boshen) - cb098c7 minifier: Computed property key `prototype` cannot be changed (#8373) (Boshen) - 82ee77e minifier: Do not remove shadowned `undefined` in return statement (#8371) (Boshen) - f87da16 minifier: Do not fold literals in `-0 != +0` (#8278) (Boshen) - 62a2644 minifier: Handle arrow fn expressions correctly in `is_in_boolean_context` (#8260) (camc314) - d2f8eaa minifier: Fix panic in `peephole_minimize_conditions` (#8242) (Boshen) - a698def minifier: Fix incorrect return value for `(x ? true : y)` (#8233) (Boshen) - 05be1fc minifier: Remove incorrect fold `Expression::AssignmentExpression` (#8211) (Boshen) - 56b7f13 minifier: Do not constant fold `0 instanceof F` (#8199) (Boshen) - 75d5f17 minifier: Minify string `PropertyKey` (#8177) (sapphi-red) - f88acb3 parser: Allow line breaks between `const` and `enum` (#8193) (branchseer) - 79a8fc6 semantic: Report error for super property appearing in function body (#8376) (Dunqing) - 79af100 semantic: Reference flags not correctly resolved when after an export stmt (#8134) (camc314) - 3eaff2a transformer: Ensure last expression statement in arrow function expression is wrapped in return (#8192) (Dunqing) - 3feac27 transformer/arrow-functions: Outer `super()` in nested class (#8382) (Dunqing) - 335065d transformer/arrow-functions: Do not transform super that inside nested non-async method (#8335) (Dunqing) - e4d66e4 transformer/arrow-functions: Store `super_methods` on a `Stack` to fix nested async methods (#8331) (Dunqing) - 775a289 transformer/arrow-functions: `_this = this` should be inserted after super call expression (#8024) (Dunqing) - ac72adb transformer/private-methods: Fix panic if instance private accessor in class (#8362) (overlookmotel) - f1f129b transformer/private-methods: Create brand binding `var` in hoist scope (#8361) (overlookmotel) - ab61425 transformer/private-methods: No temp var for class when unused private methods (#8360) (overlookmotel) - 9a03bd2 transformer/typescript: Remove type-only `import =` when `only_remove_type_imports` is true (#8275) (Dunqing) - 0df1866 transformer/typescript: Create `Reference` for `require` (#8355) (overlookmotel) - 78d7c97 transformer/typescript: Create `Reference` for `Infinity` (#8354) (overlookmotel) - 2e7207f transformer/typescript: Should strip import specifiers type with `only_remove_type_imports` (#8141) (underfin) ### Performance - 07edf74 transformer/arrow-function: Stop traversal at function as super() can't appear in a nested function (#8383) (Dunqing) - 62e3f7e transformer/arrow-functions: Reduce size of inlined visitor (#8322) (overlookmotel) - aebe0ea transformer/arrow-functions: Use `NonEmptyStack` instead of `Stack` (#8318) (overlookmotel) ### Documentation - c8e4843 ast: Fix doc comment (#8286) (overlookmotel) - e0a09ab data_structures: Improve docs for stack types (#8356) (overlookmotel) - aaa009d minifier: Clarify assumptions for compressor (#8404) (翠 / green) - 05cba5b transformer/private-methods: Amend comments (#8398) (overlookmotel) ### Refactor - b29655f ast: Rearrange impls for literal types in same order as they are defined (#8425) (overlookmotel) - 0db2a22 ast: `AstBuilder` enum builder methods use `alloc_*` methods (#8281) (overlookmotel) - aea9551 ast: Simplify `get_identifier_reference` of `TSType` and `TSTypeName` (#8273) (Dunqing) - 9c1844a data_structures: Remove `NonNull` shim (#8423) (overlookmotel) - 1835687 ecmascript: Remove unnecessary `use` statement (#8284) (overlookmotel) - 64bfdfe lexer: Tighten safety of lexer by always including lifetime on `SourcePosition` (#8293) (overlookmotel) - 0344e98 lexer: Make `handle_byte` a method of `Lexer` (#8291) (overlookmotel) - fabf116 lexer: Replace `#[allow]` with `#[expect]` (#8289) (overlookmotel) - 0462edb lexer: Rename function param (#8288) (overlookmotel) - fb2acd8 minifier: Change minimize conditionals into a loop (#8413) (Boshen) - baaec60 minifier: Remove the buggy `??` transform (#8411) (Boshen) - 1c4658d minifier: Change ast passes order, `!in_fixed_loop` happen last (#8380) (Boshen) - 09f0f48 minifier: Remove the buggy `minimize_exit_points` implementation (#8349) (Boshen) - 9a5c66a minifier: Clean up (#8346) (Boshen) - 98f2b1c minifier: Clean up `peephole_substitute_alternate_syntax` (#8327) (Boshen) - fc662b7 minifier: Handle big int values later (#8324) (Boshen) - d16e598 minifier: Clean up `peephole_replace_known_methods` (#8306) (Boshen) - b8d26ea minifier: Move optional catch param to peephole_substitute_alternate_syntax (#8282) (Boshen) - 0845162 minifier: Clean up `ReplaceKnownMethods` (Boshen) - 7c7f5d7 minifier: Clean up `peephole_fold_constants` (Boshen) - bf0fbce minifier: Improve constant fold numbers (#8239) (Boshen) - 62f8fba minifier: Move all conditional minification logic to minimze_conditions (#8231) (camc314) - cfb51f2 minifier: Fuse ast passes (#8184) (Boshen) - bf9cafe minifier: Clean up `peephole_substitute_alternate_syntax` a little bit (Boshen) - 75264ed minifier: Clean up `try_optimize_block` (#8139) (Boshen) - c22062b minifier: Cleanup peephole_minimize_conditions (#8114) (Boshen) - e594c39 minifier: Clean up `peephole_substitute_alternate_syntax.rs` (#8111) (Boshen) - 0903501 semantic: Check super usage based on scope (#8377) (Dunqing) - 109b8fc transformer: Elide lifetimes where possible (#8285) (overlookmotel) - fb389f7 transformer/arrow-function: Create a new ident instead of clone (#8338) (Dunqing) - dddbd29 transformer/arrow-functions: Reorder assertions (#8386) (overlookmotel) - ce6c445 transformer/arrow-functions: Add TODO comments (#8328) (overlookmotel) - 73d0025 transformer/arrow-functions: Reduce repeated code (#8323) (overlookmotel) - 3dd08e9 transformer/arrow-functions: Do not inline non-trivial visitor method (#8321) (overlookmotel) - ea9cefb transformer/arrow-functions: Reorder visitor methods (#8320) (overlookmotel) - 37199a4 transformer/arrow-functions: Rename lifetime (#8319) (overlookmotel) - 57e9dcf transformer/arrow-functions: Shorten `AstBuilder` call (#8317) (overlookmotel) - a5e3528 transformer/async-to-generator: Pass `TraverseCtx` to function not `AstBuilder` (#8279) (overlookmotel) - e7c89ba transformer/class-properties: TODO comments (#8392) (overlookmotel) - 6790d1d transformer/class-properties: Simplify determining if class is declaration (#8357) (overlookmotel) - c786a13 transformer/class-properties: Share `replace_class_name_with_temp_var` in class_properties (#8105) (Dunqing) - f54f48e transformer/class-properties: Remove all `*_if_super` methods in `static_block_and_prop_init` (#8104) (Dunqing) - d82fb52 transformer/class-properties: Move `supers` to `super_converter` (#8103) (Dunqing) - 3dad85e transformer/private-methods: Remove unnecessary clone (#8400) (overlookmotel) - aa5e65f transformer/private-methods: Simplify finding parent statement of class expression (#8364) (overlookmotel) - c786fd1 transformer/private-methods: TODO comments (#8363) (overlookmotel) ### Styling - 4d2888d lexer: Reorder imports (#8290) (overlookmotel) - e81f34f span: Reformat code (#8296) (overlookmotel) - 45e2402 transformer/private-methods: Move comments (#8399) (overlookmotel) - 0a1ffc0 transformer/private-methods: Rename var (#8397) (overlookmotel) ### Testing - 16dcdaf lexer: Assert size of `Token` in 32-bit WASM (#8292) (overlookmotel) - 3149fe0 minifier: Add anonymous function test case for logical expression to logical assignment compression (#8347) (sapphi-red) - 91b42de minifier: Enable some passing tests (#8250) (camc314) - 1fa5341 minifier: Port tests from ConvertToDottedPropertiesTest (#8175) (sapphi-red) Co-authored-by: Boshen <[email protected]>
Fix implementations of
ContentEq
andContentHash
for literal AST types:NullLiteral::content_hash
is a no-op, same as other types which only contain aSpan
.NumericLiteral::content_eq
andcontent_hash
ignorebase
field.NumericLiteral::content_hash
works around0.0 == -0.0
.BigIntLiteral::content_eq
andcontent_hash
ignorebase
field.StringLiteral::content_hash
ignoreraw
field.RegExpLiteral::content_eq
andcontent_hash
consider 2RegExp
s to be equal if they are printed the same (regardless of whether they were parsed byoxc_regular_expression
or not).Additionally, implement
StringLiteral::content_eq
manually to avoid "special case" logic inoxc_ast_tools
.