Skip to content

Commit 1af5ed3

Browse files
committed
refactor(ast)!: replace Modifiers with declare and const on EnumDeclaration (#3845)
1 parent 0673677 commit 1af5ed3

File tree

15 files changed

+98
-73
lines changed

15 files changed

+98
-73
lines changed

crates/oxc_ast/src/ast/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,10 @@ impl<'a> Modifiers<'a> {
241241
self.0.as_ref().and_then(|modifiers| modifiers.iter().find(|modifier| f(modifier)))
242242
}
243243

244+
pub fn is_contains_const(&self) -> bool {
245+
self.contains(ModifierKind::Const)
246+
}
247+
244248
pub fn is_contains_declare(&self) -> bool {
245249
self.contains(ModifierKind::Declare)
246250
}

crates/oxc_ast/src/ast/ts.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ pub struct TSEnumDeclaration<'a> {
5555
pub span: Span,
5656
pub id: BindingIdentifier<'a>,
5757
pub members: Vec<'a, TSEnumMember<'a>>,
58-
/// Valid Modifiers: `const`, `export`, `declare`
59-
pub modifiers: Modifiers<'a>,
58+
pub r#const: bool,
59+
pub declare: bool,
6060
pub scope_id: Cell<Option<ScopeId>>,
6161
}
6262

