# Change the level of a closing qw token to be that of the outer
# containing token. This will allow -lp indentation to function
# correctly in the vertical aligner.
- # Patch to fix c002: but not if it contains text and is not -lp.
- if ( $rOpts_line_up_parentheses
- || length( $rLL->[$Kinner_closing]->[_TOKEN_] ) == 1 )
- {
+ # Patch to fix c002: but not if it contains text
+ if ( length( $rLL->[$Kinner_closing]->[_TOKEN_] ) == 1 ) {
$rLL->[$Kinner_closing]->[_LEVEL_] =
$rLL->[$Kouter_closing]->[_LEVEL_];
}
$rvalign_hash->{list_seqno} = $list_seqno;
$rvalign_hash->{outdent_long_lines} = $outdent_long_lines;
$rvalign_hash->{is_terminal_ternary} = $is_terminal_ternary;
- $rvalign_hash->{is_terminal_statement} = $is_semicolon_terminated;
$rvalign_hash->{rvertical_tightness_flags} = $rvertical_tightness_flags;
$rvalign_hash->{level_jump} = $level_jump;
$rvalign_hash->{rfields} = $rfields;
}
# Loop over all lines of the batch ...
+
+ # Workaround for problem c007, in which the combination -lp -xci
+ # can produce a "Program bug" message in unusual circumstances.
+ my $skip_SECTION_1 = $rOpts_line_up_parentheses
+ && $rOpts->{'extended-continuation-indentation'};
+
foreach my $line ( 0 .. $max_line ) {
+ my $ibeg = $ri_first->[$line];
+ my $iend = $ri_last->[$line];
+ my $lev = $levels_to_go[$ibeg];
+
####################################
# SECTION 1: Undo needless common CI
####################################
# sort { $a <=> $b }
# grep { $lookup->{$_} ne $default } keys %$lookup );
- my $ibeg = $ri_first->[$line];
- my $iend = $ri_last->[$line];
- my $lev = $levels_to_go[$ibeg];
- if ( $line > 0 ) {
+ if ( $line > 0 && !$skip_SECTION_1 ) {
# if we have started a chain..
if ($line_1) {
_zero_count_ => $i++,
_last_leading_space_count_ => $i++,
_comment_leading_space_count_ => $i++,
- _extra_indent_ok_ => $i++,
};
# Debug flag. This is a relic from the original program development
$self->[_zero_count_] = 0;
$self->[_comment_leading_space_count_] = 0;
$self->[_last_leading_space_count_] = 0;
- $self->[_extra_indent_ok_] = 0;
# Memory of what has been processed
$self->[_last_level_written_] = -1;
my $list_seqno = $rline_hash->{list_seqno};
my $outdent_long_lines = $rline_hash->{outdent_long_lines};
my $is_terminal_ternary = $rline_hash->{is_terminal_ternary};
- my $is_terminal_statement = $rline_hash->{is_terminal_statement};
my $rvertical_tightness_flags = $rline_hash->{rvertical_tightness_flags};
my $level_jump = $rline_hash->{level_jump};
my $rfields = $rline_hash->{rfields};
# or if vertical alignment is turned off for debugging
if ( $level != $group_level || $is_outdented || !$self->[_rOpts_valign_] ) {
- # we are allowed to shift a group of lines to the right if its
- # level is greater than the previous and next group
- $self->[_extra_indent_ok_] =
- ( $level < $group_level
- && $self->[_last_level_written_] < $group_level );
-
- $self->_flush_group_lines();
-
- # If we know that this line will get flushed out by itself because
- # of level changes, we can leave the extra_indent_ok flag set.
- # That way, if we get an external flush call, we will still be
- # able to do some -lp alignment if necessary.
- $self->[_extra_indent_ok_] =
- ( $is_terminal_statement && $level > $group_level );
+ $self->_flush_group_lines( $level - $group_level );
$group_level = $level;
$self->[_group_level_] = $group_level;
# Force break after jump to lower level
if ( $level_jump < 0 ) {
- $self->_flush_group_lines();
+ $self->_flush_group_lines($level_jump);
}
# --------------------------------------------------------------------
# This is the vertical aligner internal flush, which leaves the cache
# intact
- my ($self) = @_;
+ my ( $self, $level_jump ) = @_;
+
+ # $level_jump = $next_level-$group_level, if known
+ # = undef if not known
my $rgroup_lines = $self->[_rgroup_lines_];
return unless ( @{$rgroup_lines} );
# STEP 5: For the -lp option, increase the indentation of lists
# to the desired amount, but do not exceed the line length limit.
+
+ # We are allowed to shift a group of lines to the right if:
+ # (1) its level is greater than the level of the previous group, and
+ # (2) its level is greater than the level of the next line to be written.
+
+ my $extra_indent_ok;
+ if ( $group_level > $self->[_last_level_written_] ) {
+
+ # Use the level jump to next line to come, if given
+ if ( defined($level_jump) ) {
+ $extra_indent_ok = $level_jump < 0;
+ }
+
+ # Otherwise, assume the next line has the level of the end of last line.
+ # This fixes case c008.
+ else {
+ my $level_end = $rgroup_lines->[-1]->get_level_end();
+ $extra_indent_ok = $group_level > $level_end;
+ }
+ }
+
my $extra_leading_spaces =
- $self->[_extra_indent_ok_]
+ $extra_indent_ok
? get_extra_leading_spaces( $rgroup_lines, $rgroups )
: 0;
$self->[_last_level_written_] = $level;
$self->[_last_side_comment_length_] = $side_comment_length;
- $self->[_extra_indent_ok_] = 0;
return;
}
}
=over 4
+=item B<Fix several problems with -lp formatting>
+
+This update fixes several problems with -lp formatting which are all somewhat
+related.
+
+ISSUE #1 (case c002): A problem involving -lp -wn and certain qw lists
+
+The last line of a welded qw list was being outdented even if it contained text
+as well as the closing container token. This update fixes the problem and
+simplifies the logic.
+
+A few examples (all use 'perltidy -wn -lp'):
+
+ # OLD and NEW: OK, closing qw paren is on separate line
+ $roads->add_capacity_path( qw( CoolCity 10 ChocolateGulch 8
+ PecanPeak 10 BlueberryWoods 6
+ HotCity
+ ) );
+
+ # OLD: poor; outdented text not aligned with previous text
+ $roads->add_capacity_path( qw( CoolCity 10 ChocolateGulch 8
+ PecanPeak 10 BlueberryWoods 6
+ HotCity ) );
+
+ # NEW:
+ $roads->add_capacity_path( qw( CoolCity 10 ChocolateGulch 8
+ PecanPeak 10 BlueberryWoods 6
+ HotCity ) );
+
+ # OLD:
+ $roads->add_capacity_path( qw( ChocolateGulch 3 StrawberryFields 0
+ StrawberryFields ) );
+
+ # NEW:
+ $roads->add_capacity_path( qw( ChocolateGulch 3 StrawberryFields 0
+ StrawberryFields ) );
+
+ # OLD:
+ my $mon_name = ( qw(January February March April
+ May June July August
+ September October November December) )[$mon];
+
+ # NEW
+ my $mon_name = ( qw(January February March April
+ May June July August
+ September October November December) )[$mon];
+
+ISSUE #2 (case c007): A rare program error could be triggered with -lp -xci
+
+In some very rare circumstances it was possible to trigger a "Program error"
+message. The program still ran to completion. The conditions for this to occur
+were that flags -lp -xci were set, and that there was a container of sort/map/grep
+blocks, and there was a side comment on the closing paren. For example:
+
+ # OLD: perltidy -lp -xci, gave an error message and extra indentation here
+ my %specified_opts = (
+ (
+ map { /^no-?(.*)$/i ? ($1 => 0) : ($_ => 1) }
+ map { /^--([\-_\w]+)$/ } @ARGV
+ ), # this comment caused an error with flags -lp -xci
+ );
+
+ # NEW: perltidy -lp -xci, no error
+ my %specified_opts = (
+ (
+ map { /^no-?(.*)$/i ? ( $1 => 0 ) : ( $_ => 1 ) }
+ map { /^--([\-_\w]+)$/ } @ARGV
+ ), # this comment caused an error with flags -lp -xci
+ );
+
+
+ISSUE #3 (case c008): In some unusual cases the -lp formatting style was not
+being applied when it should have been. For example (text is shifted right):
+
+ # NEW: perltidy -lp
+ $result = runperl(
+ switches => [ '-I.', "-w" ],
+ stderr => 1,
+ prog => <<'PROG' );
+ SIG
+ PROG
+
+ # NEW: perltidy -lp
+ $result = runperl(
+ switches => [ '-I.', "-w" ],
+ stderr => 1,
+ prog => <<'PROG' );
+ SIG
+ PROG
+
+
+25 May 2021.
+
=item B<Modify welding rules>
This is an update to the patch 19 Apr 2021, eeeaf09. It restricts that patch