@@ -17,9 +17,9 @@ mod remove_unused_private_members;
1717mod replace_known_methods;
1818mod substitute_alternate_syntax;
1919
20+ use oxc_allocator:: HashSet ;
2021use oxc_ast_visit:: Visit ;
2122use oxc_semantic:: ReferenceId ;
22- use rustc_hash:: FxHashSet ;
2323
2424use oxc_allocator:: Vec ;
2525use oxc_ast:: ast:: * ;
@@ -116,12 +116,16 @@ impl<'a> Traverse<'a, MinifierState<'a>> for PeepholeOptimizations {
116116 self . changed = ctx. state . changed ;
117117 if self . changed {
118118 // Remove unused references by visiting the AST again and diff the collected references.
119- let refs_before =
120- ctx. scoping ( ) . resolved_references ( ) . flatten ( ) . copied ( ) . collect :: < FxHashSet < _ > > ( ) ;
121- let mut counter = ReferencesCounter :: default ( ) ;
119+ let refs_before = HashSet :: from_iter_in (
120+ ctx. scoping ( ) . resolved_references ( ) . flatten ( ) . copied ( ) ,
121+ ctx. ast . allocator ,
122+ ) ;
123+ let mut counter = ReferencesCounter :: new_in ( ctx. ast . allocator ) ;
122124 counter. visit_program ( program) ;
123- for reference_id_to_remove in refs_before. difference ( & counter. refs ) {
124- ctx. scoping_mut ( ) . delete_reference ( * reference_id_to_remove) ;
125+ for reference_id in & refs_before {
126+ if !counter. refs . contains ( reference_id) {
127+ ctx. scoping_mut ( ) . delete_reference ( * reference_id) ;
128+ }
125129 }
126130 }
127131 debug_assert ! ( ctx. state. class_symbols_stack. is_exhausted( ) ) ;
@@ -365,7 +369,7 @@ impl<'a> Traverse<'a, MinifierState<'a>> for PeepholeOptimizations {
365369 }
366370
367371 fn enter_class_body ( & mut self , _body : & mut ClassBody < ' a > , ctx : & mut TraverseCtx < ' a > ) {
368- ctx. state . class_symbols_stack . push_class_scope ( ) ;
372+ ctx. state . class_symbols_stack . push_class_scope ( ctx . ast . allocator ) ;
369373 }
370374
371375 fn exit_class_body ( & mut self , body : & mut ClassBody < ' a > , ctx : & mut TraverseCtx < ' a > ) {
@@ -451,12 +455,16 @@ impl<'a> Traverse<'a, MinifierState<'a>> for DeadCodeElimination {
451455 self . changed = ctx. state . changed ;
452456 if self . changed {
453457 // Remove unused references by visiting the AST again and diff the collected references.
454- let refs_before =
455- ctx. scoping ( ) . resolved_references ( ) . flatten ( ) . copied ( ) . collect :: < FxHashSet < _ > > ( ) ;
456- let mut counter = ReferencesCounter :: default ( ) ;
458+ let refs_before = HashSet :: from_iter_in (
459+ ctx. scoping ( ) . resolved_references ( ) . flatten ( ) . copied ( ) ,
460+ ctx. ast . allocator ,
461+ ) ;
462+ let mut counter = ReferencesCounter :: new_in ( ctx. ast . allocator ) ;
457463 counter. visit_program ( program) ;
458- for reference_id_to_remove in refs_before. difference ( & counter. refs ) {
459- ctx. scoping_mut ( ) . delete_reference ( * reference_id_to_remove) ;
464+ for reference_id in & refs_before {
465+ if !counter. refs . contains ( reference_id) {
466+ ctx. scoping_mut ( ) . delete_reference ( * reference_id) ;
467+ }
460468 }
461469 }
462470 }
@@ -534,12 +542,17 @@ impl<'a> Traverse<'a, MinifierState<'a>> for DeadCodeElimination {
534542 }
535543}
536544
537- #[ derive( Default ) ]
538- struct ReferencesCounter {
539- refs : FxHashSet < ReferenceId > ,
545+ struct ReferencesCounter < ' a > {
546+ refs : HashSet < ' a , ReferenceId > ,
547+ }
548+
549+ impl < ' a > ReferencesCounter < ' a > {
550+ fn new_in ( allocator : & ' a oxc_allocator:: Allocator ) -> Self {
551+ Self { refs : HashSet :: new_in ( allocator) }
552+ }
540553}
541554
542- impl < ' a > Visit < ' a > for ReferencesCounter {
555+ impl < ' a > Visit < ' a > for ReferencesCounter < ' a > {
543556 fn visit_identifier_reference ( & mut self , it : & IdentifierReference < ' a > ) {
544557 let reference_id = it. reference_id ( ) ;
545558 self . refs . insert ( reference_id) ;
0 commit comments