feat(semantic): make building the class table optional, off by default#22862
Conversation
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1885f018fb
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
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".
Merge activity
|
86fd775 to
feec2cd
Compare
There was a problem hiding this comment.
Pull request overview
Makes building the semantic class table opt-in (off by default) so consumers that don't need it can save allocations. The class table is still built automatically when check_syntax_error is enabled, since several syntax checks (private identifiers, super, accessor-without-body, duplicate class elements) depend on it.
Changes:
- Add
build_class_tablefield andwith_class_table(bool)builder method onSemanticBuilder, and anenabledflag onClassTableBuilderthat short-circuitsdeclare_class_body,add_private_identifier_reference, andpop_class. - Effective enabled state is
build_class_table || check_syntax_error, set right before AST traversal. - Opt in at call sites that actually use the class table: linter runtime, mangler standalone build, minifier mangle step, playground, and the semantic benchmark.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| crates/oxc_semantic/src/class/builder.rs | Add enabled flag and early-return guards in class-table mutation methods. |
| crates/oxc_semantic/src/builder.rs | Add build_class_table field, with_class_table setter, and propagate enabled state (forced on by check_syntax_error). |
| crates/oxc_linter/src/service/runtime.rs | Enable class table for linting (rules read ctx.classes()). |
| crates/oxc_mangler/src/lib.rs | Enable class table in standalone Mangler::build. |
| crates/oxc_minifier/src/lib.rs | Enable class table for the mangle semantic rebuild. |
| napi/playground/src/lib.rs | Enable class table for playground lint path. |
| tasks/benchmark/benches/semantic.rs | Enable class table in the semantic benchmark to keep workload representative. |
| tasks/track_memory_allocations/allocs_semantic.snap | Updated allocation snapshot reflecting reduced sys allocs. |
| tasks/track_memory_allocations/allocs_minifier.snap | Updated allocation snapshot reflecting reduced sys allocs. |
#22862) Rolldown runs semantic multiple times, some runs do not require building the class table.
feec2cd to
85efabf
Compare
…22909) ## Summary Follow-up cleanup to #22862 (which made the `oxc_semantic` `ClassTable` optional and off by default). Two small improvements: 1. **Collapse the duplicate flag.** #22862 added a `build_class_table` field on `SemanticBuilder` that existed only to be OR'd into the `ClassTableBuilder::enabled` flag that already exists. `with_class_table` now writes `class_table_builder.enabled` directly, and `build()` folds in the checker dependency with `enabled |= self.check_syntax_error`. One source of truth instead of two flags plus a bridge; behaviour is identical and order-independent. 2. **Fix linter-benchmark fidelity.** `tasks/benchmark/benches/linter.rs` runs `ConfigStoreBuilder::all()` but built its semantic without the class table, so after #22862 flipped the default the class-dependent rules (`no_dupe_class_members`, `no_unused_private_class_members`, `max_classes_per_file`) silently no-op'd there — the benchmark measured less work than production. Added `.with_class_table(true)` to match `service/runtime.rs`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
# Oxlint ### 🚀 Features - e805174 linter: Add schema for `jest/vitest/max-expects` (#23105) (Sysix) - 7850577 linter: Add schema for `jest/vitest/expect-expect` (#23104) (Sysix) - 75f641a linter: Add schema for `jest/vitest/consistent-test-it` (#23103) (Sysix) - 5125f89 linter/unicorn: Support no-null `checkArguments` option (#23098) (camc314) - b8b9797 linter: Add schema for `import-max-dependencies` (#23096) (Sysix) - 65cb47a linter/eslint: Support no-unused-expressions `ignoreDirectives` option (#23097) (camc314) - f6c36d5 linter: Add schema for `import/prefer-default-export` (#23091) (Sysix) - 0d4a5d1 linter: Add schema for `eslint/sort-vars` (#23090) (Sysix) - fdb5bf5 linter: Add schema for `eslint/radix` (#23082) (Sysix) - 05b4dcf linter: Add schema for `eslint/prefer-const` (#23081) (Sysix) - 5a06c4d linter/vue: Implement next-tick-style rule (#23041) (Alex Peshkov) - e38a36a linter: Add schema for `eslint/operator-assignment` (#23080) (Sysix) - 907cee7 linter: Add schema for `eslint/no-warning-comments` (#23075) (Sysix) - 9470bb2 linter: Add schema for `eslint/no-unused-vars` (#23073) (Sysix) - 234b5cf linter: Add schema for `eslint/no-shadow` (#23072) (Sysix) - de0dd8b linter: Add schema for `eslint/no-restricted-exports` (#23020) (Sysix) - faa3e0d linter: Add schema for `eslint/no-param-reassign` (#23018) (Sysix) - dbc9c27 linter: Add schema for `eslint/no-magic-numbers` (#23017) (Sysix) - 38d3569 linter: Add schema for `eslint/no-inner-declarations` (#23016) (Sysix) - 008fa41 linter: Add schema for `eslint/no-constant-condition` (#22991) (Sysix) - ca44623 linter: Add schema for `eslint/no-empty-function` (#22988) (Sysix) - 43eb04d linter: Add schema for `eslint/id-match` (#22987) (Sysix) - a800f27 linter: Add schema for `eslint/capitalized-comments` (#22984) (Sysix) - 96e2d32 linter: Add schema for `eslint/id-length` (#22963) (Sysix) - 545493f linter: Add schema for `eslint/complexity` (#22960) (Sysix) - 5f0b558 linter: Add schema for `eslint/class-methods-use-this` (#22959) (Sysix) - 719b720 linter: Add schema for simple rule configurations (#22948) (Sysix) - fd00966 linter: Add right schema for `eslint/max-*` rules (#22923) (Sysix) - 1226d78 linter: Fill schema with rule configurations (#22907) (Sysix) - 8f423c1 linter/vue: Implement `require-direct-export` rule (#17623) (yefan) - 78e915b linter/vue: Implement no-reserved-props rule (#22914) (bab) - 0f200a9 linter/vue: Implement require-prop-types rule (#22083) (Alex Peshkov) - 5da9da9 linter/vue: Implement no-reserved-keys rule (#21780) (bab) - 75e14a8 linter/vue: Implement prop-name-casing rule (#22892) (bab) - 85efabf semantic: Make building the class table optional, off by default (#22862) (Boshen) ### 🐛 Bug Fixes - a49b0cf linter/no-map-spread: Remove ineffective autofix (#22956) (camc314) - cf53285 parser: Report reserved type-declaration names in the parser (#23035) (Boshen) - 0383e61 linter: Fix schema for rules without a config (#22946) (Sysix) - 4d722e0 parser: Report duplicate switch `default` clause in the parser (#23012) (Boshen) - 6cb34b8 linter/plugins: Make spreading `Token` instances keep `loc` property (#22947) (Nicolas Le Cam) - 27de044 linter/plugins: Make spreading `Comment` instances keep `loc` property (#22238) (Nicolas Le Cam) - 742fd0b linter/double-comparisons: Make fixer a suggestion (#22968) (camc314) - 93f4494 linter: Respect default child config plugin when extending parent config (#22903) (Sysix) - 594ed86 linter: Deny unknown options for some rules (#22924) (Sysix) - 3253038 linter/expect-expect: Align default rule options (#22890) (camc314) - bbe44ea linter: Respect default plugins from extended config (#22896) (Sysix) ### ⚡ Performance - 0b7ce7e linter/plugins: Create global prop vars at top level of modules (#22928) (overlookmotel) - 0f7c319 linter/plugins: Define class `#loc` setter functions as `const`s (#22919) (overlookmotel) ### 📚 Documentation - 7b0380d linter: Remove preserve-caught-error note (#22994) (camc314) - dadafe3 oxlint, oxfmt: Mention migrate skills in npm READMEs (#22965) (Boshen) # Oxfmt ### 🚀 Features - 3da77e0 oxfmt: Format `parser:json5` files by `oxc_formatter_json` (#22990) (leaysgur) - c786f0d oxfmt: Format `parser:jsonc` files by `oxc_formatter_json` (#22913) (leaysgur) - 27a6db8 formatter_json: Implement jsonc variant (#22912) (leaysgur) ### 🐛 Bug Fixes - 2aedd52 oxfmt: Avoid JS promise rejects for all TSFN call sites (#23107) (leaysgur) - 01e0871 formatter,formatter_json: Handle PS/LS as line terminator (#22978) (leaysgur) - 23902d9 formatter_json: Handle CR only line breaks (#22977) (leaysgur) - 136b72b formatter_json: Use line_suffix for line comment outside array (#22931) (leaysgur) - 44e40fa formatter_json: Expand line comment inside array (#22911) (leaysgur) - 2c86896 formatter_json: Avoid example binary name collision (#22904) (camc314) ### 📚 Documentation - cc69d8d formatter_json: Update AGENTS.md (#22981) (leaysgur) - 0490721 formatter_json: Update AGENTS.md (#22976) (leaysgur) - dadafe3 oxlint, oxfmt: Mention migrate skills in npm READMEs (#22965) (Boshen) - f88961a oxfmt: Annotate each config option with supported languages (#22953) (leaysgur) - 7e514bf formatter_json: Update AGENTS.md (#22930) (leaysgur) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
### 💥 BREAKING CHANGES - ee4dc73 ast: [**BREAKING**] Add `#[non_exhaustive]` to AST nodes (#23046) (overlookmotel) - 4c35362 ast: [**BREAKING**] Add `AstBuilder::template_element_escape_raw` and `template_element_escape_raw_with_lone_surrogates` methods (#23047) (overlookmotel) ### 🚀 Features - b846ab2 react_compiler: Integrate the Rust port of the React Compiler (#22942) (Boshen) - 5b8dd68 parser: Report TS1255 for invalid class definite assertions (#22917) (camc314) - 85efabf semantic: Make building the class table optional, off by default (#22862) (Boshen) ### 🐛 Bug Fixes - 556acdc codegen: Parenthesize TS-cast assignment targets (#23112) (Boshen) - 37169ff codegen: Don't emit space between postfix `--` and `>` when minifying (#23036) (Boshen) - a4b1bf7 codegen: Drop redundant whitespace in minified TypeScript output (#23038) (Boshen) - cf53285 parser: Report reserved type-declaration names in the parser (#23035) (Boshen) - 4e44969 ast: Fix UB in `escape_template_element_raw` (#23052) (overlookmotel) - c543154 parser: Report comma operator in JSX expression in the parser (#23030) (Boshen) - 325c94f codegen: Tighten conditional-type and constructor-type whitespace when minifying (#23033) (Boshen) - 95dd3a2 parser: Report `import type` alias to a non-external reference in the parser (#23032) (Boshen) - 90180b8 codegen: Drop space after `:` in function return type when minifying (#23028) (Boshen) - 6da876e parser: Report `abstract` private class field in the parser (#23029) (Boshen) - 28467ce codegen: Don't emit space before a postfix update operand when minifying (#23027) (Boshen) - cb29926 codegen: Drop redundant space after `export default` when minifying (#23024) (Boshen) - 62965ae codegen: Drop redundant space after `else` when minifying (#23025) (Boshen) - 989230a parser: Report compound assignment to non-simple target in the parser (#23022) (Boshen) - 06f367c parser: Report `super.#field` private access in the parser (#23014) (Boshen) - 184edef codegen: Print space before `const`/`declare` enum modifier (#23013) (Boshen) - 4d722e0 parser: Report duplicate switch `default` clause in the parser (#23012) (Boshen) - 597ed85 codegen: Parenthesize `let`/`async` for-of head target (#23008) (Boshen) - 8b631bf codegen: Remove stray space before mapped type value colon (#23010) (Boshen) - c08407e codegen: Don't over-parenthesize `in` inside an arrow in a for-init (#23009) (Boshen) - 600cd6f codegen: Parenthesize lower-precedence `TSInstantiationExpression` operand (#23007) (Boshen) - 187e1a5 codegen: Don't leak space after comment-only JSX expression container (#23006) (Boshen) - 294c473 codegen: Don't over-parenthesize `TSTypeAssertion` operand (#23004) (Boshen) - 786d96f codegen: Give `TSTypeAssertion` unary precedence (#23002) (Boshen) - 1295882 parser: Report `new.target` and `import.meta` syntax errors in the parser (#23003) (Boshen) - d727b6b codegen: Parenthesize `await` expression as base of `**` (#23001) (Boshen) - 67dfa08 codegen: Keep parentheses around `new` callees containing a call (#22997) (Boshen) - 17e7cf3 parser: Disallow unerasable `as`/`satisfies` assertions (#22986) (Boshen) - beb46d3 parser: Commit to module goal on decorated exports (#22941) (Boshen) - 49e63f7 isolated-declarations: Require annotations for satisfies initializers (#22898) (camc314) - 8c93601 isolated-declarations: Allow unknown enum initializer in non-const enum (#22900) (camc314) ### ⚡ Performance - 7d89909 parser: Peek instead of lookahead for yield disambiguation (#23071) (Boshen) - bf872f0 parser: Skip arrow lookahead for a parenthesized literal (#23070) (Boshen) - d19fc54 parser: Guard type-argument speculation behind an angle-token check (#23069) (Boshen) - 8eb5507 parser: Skip redundant member-rest re-scan on call entry (#23068) (Boshen) - 883dfc1 parser: Skip parse_call_expression_rest when no call follows (#23063) (Boshen) - b171153 parser: Peek before the await-using lookahead (#23059) (Boshen) - 56f21bd parser: Use peek_token for the TS `asserts` type predicate (#23058) (Boshen) - 68805ac parser: Use peek_token instead of checkpoint/rewind for single-token decisions (#23056) (Boshen) - 1f9d8eb ast: `AstBuilder::template_element_escape_raw` avoid allocation if no escape required (#23053) (overlookmotel) - 502b04d semantic: Move cold function redeclaration handling into `#[cold]` function (#22973) (overlookmotel) ### 📚 Documentation - 275d318 napi/minifier: Point `target` to oxc docs (#23102) (camc314) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>
Rolldown runs semantic multiple times, some runs do not require building the class table.