@@ -107,7 +107,7 @@ impl<'a> ParserImpl<'a> {
107107 type_parameters,
108108 super_class,
109109 super_type_parameters,
110- implements,
110+ implements. map_or_else ( || self . ast . vec ( ) , | ( _ , implements ) | implements ) ,
111111 body,
112112 modifiers. contains_abstract ( ) ,
113113 modifiers. contains_declare ( ) ,
@@ -116,9 +116,9 @@ impl<'a> ParserImpl<'a> {
116116
117117 pub ( crate ) fn parse_heritage_clause (
118118 & mut self ,
119- ) -> ( Option < Extends < ' a > > , Vec < ' a , TSClassImplements < ' a > > ) {
119+ ) -> ( Option < Extends < ' a > > , Option < ( Span , Vec < ' a , TSClassImplements < ' a > > ) > ) {
120120 let mut extends = None ;
121- let mut implements = self . ast . vec ( ) ;
121+ let mut implements: Option < ( Span , Vec < ' a , TSClassImplements < ' a > > ) > = None ;
122122
123123 loop {
124124 match self . cur_kind ( ) {
@@ -127,20 +127,28 @@ impl<'a> ParserImpl<'a> {
127127 self . error ( diagnostics:: extends_clause_already_seen (
128128 self . cur_token ( ) . span ( ) ,
129129 ) ) ;
130- } else if ! implements. is_empty ( ) {
130+ } else if implements. is_some ( ) {
131131 self . error ( diagnostics:: extends_clause_must_precede_implements (
132132 self . cur_token ( ) . span ( ) ,
133133 ) ) ;
134134 }
135135 extends = Some ( self . parse_extends_clause ( ) ) ;
136136 }
137137 Kind :: Implements => {
138- if ! implements. is_empty ( ) {
138+ if implements. is_some ( ) {
139139 self . error ( diagnostics:: implements_clause_already_seen (
140140 self . cur_token ( ) . span ( ) ,
141141 ) ) ;
142142 }
143- implements. extend ( self . parse_ts_implements_clause ( ) ) ;
143+ let implements_kw_span = self . cur_token ( ) . span ( ) ;
144+ if let Some ( ( _, implements) ) = implements. as_mut ( ) {
145+ implements. extend ( self . parse_ts_implements_clause ( ) ) ;
146+ } else {
147+ implements = Some ( (
148+ implements_kw_span,
149+ self . ast . vec_from_iter ( self . parse_ts_implements_clause ( ) ) ,
150+ ) ) ;
151+ }
144152 }
145153 _ => break ,
146154 }
0 commit comments