mirror of
https://github.com/oxc-project/oxc.git
synced 2026-11-04 10:29:58 +00:00
fix(isolated-declarations): allow unknown enum initializer in non-const 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.
This commit is contained in:
1 parent
0b7ce7edd9
commit
8c936018d1
4 files changed
+51
-5
No files matched your search
@@ -100,8 +100,8 @@ pub fn binding_element_export(span: Span) -> OxcDiagnostic {
|
||||
}
|
||||
|
||||
#[cold]
|
||||
pub fn enum_member_initializers(span: Span) -> OxcDiagnostic {
|
||||
OxcDiagnostic::error("TS9020: Enum member initializers must be computable without references to external symbols with --isolatedDeclarations.")
|
||||
pub fn const_enum_member_initializers(span: Span) -> OxcDiagnostic {
|
||||
OxcDiagnostic::error("TS2474: const enum member initializers must be constant expressions.")
|
||||
.with_label(span)
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ use oxc_syntax::{
|
||||
operator::{BinaryOperator, UnaryOperator},
|
||||
};
|
||||
|
||||
use crate::{IsolatedDeclarations, diagnostics::enum_member_initializers};
|
||||
use crate::{IsolatedDeclarations, diagnostics::const_enum_member_initializers};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
enum ConstantValue {
|
||||
@@ -29,8 +29,8 @@ impl<'a> IsolatedDeclarations<'a> {
|
||||
let computed_value =
|
||||
self.computed_constant_value(initializer, &decl.id.name, &prev_members);
|
||||
|
||||
if computed_value.is_none() {
|
||||
self.error(enum_member_initializers(member.id.span()));
|
||||
if decl.r#const && computed_value.is_none() {
|
||||
self.error(const_enum_member_initializers(initializer.span()));
|
||||
}
|
||||
|
||||
computed_value
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
export enum BadEnum {
|
||||
A = Math.random(),
|
||||
B = A + 1,
|
||||
}
|
||||
|
||||
export const enum BadConstEnum {
|
||||
A = Math.random(),
|
||||
B = A + 1,
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
source: crates/oxc_isolated_declarations/tests/mod.rs
|
||||
input_file: crates/oxc_isolated_declarations/tests/fixtures/enum-runtime-initializer.ts
|
||||
---
|
||||
```
|
||||
==================== .D.TS ====================
|
||||
|
||||
export declare enum BadEnum {
|
||||
A,
|
||||
B
|
||||
}
|
||||
export declare const enum BadConstEnum {
|
||||
A,
|
||||
B
|
||||
}
|
||||
|
||||
|
||||
==================== Errors ====================
|
||||
|
||||
x TS2474: const enum member initializers must be constant expressions.
|
||||
,-[7:7]
|
||||
6 | export const enum BadConstEnum {
|
||||
7 | A = Math.random(),
|
||||
: ^^^^^^^^^^^^^
|
||||
8 | B = A + 1,
|
||||
`----
|
||||
|
||||
x TS2474: const enum member initializers must be constant expressions.
|
||||
,-[8:7]
|
||||
7 | A = Math.random(),
|
||||
8 | B = A + 1,
|
||||
: ^^^^^
|
||||
9 | }
|
||||
`----
|
||||
|
||||
|
||||
```
|
||||
Reference in new issue
Block a user