crates/oxc_ast/src/ast_builder.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1883,10 +1883,11 @@ impl<'a> AstBuilder<'a> {
18831883
span: Span,
18841884
id: BindingIdentifier<'a>,
18851885
members: Vec<'a, TSEnumMember<'a>>,
1886-
modifiers: Modifiers<'a>,
1886+
r#const: bool,
1887+
declare: bool,
18871888
) -> Declaration<'a> {
18881889
Declaration::TSEnumDeclaration(
1889-
self.alloc(TSEnumDeclaration::new(span, id, members, modifiers)),
1890+
self.alloc(TSEnumDeclaration::new(span, id, members, r#const, declare)),
18901891
)
18911892
}
18921893

crates/oxc_ast/src/ast_impl/js.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,7 @@ impl<'a> Declaration<'a> {
710710
Declaration::VariableDeclaration(decl) => decl.declare,
711711
Declaration::FunctionDeclaration(decl) => decl.declare,
712712
Declaration::ClassDeclaration(decl) => decl.declare,
713-
Declaration::TSEnumDeclaration(decl) => decl.modifiers.is_contains_declare(),
713+
Declaration::TSEnumDeclaration(decl) => decl.declare,
714714
Declaration::TSTypeAliasDeclaration(decl) => decl.modifiers.is_contains_declare(),
715715
Declaration::TSModuleDeclaration(decl) => decl.modifiers.is_contains_declare(),
716716
Declaration::TSInterfaceDeclaration(decl) => decl.modifiers.is_contains_declare(),

crates/oxc_ast/src/ast_impl/ts.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,19 @@ impl<'a> TSEnumDeclaration<'a> {
1919
span: Span,
2020
id: BindingIdentifier<'a>,
2121
members: Vec<'a, TSEnumMember<'a>>,
22-
modifiers: Modifiers<'a>,
22+
r#const: bool,
23+
declare: bool,
2324
) -> Self {
24-
Self { span, id, members, modifiers, scope_id: Cell::default() }
25+
Self { span, id, members, r#const, declare, scope_id: Cell::default() }
2526
}
2627
}
2728

2829
impl<'a> Hash for TSEnumDeclaration<'a> {
2930
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
3031
self.id.hash(state);
3132
self.members.hash(state);
32-
self.modifiers.hash(state);
33+
self.r#const.hash(state);
34+
self.declare.hash(state);
3335
}
3436
}
3537

crates/oxc_codegen/src/gen.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3357,13 +3357,10 @@ impl<'a, const MINIFY: bool> Gen<MINIFY> for TSInterfaceHeritage<'a> {
33573357
impl<'a, const MINIFY: bool> Gen<MINIFY> for TSEnumDeclaration<'a> {
33583358
fn gen(&self, p: &mut Codegen<{ MINIFY }>, ctx: Context) {
33593359
p.print_indent();
3360-
if self.modifiers.contains(ModifierKind::Export) {
3361-
p.print_str(b"export ");
3362-
}
3363-
if self.modifiers.contains(ModifierKind::Declare) {
3360+
if self.declare {
33643361
p.print_str(b"declare ");
33653362
}
3366-
if self.modifiers.contains(ModifierKind::Const) {
3363+
if self.r#const {
33673364
p.print_str(b"const ");
33683365
}
33693366
p.print_space_before_identifier();

crates/oxc_isolated_declarations/src/enum.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,17 @@ impl<'a> IsolatedDeclarations<'a> {
9191
members.push(member);
9292
}
9393
let mut modifiers = self.modifiers_declare();
94-
if decl.modifiers.contains(ModifierKind::Const) {
94+
if decl.r#const {
9595
modifiers.add_modifier(Modifier { span: SPAN, kind: ModifierKind::Const });
9696
}
9797

98-
Some(self.ast.ts_enum_declaration(decl.span, self.ast.copy(&decl.id), members, modifiers))
98+
Some(self.ast.ts_enum_declaration(
99+
decl.span,
100+
self.ast.copy(&decl.id),
101+
members,
102+
modifiers.is_contains_const(),
103+
modifiers.is_contains_declare(),
104+
))
99105
}
100106

101107
/// Evaluate the expression to a constant value.

crates/oxc_linter/src/rules/oxc/no_const_enum.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use oxc_ast::{ast::ModifierKind, AstKind};
1+
use oxc_ast::AstKind;
22
use oxc_diagnostics::OxcDiagnostic;
33
use oxc_macros::declare_oxc_lint;
44
use oxc_span::Span;
@@ -41,17 +41,16 @@ declare_oxc_lint!(
4141
impl Rule for NoConstEnum {
4242
fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) {
4343
if let AstKind::TSEnumDeclaration(enum_decl) = node.kind() {
44-
let Some(const_enum) = enum_decl
45-
.modifiers
46-
.find_where(|modifier| matches!(modifier.kind, ModifierKind::Const))
47-
else {
44+
if !enum_decl.r#const {
4845
return;
49-
};
46+
}
5047

51-
ctx.diagnostic_with_fix(no_const_enum_diagnostic(const_enum.span), |fixer| {
48+
let span = Span::new(enum_decl.span.start, enum_decl.span.start + 5);
49+
50+
ctx.diagnostic_with_fix(no_const_enum_diagnostic(span), |fixer| {
5251
// const enum Color { Red, Green, Blue }
5352
// ^
54-
let start = const_enum.span.start;
53+
let start = span.start;
5554

5655
// const enum Color { Red, Green, Blue }
5756
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

crates/oxc_parser/src/ts/statement.rs

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use super::{
88
types::ModifierFlags,
99
};
1010
use crate::{
11+
diagnostics,
1112
js::{FunctionKind, VariableDeclarationContext, VariableDeclarationParent},
1213
lexer::Kind,
1314
list::{NormalList, SeparatedList},
@@ -25,14 +26,30 @@ impl<'a> ParserImpl<'a> {
2526
pub(crate) fn parse_ts_enum_declaration(
2627
&mut self,
2728
span: Span,
28-
modifiers: Modifiers<'a>,
29+
modifiers: &Modifiers<'a>,
2930
) -> Result<Declaration<'a>> {
3031
self.bump_any(); // bump `enum`
3132

3233
let id = self.parse_binding_identifier()?;
3334
let members = TSEnumMemberList::parse(self)?.members;
3435
let span = self.end_span(span);
35-
Ok(self.ast.ts_enum_declaration(span, id, members, modifiers))
36+
37+
for modifier in modifiers.iter() {
38+
if !matches!(modifier.kind, ModifierKind::Declare | ModifierKind::Const) {
39+
self.error(diagnostics::modifiers_cannot_appear(
40+
modifier.span,
41+
modifier.kind.as_str(),
42+
));
43+
}
44+
}
45+
46+
Ok(self.ast.ts_enum_declaration(
47+
span,
48+
id,
49+
members,
50+
modifiers.is_contains_const(),
51+
modifiers.is_contains_declare(),
52+
))
3653
}
3754

3855
pub(crate) fn parse_ts_enum_member(&mut self) -> Result<TSEnumMember<'a>> {
@@ -289,7 +306,7 @@ impl<'a> ParserImpl<'a> {
289306
.map(Declaration::TSModuleDeclaration)
290307
}
291308
Kind::Type => self.parse_ts_type_alias_declaration(start_span, modifiers),
292-
Kind::Enum => self.parse_ts_enum_declaration(start_span, modifiers),
309+
Kind::Enum => self.parse_ts_enum_declaration(start_span, &modifiers),
293310
Kind::Interface if self.is_at_interface_declaration() => {
294311
self.parse_ts_interface_declaration(start_span, modifiers)
295312
}

crates/oxc_semantic/src/binder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ impl<'a> Binder for TSInterfaceDeclaration<'a> {
320320

321321
impl<'a> Binder for TSEnumDeclaration<'a> {
322322
fn bind(&self, builder: &mut SemanticBuilder) {
323-
let is_const = self.modifiers.contains(ModifierKind::Const);
323+
let is_const = self.r#const;
324324
let includes = if is_const { SymbolFlags::ConstEnum } else { SymbolFlags::RegularEnum };
325325
let excludes = if is_const {
326326
SymbolFlags::ConstEnumExcludes

0 commit comments

Comments
 (0)