1
- use std:: iter:: once;
2
-
3
1
use swc_common:: { util:: take:: Take , DUMMY_SP } ;
4
2
use swc_ecma_ast:: * ;
5
3
use swc_ecma_transforms_base:: helper;
6
- use swc_ecma_utils:: { find_pat_ids, private_ident, ExprFactory , ModuleItemLike , StmtLike } ;
4
+ use swc_ecma_utils:: {
5
+ find_pat_ids, private_ident, quote_ident, ExprFactory , ModuleItemLike , StmtLike ,
6
+ } ;
7
7
use swc_ecma_visit:: { as_folder, noop_visit_mut_type, Fold , VisitMut , VisitMutWith } ;
8
8
9
9
pub fn explicit_resource_management ( ) -> impl Fold + VisitMut {
@@ -18,9 +18,7 @@ struct ExplicitResourceManagement {
18
18
}
19
19
20
20
struct State {
21
- stack : Ident ,
22
- has_error : Ident ,
23
- error_var : Ident ,
21
+ using_ctx : Ident ,
24
22
catch_var : Ident ,
25
23
26
24
has_await : bool ,
@@ -29,9 +27,7 @@ struct State {
29
27
impl Default for State {
30
28
fn default ( ) -> Self {
31
29
Self {
32
- stack : private_ident ! ( "_stack" ) ,
33
- has_error : private_ident ! ( "_hasError" ) ,
34
- error_var : private_ident ! ( "_error" ) ,
30
+ using_ctx : private_ident ! ( "_usingCtx" ) ,
35
31
catch_var : private_ident ! ( "_" ) ,
36
32
has_await : false ,
37
33
}
@@ -63,13 +59,15 @@ impl ExplicitResourceManagement {
63
59
let mut extras = vec ! [ ] ;
64
60
let mut try_body = vec ! [ ] ;
65
61
66
- let stack_var_decl = VarDeclarator {
62
+ let using_ctx_var = VarDeclarator {
67
63
span : DUMMY_SP ,
68
- name : state. stack . clone ( ) . into ( ) ,
64
+ name : state. using_ctx . clone ( ) . into ( ) ,
69
65
init : Some (
70
- ArrayLit {
66
+ CallExpr {
67
+ callee : helper ! ( using_ctx) ,
71
68
span : DUMMY_SP ,
72
- elems : vec ! [ ] ,
69
+ args : Default :: default ( ) ,
70
+ type_args : Default :: default ( ) ,
73
71
}
74
72
. into ( ) ,
75
73
) ,
@@ -80,16 +78,16 @@ impl ExplicitResourceManagement {
80
78
span : DUMMY_SP ,
81
79
kind : VarDeclKind :: Var ,
82
80
declare : false ,
83
- decls : vec ! [ stack_var_decl ] ,
81
+ decls : vec ! [ using_ctx_var ] ,
84
82
} ) ) ) ) ;
85
83
86
84
for stmt in stmts. take ( ) {
87
85
match stmt. try_into_stmt ( ) {
88
86
Ok ( stmt @ Stmt :: Decl ( Decl :: Fn ( ..) ) ) => {
89
87
new. push ( T :: from_stmt ( stmt) ) ;
90
88
}
91
- Ok ( Stmt :: Decl ( Decl :: Var ( mut var) ) ) => {
92
- var. kind = VarDeclKind :: Var ;
89
+ Ok ( Stmt :: Decl ( Decl :: Var ( var) ) ) => {
90
+ // var.kind = VarDeclKind::Var;
93
91
try_body. push ( Stmt :: Decl ( Decl :: Var ( var) ) ) ;
94
92
}
95
93
Ok ( stmt) => try_body. push ( stmt) ,
@@ -310,39 +308,28 @@ impl ExplicitResourceManagement {
310
308
// Drop `;`
311
309
try_body. retain ( |stmt| !matches ! ( stmt, Stmt :: Empty ( ..) ) ) ;
312
310
313
- // var error = $catch_var
314
- let error_catch_var = Stmt :: Decl ( Decl :: Var ( Box :: new ( VarDecl {
315
- span : DUMMY_SP ,
316
- kind : VarDeclKind :: Var ,
317
- declare : false ,
318
- decls : vec ! [ VarDeclarator {
319
- span: DUMMY_SP ,
320
- name: state. error_var. clone( ) . into( ) ,
321
- init: Some ( state. catch_var. clone( ) . into( ) ) ,
322
- definite: false ,
323
- } ] ,
324
- } ) ) ) ;
325
-
326
- // var has_error = true
327
- let has_error_true = Stmt :: Decl ( Decl :: Var ( Box :: new ( VarDecl {
311
+ // usingCtx.e = $catch_var
312
+ let assign_error = AssignExpr {
328
313
span : DUMMY_SP ,
329
- kind : VarDeclKind :: Var ,
330
- declare : false ,
331
- decls : vec ! [ VarDeclarator {
332
- span: DUMMY_SP ,
333
- name: state. has_error. clone( ) . into( ) ,
334
- init: Some ( true . into( ) ) ,
335
- definite: false ,
336
- } ] ,
337
- } ) ) ) ;
314
+ op : op ! ( "=" ) ,
315
+ left : state
316
+ . using_ctx
317
+ . clone ( )
318
+ . make_member ( quote_ident ! ( "e" ) )
319
+ . into ( ) ,
320
+ right : state. catch_var . clone ( ) . into ( ) ,
321
+ }
322
+ . into_stmt ( ) ;
323
+
324
+ // _usingCtx.d()
338
325
let dispose_expr = CallExpr {
339
326
span : DUMMY_SP ,
340
- callee : helper ! ( dispose ) ,
341
- args : vec ! [
342
- state . stack . as_arg ( ) ,
343
- state . error_var . as_arg ( ) ,
344
- state . has_error . as_arg ( ) ,
345
- ] ,
327
+ callee : state
328
+ . using_ctx
329
+ . clone ( )
330
+ . make_member ( quote_ident ! ( "d" ) )
331
+ . as_callee ( ) ,
332
+ args : vec ! [ ] ,
346
333
type_args : Default :: default ( ) ,
347
334
} ;
348
335
let dispose_stmt = if state. has_await {
@@ -366,7 +353,7 @@ impl ExplicitResourceManagement {
366
353
param : Some ( state. catch_var . into ( ) ) ,
367
354
body : BlockStmt {
368
355
span : DUMMY_SP ,
369
- stmts : vec ! [ error_catch_var , has_error_true ] ,
356
+ stmts : vec ! [ assign_error ] ,
370
357
} ,
371
358
} ) ,
372
359
finalizer : Some ( BlockStmt {
@@ -434,15 +421,16 @@ impl VisitMut for ExplicitResourceManagement {
434
421
. map ( |d| {
435
422
let init = CallExpr {
436
423
span : decl. span ,
437
- callee : helper ! ( using ) ,
438
- args : once ( state . stack . clone ( ) . as_arg ( ) )
439
- . chain ( once ( d . init . unwrap ( ) . as_arg ( ) ) )
440
- . chain ( if decl. is_await {
441
- Some ( true . as_arg ( ) )
424
+ callee : state
425
+ . using_ctx
426
+ . clone ( )
427
+ . make_member ( if decl. is_await {
428
+ quote_ident ! ( "a" )
442
429
} else {
443
- None
430
+ quote_ident ! ( "u" )
444
431
} )
445
- . collect ( ) ,
432
+ . as_callee ( ) ,
433
+ args : vec ! [ d. init. unwrap( ) . as_arg( ) ] ,
446
434
type_args : Default :: default ( ) ,
447
435
} ;
448
436
0 commit comments