11use oxc_allocator:: Box ;
22use oxc_ast:: ast:: * ;
33use oxc_diagnostics:: Result ;
4- use oxc_span:: Span ;
4+ use oxc_span:: { GetSpan , Span } ;
55
66use crate :: {
77 diagnostics,
@@ -59,21 +59,37 @@ impl<'a> ParserImpl<'a> {
5959 None
6060 } ;
6161
62- Ok ( TSEnumMember { span : self . end_span ( span) , id, initializer } )
62+ let span = self . end_span ( span) ;
63+ if initializer. is_some ( ) && matches ! ( id, TSEnumMemberName :: StaticTemplateLiteral ( _) ) {
64+ self . error ( diagnostics:: invalid_assignment ( span) )
65+ }
66+
67+ Ok ( TSEnumMember { span, id, initializer } )
6368 }
6469
6570 fn parse_ts_enum_member_name ( & mut self ) -> Result < TSEnumMemberName < ' a > > {
6671 match self . cur_kind ( ) {
6772 Kind :: LBrack => {
6873 let node = self . parse_computed_property_name ( ) ?;
74+ self . check_invalid_ts_enum_computed_property ( & node) ;
6975 Ok ( self . ast . ts_enum_member_name_expression ( node) )
7076 }
7177 Kind :: Str => {
7278 let node = self . parse_literal_string ( ) ?;
7379 Ok ( self . ast . ts_enum_member_name_from_string_literal ( node) )
7480 }
81+ Kind :: NoSubstitutionTemplate | Kind :: TemplateHead => {
82+ let node = self . parse_template_literal ( false ) ?;
83+ if !node. expressions . is_empty ( ) {
84+ self . error ( diagnostics:: computed_property_names_not_allowed_in_enums (
85+ node. span ( ) ,
86+ ) )
87+ }
88+ Ok ( self . ast . ts_enum_member_name_from_template_literal ( node) )
89+ }
7590 kind if kind. is_number ( ) => {
7691 let node = self . parse_literal_number ( ) ?;
92+ self . error ( diagnostics:: enum_member_cannot_have_numeric_name ( node. span ( ) ) ) ;
7793 Ok ( self . ast . ts_enum_member_name_from_numeric_literal ( node) )
7894 }
7995 _ => {
@@ -82,6 +98,21 @@ impl<'a> ParserImpl<'a> {
8298 }
8399 }
84100 }
101+ fn check_invalid_ts_enum_computed_property ( & mut self , property : & Expression < ' a > ) {
102+ match property {
103+ Expression :: StringLiteral ( _) => {
104+ return ;
105+ }
106+ Expression :: TemplateLiteral ( template) if template. expressions . is_empty ( ) => {
107+ return ;
108+ }
109+ Expression :: NumericLiteral ( _) => {
110+ self . error ( diagnostics:: enum_member_cannot_have_numeric_name ( property. span ( ) ) )
111+ }
112+ _ => self
113+ . error ( diagnostics:: computed_property_names_not_allowed_in_enums ( property. span ( ) ) ) ,
114+ }
115+ }
85116
86117 /** ------------------- Annotation ----------------- */
87118
0 commit comments