@@ -10,7 +10,7 @@ pub enum IdentKind {
10
10
Object ( Vec < PropOrSpread > ) ,
11
11
Class ( Class ) ,
12
12
Fn ( FnDesc ) ,
13
- Reexport ( String ) ,
13
+ Reexport ( Reexport ) ,
14
14
Unkonwn ,
15
15
}
16
16
@@ -20,6 +20,12 @@ pub struct FnDesc {
20
20
extends : Vec < String > ,
21
21
}
22
22
23
+ #[ derive( Clone , Debug ) ]
24
+ pub struct Reexport {
25
+ path : String ,
26
+ extends : Vec < String > ,
27
+ }
28
+
23
29
pub struct ModuleLexer {
24
30
pub node_env : String ,
25
31
pub call_mode : bool ,
@@ -44,10 +50,13 @@ impl ModuleLexer {
44
50
45
51
if let Some ( reexport) = self . as_reexport ( expr) {
46
52
self . clear ( ) ;
47
- self . reexports . insert ( reexport) ;
53
+ for name in reexport. extends {
54
+ self . named_exports . insert ( name) ;
55
+ }
56
+ self . reexports . insert ( reexport. path ) ;
48
57
} else if let Some ( props) = self . as_obj ( expr) {
49
58
self . clear ( ) ;
50
- self . use_object_as_exports ( props) ;
59
+ self . update_exports_from_object ( props) ;
51
60
} else if let Some ( class) = self . as_class ( expr) {
52
61
self . clear ( ) ;
53
62
for name in get_class_static_names ( & class) {
@@ -67,7 +76,10 @@ impl ModuleLexer {
67
76
if let Some ( callee) = with_expr_callee ( call) {
68
77
if let Some ( reexport) = self . as_reexport ( callee) {
69
78
self . clear ( ) ;
70
- self . reexports . insert ( format ! ( "{}()" , reexport) ) ;
79
+ for name in reexport. extends {
80
+ self . named_exports . insert ( name) ;
81
+ }
82
+ self . reexports . insert ( format ! ( "{}()" , reexport. path) ) ;
71
83
} else if let Some ( FnDesc { stmts, .. } ) = self . as_function ( callee) {
72
84
self . walk_body ( stmts, true ) ;
73
85
}
@@ -104,8 +116,10 @@ impl ModuleLexer {
104
116
}
105
117
}
106
118
Expr :: Call ( call) => {
107
- if let Some ( file) = with_require_call ( & call) {
108
- self . idents . insert ( name. into ( ) , IdentKind :: Reexport ( file) ) ;
119
+ if let Some ( path) = with_require_call ( & call) {
120
+ self
121
+ . idents
122
+ . insert ( name. into ( ) , IdentKind :: Reexport ( Reexport { path, extends : vec ! [ ] } ) ) ;
109
123
}
110
124
}
111
125
Expr :: Object ( obj) => {
@@ -244,14 +258,20 @@ impl ModuleLexer {
244
258
}
245
259
}
246
260
247
- fn as_reexport ( & self , expr : & Expr ) -> Option < String > {
261
+ fn as_reexport ( & self , expr : & Expr ) -> Option < Reexport > {
248
262
match expr {
249
263
Expr :: Paren ( ParenExpr { expr, .. } ) => return self . as_reexport ( expr) ,
250
- Expr :: Call ( call) => with_require_call ( & call) ,
264
+ Expr :: Call ( call) => {
265
+ if let Some ( path) = with_require_call ( & call) {
266
+ return Some ( Reexport { path, extends : vec ! [ ] } ) ;
267
+ } else {
268
+ None
269
+ }
270
+ }
251
271
Expr :: Ident ( id) => {
252
272
if let Some ( value) = self . idents . get ( id. sym . as_ref ( ) ) {
253
273
match value {
254
- IdentKind :: Reexport ( file ) => return Some ( file . to_owned ( ) ) ,
274
+ IdentKind :: Reexport ( reexport ) => return Some ( reexport . clone ( ) ) ,
255
275
IdentKind :: Alias ( id) => return self . as_reexport ( & Expr :: Ident ( quote_ident ( id) ) ) ,
256
276
_ => { }
257
277
}
@@ -307,8 +327,8 @@ impl ModuleLexer {
307
327
}
308
328
}
309
329
310
- fn use_object_as_exports ( & mut self , props : Vec < PropOrSpread > ) {
311
- for prop in props {
330
+ fn update_exports_from_object ( & mut self , obj_props : Vec < PropOrSpread > ) {
331
+ for prop in obj_props {
312
332
match prop {
313
333
PropOrSpread :: Prop ( prop) => {
314
334
let name = match prop. as_ref ( ) {
@@ -324,10 +344,10 @@ impl ModuleLexer {
324
344
PropOrSpread :: Spread ( SpreadElement { expr, .. } ) => match expr. as_ref ( ) {
325
345
Expr :: Ident ( _) => {
326
346
if let Some ( props) = self . as_obj ( expr. as_ref ( ) ) {
327
- self . use_object_as_exports ( props) ;
347
+ self . update_exports_from_object ( props) ;
328
348
}
329
349
if let Some ( reexport) = self . as_reexport ( expr. as_ref ( ) ) {
330
- self . reexports . insert ( reexport) ;
350
+ self . reexports . insert ( reexport. path ) ;
331
351
}
332
352
}
333
353
Expr :: Call ( call) => {
@@ -927,6 +947,11 @@ impl ModuleLexer {
927
947
self
928
948
. idents
929
949
. insert ( obj_name. into ( ) , IdentKind :: Fn ( FnDesc { stmts, extends } ) ) ;
950
+ } else if let Some ( Reexport { path, mut extends } ) = self . as_reexport ( & obj) {
951
+ extends. push ( key. to_owned ( ) ) ;
952
+ self
953
+ . idents
954
+ . insert ( obj_name. into ( ) , IdentKind :: Reexport ( Reexport { path, extends } ) ) ;
930
955
}
931
956
}
932
957
}
@@ -1064,28 +1089,28 @@ impl ModuleLexer {
1064
1089
self . replace_exports_from_expr ( & exports_expr) ;
1065
1090
}
1066
1091
} else if is_exports {
1067
- self . use_object_as_exports ( props) ;
1092
+ self . update_exports_from_object ( props) ;
1068
1093
}
1069
1094
} else if let Some ( reexport) = self . as_reexport ( & arg. expr ) {
1070
1095
if is_exports {
1071
- self . reexports . insert ( reexport) ;
1096
+ self . reexports . insert ( reexport. path ) ;
1072
1097
}
1073
1098
}
1074
1099
}
1075
1100
} else if is_tslib_export_star_call ( & call) && call. args . len ( ) >= 2 {
1076
1101
let is_exports = self . is_exports_expr ( call. args [ 1 ] . expr . as_ref ( ) ) ;
1077
1102
if is_exports {
1078
1103
if let Some ( props) = self . as_obj ( call. args [ 0 ] . expr . as_ref ( ) ) {
1079
- self . use_object_as_exports ( props) ;
1104
+ self . update_exports_from_object ( props) ;
1080
1105
} else if let Some ( reexport) = self . as_reexport ( call. args [ 0 ] . expr . as_ref ( ) ) {
1081
- self . reexports . insert ( reexport) ;
1106
+ self . reexports . insert ( reexport. path ) ;
1082
1107
}
1083
1108
}
1084
1109
} else if is_export_call ( & call) && call. args . len ( ) > 0 {
1085
1110
if let Some ( props) = self . as_obj ( call. args [ 0 ] . expr . as_ref ( ) ) {
1086
- self . use_object_as_exports ( props) ;
1111
+ self . update_exports_from_object ( props) ;
1087
1112
} else if let Some ( reexport) = self . as_reexport ( call. args [ 0 ] . expr . as_ref ( ) ) {
1088
- self . reexports . insert ( reexport) ;
1113
+ self . reexports . insert ( reexport. path ) ;
1089
1114
}
1090
1115
} else if let Some ( body) = self . is_umd_iife_call ( & call) {
1091
1116
self . walk_body ( body, false ) ;
0 commit comments