@@ -496,7 +496,7 @@ impl<'buf, 'ast> RemoveSoftLinesBuffer<'buf, 'ast> {
496496 }
497497
498498 /// Removes the soft line breaks from an interned element.
499- fn clean_interned ( & mut self , interned : & Interned < ' ast > ) -> Interned < ' ast > {
499+ fn clean_interned ( & mut self , interned : Interned < ' ast > ) -> Interned < ' ast > {
500500 clean_interned (
501501 interned,
502502 & mut self . interned_cache ,
@@ -517,12 +517,12 @@ impl<'buf, 'ast> RemoveSoftLinesBuffer<'buf, 'ast> {
517517
518518// Extracted to function to avoid monomorphization
519519fn clean_interned < ' ast > (
520- interned : & Interned < ' ast > ,
520+ interned : Interned < ' ast > ,
521521 interned_cache : & mut FxHashMap < Interned < ' ast > , Interned < ' ast > > ,
522522 condition_content_stack : & mut Vec < Condition > ,
523523 allocator : & ' ast Allocator ,
524524) -> Interned < ' ast > {
525- if let Some ( cleaned) = interned_cache. get ( interned) {
525+ if let Some ( cleaned) = interned_cache. get ( & interned) {
526526 cleaned. clone ( )
527527 } else {
528528 // Find the first soft line break element, interned element, or conditional expanded
@@ -538,8 +538,12 @@ fn clean_interned<'ast>(
538538 Some ( ( cleaned, & interned[ index..] ) )
539539 }
540540 FormatElement :: Interned ( inner) => {
541- let cleaned_inner =
542- clean_interned ( inner, interned_cache, condition_content_stack, allocator) ;
541+ let cleaned_inner = clean_interned (
542+ inner. clone ( ) ,
543+ interned_cache,
544+ condition_content_stack,
545+ allocator,
546+ ) ;
543547
544548 if & cleaned_inner == inner {
545549 None
@@ -580,7 +584,7 @@ fn clean_interned<'ast>(
580584
581585 FormatElement :: Interned ( interned) => {
582586 cleaned. push ( FormatElement :: Interned ( clean_interned (
583- interned,
587+ interned. clone ( ) ,
584588 interned_cache,
585589 condition_content_stack,
586590 allocator,
@@ -596,21 +600,20 @@ fn clean_interned<'ast>(
596600 }
597601 }
598602
599- Interned :: new ( ArenaVec :: from_iter_in ( cleaned, allocator ) )
603+ Interned :: new ( cleaned)
600604 }
601605 // No change necessary, return existing interned element
602606 None => interned. clone ( ) ,
603607 } ;
604608
605- interned_cache. insert ( interned. clone ( ) , result. clone ( ) ) ;
609+ interned_cache. insert ( interned, result. clone ( ) ) ;
606610 result
607611 }
608612}
609613
610614impl < ' ast > Buffer < ' ast > for RemoveSoftLinesBuffer < ' _ , ' ast > {
611615 fn write_element ( & mut self , element : FormatElement < ' ast > ) -> FormatResult < ( ) > {
612- let mut element_stack = Vec :: new ( ) ;
613- element_stack. push ( element) ;
616+ let mut element_stack = Vec :: from_iter ( [ element] ) ;
614617 while let Some ( element) = element_stack. pop ( ) {
615618 match element {
616619 FormatElement :: Tag ( Tag :: StartConditionalContent ( condition) ) => {
@@ -628,14 +631,14 @@ impl<'ast> Buffer<'ast> for RemoveSoftLinesBuffer<'_, 'ast> {
628631 self . inner . write_element ( FormatElement :: Space ) ?;
629632 }
630633 FormatElement :: Interned ( interned) => {
631- let cleaned = self . clean_interned ( & interned) ;
634+ let cleaned = self . clean_interned ( interned) ;
632635 self . inner . write_element ( FormatElement :: Interned ( cleaned) ) ?;
633636 }
634637 // Since this buffer aims to simulate infinite print width, we don't need to retain the best fitting.
635638 // Just extract the flattest variant and then handle elements within it.
636639 FormatElement :: BestFitting ( best_fitting) => {
637640 let most_flat = best_fitting. most_flat ( ) ;
638- most_flat. iter ( ) . rev ( ) . for_each ( |element| element_stack . push ( element . clone ( ) ) ) ;
641+ element_stack . extend ( most_flat. iter ( ) . rev ( ) . cloned ( ) ) ;
639642 }
640643 element => self . inner . write_element ( element) ?,
641644 }
0 commit comments