From: Steve Hancock Date: Sun, 28 Jan 2024 14:19:07 +0000 (-0800) Subject: activate format skipping to tokenizer X-Git-Tag: 20240202~2 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=9dba3754eae3fc861233cf8feee1ad5dc5fecb48;p=perltidy.git activate format skipping to tokenizer this will improve diagnostics in case of a brace error --- diff --git a/lib/Perl/Tidy/Tokenizer.pm b/lib/Perl/Tidy/Tokenizer.pm index 6ee5bcad..67d21ec7 100644 --- a/lib/Perl/Tidy/Tokenizer.pm +++ b/lib/Perl/Tidy/Tokenizer.pm @@ -149,9 +149,14 @@ my ( # INITIALIZER: sub check_options $code_skipping_pattern_begin, $code_skipping_pattern_end, + $format_skipping_pattern_begin, + $format_skipping_pattern_end, $rOpts_code_skipping, $rOpts_code_skipping_begin, + $rOpts_format_skipping, + $rOpts_format_skipping_begin, + $rOpts_format_skipping_end, $rOpts_starting_indentation_level, $rOpts_indent_columns, $rOpts_look_for_hash_bang, @@ -206,7 +211,8 @@ BEGIN { _warning_count_ => $i++, _html_tag_count_ => $i++, _in_pod_ => $i++, - _in_skipped_ => $i++, + _in_code_skipping_ => $i++, + _in_format_skipping_ => $i++, _in_attribute_list_ => $i++, _in_quote_ => $i++, _quote_target_ => $i++, @@ -246,7 +252,6 @@ BEGIN { _rclosing_brace_indentation_hash_ => $i++, _show_indentation_table_ => $i++, _rnon_indenting_brace_stack_ => $i++, - _in_format_skipping_ => $i++, }; } ## end BEGIN @@ -463,6 +468,9 @@ sub check_options { $rOpts_maximum_unexpected_errors = $rOpts->{'maximum-unexpected-errors'}; $rOpts_code_skipping = $rOpts->{'code-skipping'}; $rOpts_code_skipping_begin = $rOpts->{'code-skipping-begin'}; + $rOpts_format_skipping = $rOpts->{'format-skipping'}; + $rOpts_format_skipping_begin = $rOpts->{'format-skipping-begin'}; + $rOpts_format_skipping_end = $rOpts->{'format-skipping-end'}; $rOpts_indent_closing_brace = $rOpts->{'indent-closing-brace'}; $rOpts_non_indenting_braces = $rOpts->{'non-indenting-braces'}; $rOpts_non_indenting_brace_prefix = $rOpts->{'non-indenting-brace-prefix'}; @@ -491,6 +499,11 @@ sub check_options { $code_skipping_pattern_end = make_skipping_pattern( $rOpts, 'code-skipping-end', '#>>V' ); + $format_skipping_pattern_begin = + make_skipping_pattern( $rOpts, 'format-skipping-begin', '#<<<' ); + $format_skipping_pattern_end = + make_skipping_pattern( $rOpts, 'format-skipping-end', '#>>>' ); + return; } ## end sub check_options @@ -538,7 +551,8 @@ EOM # _line_start_quote_ line where we started looking for a long quote # _in_here_doc_ flag indicating if we are in a here-doc # _in_pod_ flag set if we are in pod documentation - # _in_skipped_ flag set if we are in a skipped section + # _in_code_skipping_ flag set if we are in a code skipping section + # _in_format_skipping_ flag set if we are in a format skipping section # _in_error_ flag set if we saw severe error (binary in script) # _in_trouble_ set if we saw a troublesome lexical like 'my sub s' # _warning_count_ number of calls to logger sub warning @@ -567,7 +581,8 @@ EOM $self->[_warning_count_] = 0; $self->[_html_tag_count_] = 0; $self->[_in_pod_] = 0; - $self->[_in_skipped_] = 0; + $self->[_in_code_skipping_] = 0; + $self->[_in_format_skipping_] = 0; $self->[_in_attribute_list_] = 0; $self->[_in_quote_] = 0; $self->[_quote_target_] = EMPTY_STRING; @@ -601,7 +616,6 @@ EOM $self->[_true_brace_error_count_] = 0; $self->[_rnon_indenting_brace_stack_] = []; $self->[_show_indentation_table_] = 0; - $self->[_in_format_skipping_] = 0; $self->[_rclosing_brace_indentation_hash_] = { valid => undef, @@ -943,7 +957,7 @@ EOM $self->warning("hit EOF while in format description\n"); } - if ( $self->[_in_skipped_] ) { + if ( $self->[_in_code_skipping_] ) { $self->write_logfile_entry( "hit EOF while in lines skipped with --code-skipping\n"); } @@ -1109,7 +1123,7 @@ sub show_indentation_table { my @output_lines; push @output_lines, <interrupt_logfile(); @@ -1364,18 +1379,18 @@ sub get_line { } # print line unchanged if in skipped section - elsif ( $self->[_in_skipped_] ) { + elsif ( $self->[_in_code_skipping_] ) { $line_of_tokens->{_line_type} = 'SKIP'; if ( $input_line =~ /$code_skipping_pattern_end/ ) { $line_of_tokens->{_line_type} = 'SKIP_END'; $self->log_numbered_msg("Exiting code-skipping section\n"); - $self->[_in_skipped_] = 0; + $self->[_in_code_skipping_] = 0; } elsif ( $input_line =~ /$code_skipping_pattern_begin/ ) { # warn of duplicate starting comment lines, git #118 - my $lno = $self->[_in_skipped_]; + my $lno = $self->[_in_code_skipping_]; $self->warning( "Already in code-skipping section which started at line $lno\n" ); @@ -1522,7 +1537,8 @@ sub get_line { # _in_end_ # _in_format_ # _in_error_ - # _in_skipped_ + # _in_code_skipping_ + # _in_format_skipping_ # _in_pod_ # _in_quote_ @@ -1573,7 +1589,7 @@ sub get_line { } # handle start of skipped section - if ( $self->[_in_skipped_] ) { + if ( $self->[_in_code_skipping_] ) { $line_of_tokens->{_line_type} = 'SKIP'; $self->log_numbered_msg("Entering code-skipping section\n"); @@ -1717,13 +1733,20 @@ sub find_starting_indentation_level { && $line =~ /$code_skipping_pattern_begin/ ) { $in_code_skipping = 1; + next; } } else { if ( $line =~ /$code_skipping_pattern_end/ ) { $in_code_skipping = 0; } + next; } + + # Note that we could also ignore format-skipping lines here + # but it isn't clear if that would be best. + # See c326 for example code. + next; } next if ($in_code_skipping); @@ -5333,10 +5356,40 @@ EOM && $input_line . "\n" =~ /$code_skipping_pattern_begin/ ) { - $self->[_in_skipped_] = $self->[_last_line_number_]; + $self->[_in_code_skipping_] = $self->[_last_line_number_]; return; } + if ( !$self->[_in_format_skipping_] ) { + if ( + ( + substr( $input_line, 0, 4 ) eq '#<<<' + || $rOpts_format_skipping_begin + ) + && $rOpts_format_skipping + + # note that the code_skipping_patterns require a newline + && $input_line . "\n" =~ /$format_skipping_pattern_begin/ + ) + { + $self->[_in_format_skipping_] = $self->[_last_line_number_]; + } + } + else { + if ( + ( + substr( $input_line, 0, 4 ) eq '#>>>' + || $rOpts_format_skipping_end + ) + + # note that the code_skipping_patterns require a newline + && $input_line . "\n" =~ /$format_skipping_pattern_end/ + ) + { + $self->[_in_format_skipping_] = 0; + } + } + # Optional fast processing of a block comment $line_of_tokens->{_line_type} = 'CODE'; $line_of_tokens->{_rtokens} = [$input_line];