Skip to content

fix(isolated-declarations): allow unknown enum initializer in non-const enum#22900

Merged
graphite-app[bot] merged 1 commit into
mainfrom
codex/fix-isolated-declarations-enum-initializers
Jun 3, 2026
Merged

fix(isolated-declarations): allow unknown enum initializer in non-const enum#22900
graphite-app[bot] merged 1 commit into
mainfrom
codex/fix-isolated-declarations-enum-initializers

Conversation

@camc314

@camc314 camc314 commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Fixes an isolated declarations diagnostic mismatch for enum initializers.

TypeScript allows runtime enum initializers under --isolatedDeclarations for regular enums and emits the declaration without initializer values:

TS playground

export enum BadEnum {
  A = Math.random(),
  B = A + 1,
}
export declare enum BadEnum {
  A,
  B
}

Oxc already emitted the same declaration shape, but also reported TS9020. This PR narrows that diagnostic behavior so regular enum runtime initializers are omitted without an isolated declarations error.

For const enum, TypeScript still reports TS2474 because const enum initializers must be constant expressions:

TS playground

export const enum BadConstEnum {
  A = Math.random(),
  B = A + 1,
}

This PR keeps that error behavior aligned by reporting TS2474 for non-constant const enum initializers.

Copilot AI review requested due to automatic review settings June 1, 2026 17:25
@camc314 camc314 requested a review from Dunqing as a code owner June 1, 2026 17:25
@github-actions github-actions Bot added the A-isolated-declarations Isolated Declarations label Jun 1, 2026
@camc314 camc314 changed the title fix(isolated-declarations): align enum initializer diagnostics fix(isolated-declarations): allow unknown enum initializer in non-const enum Jun 1, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates oxc_isolated_declarations to emit a TypeScript-aligned diagnostic for invalid const enum member initializers, while allowing non-const enums with runtime initializers to pass through without producing that diagnostic. It also adds a fixture + snapshot to lock in the expected .d.ts output and error rendering.

Changes:

  • Emit TS2474: const enum member initializers must be constant expressions. when a const enum member initializer cannot be evaluated as a constant.
  • Adjust the error label span to highlight the initializer expression (e.g. Math.random() / A + 1) rather than the enum member name.
  • Add a new fixture and snapshot covering runtime initializers in both enum and const enum.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
crates/oxc_isolated_declarations/src/enum.rs Restricts the initializer diagnostic to const enum and labels the initializer expression span.
crates/oxc_isolated_declarations/src/diagnostics.rs Replaces the prior enum-initializer diagnostic with a TS2474-aligned const-enum diagnostic message.
crates/oxc_isolated_declarations/tests/fixtures/enum-runtime-initializer.ts Adds a test fixture covering runtime initializers in enum vs const enum.
crates/oxc_isolated_declarations/tests/snapshots/enum-runtime-initializer.snap Adds the snapshot asserting .d.ts output and the TS2474 diagnostics for the fixture.

@codspeed-hq

codspeed-hq Bot commented Jun 1, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 52 untouched benchmarks
⏩ 14 skipped benchmarks1


Comparing codex/fix-isolated-declarations-enum-initializers (fcd407b) with main (bbe44ea)2

Open in CodSpeed

Footnotes

  1. 14 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.

  2. No successful run was found on main (6f2c9c2) during the generation of this report, so bbe44ea was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

@camc314 camc314 added the run-monitor-oxc Add to a PR to dispatch oxc-project/monitor-oxc CI against it label Jun 1, 2026
@oxc-guard

oxc-guard Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

@oxc-guard oxc-guard Bot removed the run-monitor-oxc Add to a PR to dispatch oxc-project/monitor-oxc CI against it label Jun 1, 2026

@Dunqing Dunqing left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I kind of think there is a bug in TypeScript; apparently, this enum didn't get the correct type. So basically, both non-const and const enums should be the same in this case.

@Dunqing Dunqing added the 0-merge Merge with Graphite Merge Queue label Jun 3, 2026

Dunqing commented Jun 3, 2026

Copy link
Copy Markdown
Member

Merge activity

…st enum (#22900)

Fixes an isolated declarations diagnostic mismatch for enum initializers.

TypeScript allows runtime enum initializers under `--isolatedDeclarations` for regular enums and emits the declaration without initializer values:

[TS playground](https://www.typescriptlang.org/play/?isolatedDeclarations=true#code/KYDwDg9gTgLgBMAdgVwLZwEIEMAmBRFdAbwCg44BBOAXjgFksYALAOii0RwlQAoBKADRlMNSnADUcAIxCAviRKhIsOAGMIiAM7wkaTLgDCG7QT2lyVWg2ZsOXXoOEZRVSTJLygA)

```ts
export enum BadEnum {
  A = Math.random(),
  B = A + 1,
}
```

```ts
export declare enum BadEnum {
  A,
  B
}
```

Oxc already emitted the same declaration shape, but also reported TS9020. This PR narrows that diagnostic behavior so regular enum runtime initializers are omitted without an isolated declarations error.

For `const enum`, TypeScript still reports `TS2474` because const enum initializers must be constant expressions:

[TS playground](https://www.typescriptlang.org/play/?isolatedDeclarations=true#code/KYDwDg9gTgLgBMAdgVwLZwEIEMAmBRFdAbwCg44BBOAXjgFksYALAOii0RwlQAoBKADRlMNSnADUcAIxCAviRKhIsOAGMIiAM7wkaTLgDCG7QT2lyVWg2ZsOXXoOEZRVSTJLygA)

```ts
export const enum BadConstEnum {
  A = Math.random(),
  B = A + 1,
}
```

This PR keeps that error behavior aligned by reporting `TS2474` for non-constant `const enum` initializers.
@graphite-app graphite-app Bot force-pushed the codex/fix-isolated-declarations-enum-initializers branch from fcd407b to 8c93601 Compare June 3, 2026 02:37
@graphite-app graphite-app Bot merged commit 8c93601 into main Jun 3, 2026
29 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Jun 3, 2026
@graphite-app graphite-app Bot deleted the codex/fix-isolated-declarations-enum-initializers branch June 3, 2026 02:42
Boshen added a commit that referenced this pull request Jun 8, 2026
### 💥 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-isolated-declarations Isolated Declarations

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants