perf(linter): outline diagnostic construction - #25762
Merged
Merged
Conversation
Merging this PR will not alter performance
Comparing Footnotes
|
Member
Author
Merge activity
|
Diagnostic reporting is a cold path, but `LintContext::diagnostic` was explicitly inlined into hundreds of rule bodies. This also duplicated `Message::new`, its primary-label search, and generic diagnostic builders. Mark these paths `#[cold]` and `#[inline(never)]` so call sites share a few outlined implementations instead of embedding the construction code. This reduces the stripped aarch64 macOS `oxlint` binary by 224.9 KiB (1.66%; `__text` by 224.3 KiB). Validated with `just ready` and a release fat-LTO size comparison. AI assistance: Codex was used to implement and validate this change.
graphite-app
Bot
force-pushed
the
agent/outline-diagnostic-construction
branch
from
August 17, 2026 05:17
1e1e951 to
63ff8ef
Compare
This was referenced Aug 17, 2026
Boshen
added a commit
that referenced
this pull request
Aug 18, 2026
### 💥 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>
Boshen
added a commit
that referenced
this pull request
Aug 18, 2026
# Oxlint ### 💥 BREAKING CHANGES - 8c4552d linter: [**BREAKING**] Split react/react-compiler into per-category rules (#25500) (Boshen) ### 🚀 Features - 9b7394e linter/typescript/no-empty-object-type: Implement suggestion (#25833) (Mikhail Baev) ### 🐛 Bug Fixes - 345f981 react_compiler: Skip node_modules by default (#25859) (Boshen) - 2f40afa linter/unicorn/no-array-callback-reference: Ignore effect library imports (#25857) (Michaël Bitard) - 7b565a0 linter: Align React Compiler rule categories (#25840) (Boshen) - 228e8e0 linter: Resolve inactive React compiler rules (#25830) (Boshen) - f8e4884 linter/eslint/no-useless-constructor: Allow parameter properties (#25811) (camc314) - e4b6993 linter: Report exhaustive effect dependencies (#25829) (Boshen) - 742e25f linter/eslint/no-return-assign: Anchor diagnostic on return stmt (#25803) (camc314) - b831ca8 react-compiler: Improve derived state diagnostic (#25804) (Boshen) - 5908c87 linter/jest/prefer-mock-return-shorthand: Preserve implementations using this (#25802) (camc314) - f6b2265 linter/eslint/no-redeclare: Run in ES modules, skipping only the globals check (#25691) (Hamody We) - ca9f553 linter/unicorn/prefer-default-parameters: Mark fixer as a suggestion (#25801) (camc314) - aa49d86 linter: Allow spread rule options in config types (#25675) (ch3rry) - d5483f8 linter/typescript/no-useless-empty-export: Skip TS declaration files (#25789) (Evyatar Daud) - 57f2199 linter/typescript/no-useless-empty-export: Report after imports (#25786) (camc314) - 633bc19 linter/typescript/no-unnecessary-type-conversion: Mark fixer as `suggestion` (#25787) (camc314) - dea3339 linter/typescript/explicit-module-boundary-types: Anchor diagnostics on arrows (#25779) (camc314) - 5cd6f02 linter/eslint/array-callback-return: Anchor diagnostic on callback (#25780) (camc314) - ef8cebf linter/eslint/preserve-caught-error: Handle AggregateError options (#25775) (camc314) - c108d5c linter: Improve React Compiler diagnostics (#25742) (Boshen) - c9ec55e react-compiler: Improve diagnostic spans (#25731) (Boshen) - 1cbbcb7 linter/unicorn/prefer-string-replace-all: Apply fixes in one pass (#25709) (Mikhail Baev) - dec0a86 react-compiler: Standardize diagnostics (#25702) (Boshen) - 5fd77f7 linter/react/display-name: Report curried HOC inner component (#25662) (camc314) - 4dbb80e linter/import/no-named-as-default: Report local export conflicts (#25658) (camc314) - e8a7214 linter/react/rules-of-hooks: Report hooks inside try blocks (#25670) (camc314) - 36f8451 linter/eslint/no-eval: Align indirect default with ESLint (#25656) (camc314) - d901d24 linter/react/exhaustive-deps: Handle destructured object dependencies (#25669) (camc314) - beb724d linter/eslint/no-unused-vars: Report bare underscore parameters (#25663) (camc314) - fa36f26 linter/react/no-this-in-sfc: Detect this in nested arrow callbacks (#25653) (camc314) - 44d1be3 linter/typescript/no-var-requires: Run rule on JavaScript (#25664) (camc314) - 4004c10 linter/eslint/no-irregular-whitespace: Check comments by default (#25660) (camc314) - 625401d linter/import/no-named-default: Flag type-only named defaults (#25661) (camc314) - 8eacb2d linter/typescript/no-non-null-asserted-optional-chain: Detect assertions after continued optional chains (#25659) (camc314) - d55b76c linter/react/no-direct-mutation-state: Detect computed state mutations (#25654) (camc314) - f92c651 linter/unicorn/no-abusive-eslint-disable: Use directive prefix in diagnostic (#25657) (camc314) - ee44996 linter/eslint/max-classes-per-file: Anchor diagnostic at program start (#25652) (camc314) - 403ec40 linter/eslint/no-multi-assign: Handle parenthesized declarator initializers (#25651) (camc314) - 6c9ba37 linter/jest/expect-expect: Detect assertions in nested function declarations (#25650) (camc314) - 285820e linter/no-large-snapshots: Precompile and document allowed snapshot matchers (#25611) (Mikhail Baev) - 1be1e20 linter/eslint/prefer-promise-reject-errors: Report on spread arguments (#25648) (Mikhail Baev) - a38f7b3 oxlint,oxfmt: Apply .gitignore only to walk targets, not explicitly named files (#25531) (leaysgur) - 509931b semantic: Classify global references per identifier (#25608) (camc314) - 0c68b7f estree: Emit `decorators` on `FormalParameterRest` (#25582) (camc314) - 1d22912 linter/plugins: Parse rule-less directive justifications (#25559) (camc314) - eaf80d8 linter/unicorn/prefer-node-protocol: Validate exact Node.js built-in specifiers (#25558) (camc314) - 57b94af linter/promise/no-multiple-resolved: Ignore unresolved globals (#25530) (Tushar Singh) - 80e64c2 linter/expect-expect: Validate assertion regex (#25504) (Mikhail Baev) - 7830604 linter/react/exhaustive-deps: Treat binary expressions as a stable dependency (#25508) (Hamody We) - 4df5835 linter: Allow capitalized built-in calls (#25516) (Boshen) - 9d49d27 react_compiler: Bail out instead of panicking on "Expected a node for all scopes" (#25506) (Boshen) - d43b562 linter/vitest/prefer-expect-assertions: Handle parameterized Vitest assertion suggestions (#25476) (camc314) ### ⚡ Performance - e8303d6 linter: Shrink rule serialization dispatch (#25818) (Boshen) - c84ede3 estree_tokens: Share JS token update entry point (#25826) (Boshen) - 35c8eb2 linter: Compute sort keys once with sort_by_cached_key (#25821) (Boshen) - f0121ed linter: Share config deserialization entry point (#25820) (Boshen) - 2dacf7a oxlint: Reduce debug formatting code size (#25797) (Boshen) - 9ed10b7 linter: Use unstable sorts for unique keys (#25778) (Boshen) - 63ff8ef linter: Outline diagnostic construction (#25762) (Boshen) - 2dd7446 diagnostics: Preallocate graphical output (#25721) (Boshen) - 9c8abab diagnostics: Batch graphical reports (#25710) (Boshen) - 8e9b95f linter: Use table for rule names (#25458) (Boshen) # Oxfmt ### 🚀 Features - c07fe7c oxfmt: Support `experimentalOperatorPosition` (#25643) (leaysgur) - 2adb8fb formatter: Implement `operatorPosition` option (#25581) (leaysgur) ### 🐛 Bug Fixes - 44231fb formatter: Fix comment and indent issues around unions (#25665) (leaysgur) - 2465e87 formatter: Keep comments in place when dropping `EmptyStatement` (#25730) (leaysgur) - 7e4f3b7 formatter: Print `JSDocUnknownType` (#25729) (leaysgur) - 5238d9e formatter: Keep nested awaited-paren member chain grouped in call arguments (#25646) (leaysgur) - a38f7b3 oxlint,oxfmt: Apply .gitignore only to walk targets, not explicitly named files (#25531) (leaysgur) - 5c0a5ff formatter_css: Fill own-line block comments inside space-separated values (#25578) (leaysgur) - 53debfa formatter_css: Keep trailing comma and indent after comment-preceded last map value (#25577) (leaysgur) - 1a83a8d oxfmt: Mirror printer line suppression and restore dedent-to-root (#25573) (leaysgur) - 7f350d1 formatter: Keep unary comment and print only needed parens (#25526) (leaysgur) - f405789 formatter_yaml: Consistent chomped eos behavior (#25523) (leaysgur) - a243311 formatter_yaml: Bump oxc-yaml-parser for contentless block scalar (#25519) (leaysgur) - 40d38a0 formatter_css: Keep multi value function args intact after leading comment (#25518) (leaysgur) ### 📚 Documentation - 223e785 oxfmt/conformance: Update notes on conformance (#25757) (Yuji Sugiura) - 673dc6d oxfmt: Move some docs from AGENTS.md to code comment (#25649) (leaysgur) - fed6681 oxfmt: Skip expanding overrides options (#25572) (leaysgur) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Diagnostic reporting is a cold path, but
LintContext::diagnosticwas explicitly inlined into hundreds of rule bodies. This also duplicatedMessage::new, its primary-label search, and generic diagnostic builders.Mark these paths
#[cold]and#[inline(never)]so call sites share a few outlined implementations instead of embedding the construction code.This reduces the stripped aarch64 macOS
oxlintbinary by 224.9 KiB (1.66%;__textby 224.3 KiB).Validated with
just readyand a release fat-LTO size comparison.AI assistance: Codex was used to implement and validate this change.