@@ -276,39 +276,49 @@ impl Decorator202203 {
276
276
}
277
277
278
278
fn ensure_constructor < ' a > ( & mut self , c : & ' a mut Class ) -> & ' a mut Constructor {
279
- for member in c. body . iter_mut ( ) {
279
+ let mut insert_index = 0 ;
280
+ for ( i, member) in c. body . iter_mut ( ) . enumerate ( ) {
280
281
if let ClassMember :: Constructor ( constructor) = member {
281
- return unsafe {
282
- // Safety: We need polonius
283
- transmute :: < & mut Constructor , & ' a mut Constructor > ( constructor)
284
- } ;
282
+ insert_index = i + 1 ;
283
+ // decorators occur before typescript's type strip, so skip ctor overloads
284
+ if constructor. body . is_some ( ) {
285
+ return unsafe {
286
+ // Safety: We need polonius
287
+ transmute :: < & mut Constructor , & ' a mut Constructor > ( constructor)
288
+ } ;
289
+ }
285
290
}
286
291
}
287
292
288
- c. body
289
- . insert ( 0 , default_constructor ( c. super_class . is_some ( ) ) . into ( ) ) ;
293
+ c. body . insert (
294
+ insert_index,
295
+ default_constructor ( c. super_class . is_some ( ) ) . into ( ) ,
296
+ ) ;
290
297
291
- for member in c. body . iter_mut ( ) {
292
- if let ClassMember :: Constructor ( constructor ) = member {
293
- return constructor ;
294
- }
298
+ if let Some ( ClassMember :: Constructor ( c ) ) = c. body . get_mut ( insert_index ) {
299
+ c
300
+ } else {
301
+ unreachable ! ( )
295
302
}
296
-
297
- unreachable ! ( )
298
303
}
299
304
300
305
fn ensure_identity_constructor < ' a > ( & mut self , c : & ' a mut Class ) -> & ' a mut Constructor {
301
- for member in c. body . iter_mut ( ) {
306
+ let mut insert_index = 0 ;
307
+ for ( i, member) in c. body . iter_mut ( ) . enumerate ( ) {
302
308
if let ClassMember :: Constructor ( constructor) = member {
303
- return unsafe {
304
- // Safety: We need polonius
305
- transmute :: < & mut Constructor , & ' a mut Constructor > ( constructor)
306
- } ;
309
+ insert_index = i + 1 ;
310
+ // decorators occur before typescript's type strip, so skip ctor overloads
311
+ if constructor. body . is_some ( ) {
312
+ return unsafe {
313
+ // Safety: We need polonius
314
+ transmute :: < & mut Constructor , & ' a mut Constructor > ( constructor)
315
+ } ;
316
+ }
307
317
}
308
318
}
309
319
310
320
c. body . insert (
311
- 0 ,
321
+ insert_index ,
312
322
ClassMember :: Constructor ( Constructor {
313
323
span : DUMMY_SP ,
314
324
key : PropName :: Ident ( quote_ident ! ( "constructor" ) ) ,
@@ -322,13 +332,11 @@ impl Decorator202203 {
322
332
} ) ,
323
333
) ;
324
334
325
- for member in c. body . iter_mut ( ) {
326
- if let ClassMember :: Constructor ( constructor ) = member {
327
- return constructor ;
328
- }
335
+ if let Some ( ClassMember :: Constructor ( c ) ) = c. body . get_mut ( insert_index ) {
336
+ c
337
+ } else {
338
+ unreachable ! ( )
329
339
}
330
-
331
- unreachable ! ( )
332
340
}
333
341
334
342
fn handle_super_class ( & mut self , class : & mut Class ) {
0 commit comments