@@ -13,10 +13,13 @@ static HOIST_METHODS: phf::Set<&str> = phf_set![
1313] ;
1414
1515pub fn jest ( ) -> impl Fold + VisitMut {
16- as_folder ( Jest )
16+ as_folder ( Jest :: default ( ) )
1717}
1818
19- struct Jest ;
19+ #[ derive( Default ) ]
20+ struct Jest {
21+ imported : Vec < Id > ,
22+ }
2023
2124impl Jest {
2225 fn visit_mut_stmt_like < T > ( & mut self , orig : & mut Vec < T > )
@@ -38,21 +41,13 @@ impl Jest {
3841 Expr :: Call ( CallExpr {
3942 callee : Callee :: Expr ( callee) ,
4043 ..
41- } ) => match & * * callee {
42- Expr :: Member (
43- callee @ MemberExpr {
44- prop : MemberProp :: Ident ( prop) ,
45- ..
46- } ,
47- ) => {
48- if is_jest ( & callee. obj ) && HOIST_METHODS . contains ( & * prop. sym ) {
49- hoisted. push ( T :: from_stmt ( stmt) )
50- } else {
51- new. push ( T :: from_stmt ( stmt) ) ;
52- }
44+ } ) => {
45+ if self . should_hoist ( callee) {
46+ hoisted. push ( T :: from_stmt ( stmt) )
47+ } else {
48+ new. push ( T :: from_stmt ( stmt) )
5349 }
54- _ => new. push ( T :: from_stmt ( stmt) ) ,
55- } ,
50+ }
5651 _ => new. push ( T :: from_stmt ( stmt) ) ,
5752 } ,
5853
@@ -66,12 +61,63 @@ impl Jest {
6661
6762 * orig = new;
6863 }
64+
65+ fn should_hoist ( & self , e : & Expr ) -> bool {
66+ match e {
67+ Expr :: Ident ( i) => self . imported . iter ( ) . any ( |imported| * imported == i. to_id ( ) ) ,
68+
69+ Expr :: Member (
70+ callee @ MemberExpr {
71+ prop : MemberProp :: Ident ( prop) ,
72+ ..
73+ } ,
74+ ) => is_global_jest ( & callee. obj ) && HOIST_METHODS . contains ( & * prop. sym ) ,
75+
76+ _ => false ,
77+ }
78+ }
6979}
7080
7181impl VisitMut for Jest {
7282 noop_visit_mut_type ! ( ) ;
7383
7484 fn visit_mut_module_items ( & mut self , items : & mut Vec < ModuleItem > ) {
85+ for item in items. iter ( ) {
86+ if let ModuleItem :: ModuleDecl ( ModuleDecl :: Import ( ImportDecl {
87+ specifiers, src, ..
88+ } ) ) = item
89+ {
90+ if src. value == "@jest/globals" {
91+ for s in specifiers {
92+ match s {
93+ ImportSpecifier :: Named ( ImportNamedSpecifier {
94+ local,
95+ imported : None ,
96+ is_type_only : false ,
97+ ..
98+ } ) => {
99+ if HOIST_METHODS . contains ( & * local. sym ) {
100+ self . imported . push ( local. to_id ( ) ) ;
101+ }
102+ }
103+
104+ ImportSpecifier :: Named ( ImportNamedSpecifier {
105+ local,
106+ imported : Some ( exported) ,
107+ is_type_only : false ,
108+ ..
109+ } ) => {
110+ if HOIST_METHODS . contains ( exported. atom ( ) ) {
111+ self . imported . push ( local. to_id ( ) ) ;
112+ }
113+ }
114+ _ => { }
115+ }
116+ }
117+ }
118+ }
119+ }
120+
75121 self . visit_mut_stmt_like ( items)
76122 }
77123
@@ -80,14 +126,14 @@ impl VisitMut for Jest {
80126 }
81127}
82128
83- fn is_jest ( e : & Expr ) -> bool {
129+ fn is_global_jest ( e : & Expr ) -> bool {
84130 match e {
85131 Expr :: Ident ( i) => i. sym == * "jest" ,
86- Expr :: Member ( MemberExpr { obj, .. } ) => is_jest ( obj) ,
132+ Expr :: Member ( MemberExpr { obj, .. } ) => is_global_jest ( obj) ,
87133 Expr :: Call ( CallExpr {
88134 callee : Callee :: Expr ( callee) ,
89135 ..
90- } ) => is_jest ( callee) ,
136+ } ) => is_global_jest ( callee) ,
91137 _ => false ,
92138 }
93139}
0 commit comments