From: Steve Hancock Date: Fri, 13 Sep 2024 20:20:01 +0000 (-0700) Subject: fix convergence issue for git #156 X-Git-Tag: 20240903.02~3 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=cbde8e1bc77d5bea052adef9947cc7a015055708;p=perltidy.git fix convergence issue for git #156 --- 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;