]> git.donarmstrong.com Git - perltidy.git/commitdiff
fix convergence issue for git #156
authorSteve Hancock <perltidy@users.sourceforge.net>
Fri, 13 Sep 2024 20:20:01 +0000 (13:20 -0700)
committerSteve Hancock <perltidy@users.sourceforge.net>
Fri, 13 Sep 2024 20:20:01 +0000 (13:20 -0700)
lib/Perl/Tidy.pm
lib/Perl/Tidy/FileWriter.pm
lib/Perl/Tidy/Formatter.pm

index 624ab397274389f96c6e038a674ed0a87fc63647..4736c69142c43adaec57fb9c93330963442a59c7 100644 (file)
@@ -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 ) {
index 5cddbfca8ff2ffdfab8e3938316a98f9c7e20098..85b8ccb1a694735a1622214e18f37566a9c9013a 100644 (file)
@@ -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_];
index d216b4314ada54c46bd5fd6760f2394d1ea0ec48..70c21d9d612bb8513eca48f7637faa1c2e73d39b 100644 (file)
@@ -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;