From cbde8e1bc77d5bea052adef9947cc7a015055708 Mon Sep 17 00:00:00 2001
From: Steve Hancock <perltidy@users.sourceforge.net>
Date: Fri, 13 Sep 2024 13:20:01 -0700
Subject: [PATCH] fix convergence issue for git #156

---
 lib/Perl/Tidy.pm            | 11 +++++++++++
 lib/Perl/Tidy/FileWriter.pm |  9 ---------
 lib/Perl/Tidy/Formatter.pm  | 18 ++++++++++++------
 3 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/lib/Perl/Tidy.pm b/lib/Perl/Tidy.pm
index 624ab397..4736c691 100644
--- a/lib/Perl/Tidy.pm
+++ b/lib/Perl/Tidy.pm
@@ -2936,9 +2936,20 @@ EOM
                 if ( !defined( $saw_md5{$digest} ) ) {
                     $saw_md5{$digest} = $iter;
                 }
+
+                # do a second iteration if all ok and requested by formatter
+                # to allow delayed adding/deleting of commas (git156, git143)
+                elsif ( $iter == 1
+                    && !$stop_now
+                    && $formatter->can('want_second_iteration')
+                    && $formatter->want_second_iteration() )
+                {
+                    ## deja vu, but do not set $stop_now
+                }
                 else {
 
                     # Deja vu, stop iterating
+
                     $stop_now = 1;
                     my $iterm = $iter - 1;
                     if ( $saw_md5{$digest} != $iterm ) {
diff --git a/lib/Perl/Tidy/FileWriter.pm b/lib/Perl/Tidy/FileWriter.pm
index 5cddbfca..85b8ccb1 100644
--- a/lib/Perl/Tidy/FileWriter.pm
+++ b/lib/Perl/Tidy/FileWriter.pm
@@ -224,15 +224,6 @@ sub setup_convergence_test {
     return;
 } ## end sub setup_convergence_test
 
-sub not_converged {
-    my $self = shift;
-
-    # Block convergence of this iteration. This is currently needed
-    # when adding/deleting commas is delayed by 1 iteration (see git #156)
-    $self->[_K_arrival_order_matches_] = 0;
-    return;
-} ## end sub not_converged
-
 sub get_convergence_check {
     my ($self) = @_;
     my $rlist = $self->[_rK_checklist_];
diff --git a/lib/Perl/Tidy/Formatter.pm b/lib/Perl/Tidy/Formatter.pm
index d216b431..70c21d9d 100644
--- a/lib/Perl/Tidy/Formatter.pm
+++ b/lib/Perl/Tidy/Formatter.pm
@@ -625,6 +625,7 @@ BEGIN {
         _rbreak_before_Kfirst_          => $i++,
         _rbreak_after_Klast_            => $i++,
         _converged_                     => $i++,
+        _want_second_iteration_         => $i++,
 
         _rstarting_multiline_qw_seqno_by_K_ => $i++,
         _rending_multiline_qw_seqno_by_K_   => $i++,
@@ -1140,6 +1141,7 @@ sub new {
     $self->[_rbreak_before_Kfirst_]          = {};
     $self->[_rbreak_after_Klast_]            = {};
     $self->[_converged_]                     = 0;
+    $self->[_want_second_iteration_]         = 0;
 
     # qw stuff
     $self->[_rstarting_multiline_qw_seqno_by_K_] = {};
@@ -1429,6 +1431,11 @@ sub get_convergence_check {
     return $self->[_converged_];
 }
 
+sub want_second_iteration {
+    my ($self) = @_;
+    return $self->[_want_second_iteration_];
+}
+
 sub get_output_line_number {
     my ($self) = @_;
     my $vao = $self->[_vertical_aligner_object_];
@@ -13660,9 +13667,8 @@ sub delay_trailing_comma_op {
     my $max_iterations = $rOpts->{'iterations'};
     if ( $it == 1 && $max_iterations > 1 ) {
 
-        # if so, force another iteration
-        my $file_writer_object = $self->[_file_writer_object_];
-        $file_writer_object->not_converged();
+        # if so, set flag to request another iteration
+        $self->[_want_second_iteration_] = 1;
         return 1;
     }
     return;
@@ -39856,9 +39862,9 @@ sub wrapup {
     $file_writer_object->report_line_length_errors();
 
     # Define the formatter self-check for convergence.
-    $self->[_converged_] =
-         $severe_error
-      || $file_writer_object->get_convergence_check()
+    $self->[_converged_] = $severe_error
+      || (!$self->[_want_second_iteration_]
+        && $file_writer_object->get_convergence_check() )
       || $rOpts->{'indent-only'};
 
     return;
-- 
2.39.5