@@ -22,9 +22,10 @@ use crate::{
22
22
dependency:: { ImportContextDependency , ImportDependency , ImportEagerDependency } ,
23
23
utils:: object_properties:: { get_attributes, get_value_by_obj_prop} ,
24
24
visitors:: {
25
- ContextModuleScanResult , JavascriptParser , Statement , TagInfoData , TopLevelScope ,
26
- VariableDeclaration , context_reg_exp, create_context_dependency, create_traceable_error,
27
- get_non_optional_part, parse_order_string,
25
+ AllowedMemberTypes , ContextModuleScanResult , ExportedVariableInfo , JavascriptParser ,
26
+ MemberExpressionInfo , Statement , TagInfoData , TopLevelScope , VariableDeclaration ,
27
+ context_reg_exp, create_context_dependency, create_traceable_error, get_non_optional_part,
28
+ parse_order_string,
28
29
} ,
29
30
webpack_comment:: try_extract_webpack_magic_comment,
30
31
} ;
@@ -55,30 +56,26 @@ impl ImportsReferencesState {
55
56
self . inner . insert ( import, ImportReferences :: default ( ) ) ;
56
57
}
57
58
58
- pub fn add_import_reference ( & mut self , import : Span , reference : Vec < Atom > ) {
59
- let references = self
60
- . inner
61
- . get_mut ( & import)
62
- . expect ( "should add_import before" ) ;
63
- references. references . push ( reference) ;
59
+ fn get_import ( & self , import : & Span ) -> Option < & ImportReferences > {
60
+ self . inner . get ( import)
61
+ }
62
+
63
+ fn get_import_mut ( & mut self , import : & Span ) -> Option < & mut ImportReferences > {
64
+ self . inner . get_mut ( import)
65
+ }
66
+
67
+ fn get_import_mut_expect ( & mut self , import : & Span ) -> & mut ImportReferences {
68
+ self . get_import_mut ( import) . expect ( "should get import" )
64
69
}
65
70
66
- fn take_import_references (
71
+ fn take_all_import_references (
67
72
& mut self ,
68
73
) -> impl Iterator < Item = ( ImportDependencyLocator , Vec < Vec < Atom > > ) > + use < > {
69
74
let inner = std:: mem:: take ( & mut self . inner ) ;
70
75
inner
71
76
. into_values ( )
72
77
. filter_map ( |value| value. dep_locator . map ( |locator| ( locator, value. references ) ) )
73
78
}
74
-
75
- fn get_import ( & self , import : & Span ) -> Option < & ImportReferences > {
76
- self . inner . get ( import)
77
- }
78
-
79
- fn get_import_mut ( & mut self , import : & Span ) -> Option < & mut ImportReferences > {
80
- self . inner . get_mut ( import)
81
- }
82
79
}
83
80
84
81
#[ derive( Debug , Default ) ]
@@ -87,6 +84,12 @@ struct ImportReferences {
87
84
references : Vec < Vec < Atom > > ,
88
85
}
89
86
87
+ impl ImportReferences {
88
+ pub fn add_reference ( & mut self , reference : Vec < Atom > ) {
89
+ self . references . push ( reference) ;
90
+ }
91
+ }
92
+
90
93
#[ derive( Debug , PartialEq , Eq , Hash ) ]
91
94
struct ImportDependencyLocator {
92
95
block_idx : Option < usize > ,
@@ -104,14 +107,24 @@ pub struct ImportParserPlugin;
104
107
impl JavascriptParserPlugin for ImportParserPlugin {
105
108
fn can_collect_destructuring_assignment_properties (
106
109
& self ,
107
- _parser : & mut JavascriptParser ,
110
+ parser : & mut JavascriptParser ,
108
111
expr : & Expr ,
109
112
) -> Option < bool > {
110
113
if let Some ( call) = expr. as_call ( )
111
114
&& call. callee . is_import ( )
112
115
{
113
116
return Some ( true ) ;
114
117
}
118
+ if let MemberExpressionInfo :: Expression ( info) =
119
+ parser. get_member_expression_info_from_expr ( expr, AllowedMemberTypes :: Expression ) ?
120
+ && let ExportedVariableInfo :: VariableInfo ( id) = & info. root_info
121
+ && let Some ( name) = & parser. definitions_db . expect_get_variable ( * id) . name
122
+ && parser
123
+ . get_tag_data ( & name. clone ( ) , DYNAMIC_IMPORT_TAG )
124
+ . is_some ( )
125
+ {
126
+ return Some ( true ) ;
127
+ }
115
128
None
116
129
}
117
130
@@ -135,7 +148,7 @@ impl JavascriptParserPlugin for ImportParserPlugin {
135
148
fn identifier (
136
149
& self ,
137
150
parser : & mut JavascriptParser ,
138
- _ident : & Ident ,
151
+ ident : & Ident ,
139
152
for_name : & str ,
140
153
) -> Option < bool > {
141
154
if for_name != DYNAMIC_IMPORT_TAG {
@@ -145,9 +158,22 @@ impl JavascriptParserPlugin for ImportParserPlugin {
145
158
. definitions_db
146
159
. expect_get_tag_info ( parser. current_tag_info ?) ;
147
160
let data = ImportTagData :: downcast ( tag_info. data . clone ( ) ?) ;
148
- parser
149
- . dynamic_import_references
150
- . add_import_reference ( data. import_span , vec ! [ ] ) ;
161
+ if let Some ( keys) = parser
162
+ . destructuring_assignment_properties
163
+ . get ( & ident. span ( ) )
164
+ {
165
+ for key in keys {
166
+ parser
167
+ . dynamic_import_references
168
+ . get_import_mut_expect ( & data. import_span )
169
+ . add_reference ( vec ! [ key. id. clone( ) ] ) ;
170
+ }
171
+ } else {
172
+ parser
173
+ . dynamic_import_references
174
+ . get_import_mut_expect ( & data. import_span )
175
+ . add_reference ( vec ! [ ] ) ;
176
+ }
151
177
Some ( true )
152
178
}
153
179
@@ -170,7 +196,8 @@ impl JavascriptParserPlugin for ImportParserPlugin {
170
196
let ids = get_non_optional_part ( members, members_optionals) ;
171
197
parser
172
198
. dynamic_import_references
173
- . add_import_reference ( data. import_span , ids. to_vec ( ) ) ;
199
+ . get_import_mut_expect ( & data. import_span )
200
+ . add_reference ( ids. to_vec ( ) ) ;
174
201
Some ( true )
175
202
}
176
203
@@ -198,7 +225,8 @@ impl JavascriptParserPlugin for ImportParserPlugin {
198
225
}
199
226
parser
200
227
. dynamic_import_references
201
- . add_import_reference ( data. import_span , ids. to_vec ( ) ) ;
228
+ . get_import_mut_expect ( & data. import_span )
229
+ . add_reference ( ids. to_vec ( ) ) ;
202
230
parser. walk_expr_or_spread ( & expr. args ) ;
203
231
Some ( true )
204
232
}
@@ -263,8 +291,10 @@ impl JavascriptParserPlugin for ImportParserPlugin {
263
291
. collect :: < Vec < _ > > ( )
264
292
} ) ;
265
293
266
- let referenced_in_destructuring =
267
- parser. destructuring_assignment_properties_for ( & import_call_span) ;
294
+ let referenced_in_destructuring = parser
295
+ . destructuring_assignment_properties
296
+ . get ( & import_call_span)
297
+ . cloned ( ) ;
268
298
let referenced_in_member = parser
269
299
. dynamic_import_references
270
300
. get_import ( & import_call_span) ;
@@ -421,7 +451,10 @@ impl JavascriptParserPlugin for ImportParserPlugin {
421
451
}
422
452
423
453
fn finish ( & self , parser : & mut JavascriptParser ) -> Option < bool > {
424
- for ( locator, references) in parser. dynamic_import_references . take_import_references ( ) {
454
+ for ( locator, references) in parser
455
+ . dynamic_import_references
456
+ . take_all_import_references ( )
457
+ {
425
458
let dep = if let Some ( block_idx) = locator. block_idx
426
459
&& let Some ( block) = parser. get_block_mut ( block_idx)
427
460
{
@@ -437,19 +470,19 @@ impl JavascriptParserPlugin for ImportParserPlugin {
437
470
let dep = dep
438
471
. downcast_mut :: < ImportDependency > ( )
439
472
. expect ( "Failed to downcast to ImportDependency" ) ;
440
- dep. referenced_exports = Some ( references) ;
473
+ dep. set_referenced_exports ( references) ;
441
474
}
442
475
DependencyType :: DynamicImportEager => {
443
476
let dep = dep
444
477
. downcast_mut :: < ImportEagerDependency > ( )
445
478
. expect ( "Failed to downcast to ImportEagerDependency" ) ;
446
- dep. referenced_exports = Some ( references) ;
479
+ dep. set_referenced_exports ( references) ;
447
480
}
448
481
DependencyType :: ImportContext => {
449
482
let dep = dep
450
483
. downcast_mut :: < ImportContextDependency > ( )
451
484
. expect ( "Failed to downcast to ImportContextDependency" ) ;
452
- dep. options . referenced_exports = Some ( references) ;
485
+ dep. set_referenced_exports ( references) ;
453
486
}
454
487
_ => unreachable ! ( ) ,
455
488
} ;
@@ -530,10 +563,11 @@ fn walk_import_then_fulfilled_callback(
530
563
parser
531
564
. dynamic_import_references
532
565
. add_import ( import_call. span ( ) ) ;
566
+ let import_references = parser
567
+ . dynamic_import_references
568
+ . get_import_mut_expect ( & import_call. span ( ) ) ;
533
569
for key in keys {
534
- parser
535
- . dynamic_import_references
536
- . add_import_reference ( import_call. span ( ) , vec ! [ key. id. clone( ) ] ) ;
570
+ import_references. add_reference ( vec ! [ key. id. clone( ) ] ) ;
537
571
}
538
572
}
539
573
} else {
0 commit comments