]> git.donarmstrong.com Git - perltidy.git/commitdiff
added test case prune.in for sub prune_alignment_tree
authorSteve Hancock <perltidy@users.sourceforge.net>
Mon, 29 Jun 2020 15:11:24 +0000 (08:11 -0700)
committerSteve Hancock <perltidy@users.sourceforge.net>
Mon, 29 Jun 2020 15:11:24 +0000 (08:11 -0700)
lib/Perl/Tidy/VerticalAligner.pm
t/snippets/expect/prune.def [new file with mode: 0644]
t/snippets/packing_list.txt
t/snippets/prune.in [new file with mode: 0644]
t/snippets21.t

index 0c5561dd9e3e5d57f5307d17a8985a2d06590429..573ff6f74764bf56cc78eb73ca692e4e91607fe6 100644 (file)
@@ -2658,7 +2658,7 @@ sub delete_unmatched_tokens {
     # ignore hanging side comments in these operations
     my @filtered   = grep { !$_->{_is_hanging_side_comment} } @{$rlines};
     my $rnew_lines = \@filtered;
-    my @i_equals;
+    my @equals_info;
     my @line_info;
 
     my $jmax = @{$rnew_lines} - 1;
@@ -2671,11 +2671,12 @@ sub delete_unmatched_tokens {
     my $saw_list_type;
     my $max_lev_diff = 0;
     foreach my $line ( @{$rnew_lines} ) {
-        my $rhash   = {};
-        my $rtokens = $line->get_rtokens();
+        my $rhash     = {};
+        my $rtokens   = $line->get_rtokens();
+        my $rpatterns = $line->get_rpatterns();
         if ( !$saw_list_type && $line->get_list_type() ) { $saw_list_type = 1 }
         my $i = 0;
-        my $i_eq;
+        my ( $i_eq, $tok_eq, $pat_eq );
         my ( $lev_min, $lev_max );
         foreach my $tok ( @{$rtokens} ) {
             my ( $raw_tok, $lev, $tag, $tok_count ) =
@@ -2696,12 +2697,17 @@ sub delete_unmatched_tokens {
 
             # remember the first equals at line level
             if ( !defined($i_eq) && $raw_tok eq '=' ) {
-                if ( $lev eq $group_level ) { $i_eq = $i }
+
+                if ( $lev eq $group_level ) {
+                    $i_eq   = $i;
+                    $tok_eq = $tok;
+                    $pat_eq = $rpatterns->[$i];
+                }
             }
             $i++;
         }
         push @{$rline_hashes}, $rhash;
-        push @i_equals, $i_eq;
+        push @equals_info, [ $i_eq, $tok_eq, $pat_eq ];
         push @line_info, [ $lev_min, $lev_max ];
         if ( defined($lev_min) ) {
             my $lev_diff = $lev_max - $lev_min;
@@ -2739,6 +2745,31 @@ sub delete_unmatched_tokens {
         if ( $nr == 0 && $nl > 0 ) {
             $rnew_lines->[$jl]->{_end_group} = 1;
         }
+
+        # Also set a line break if both lines have simple equals but with
+        # different leading characters in patterns.  This check is similar to
+        # one in sub check_match, and will prevent sub prune_alignment_tree
+        # from removing alignments which otherwise should be kept. This fix
+        # is rarely needed, but it can occasionally improve formatting.
+        # For example:
+        #     my $name = $this->{Name};
+        #     $type = $this->ctype($genlooptype) if defined $genlooptype;
+        #     my $declini = ( $asgnonly ? ""          : "\t$type *" );
+        #     my $cast    = ( $type     ? "($type *)" : "" );
+        # The last two lines start with 'my' and will not match the previous
+        # line starting with $type, so we do not want prune_alignment tree
+        # to delete their ? : alignments at a deeper level.
+        my ( $i_eq_l, $tok_eq_l, $pat_eq_l ) = @{ $equals_info[$jl] };
+        my ( $i_eq_r, $tok_eq_r, $pat_eq_r ) = @{ $equals_info[$jr] };
+        if ( defined($i_eq_l) && defined($i_eq_r) ) {
+            if (   $tok_eq_l eq $tok_eq_r
+                && $i_eq_l == 0
+                && $i_eq_r == 0
+                && substr( $pat_eq_l, 0, 1 ) ne substr( $pat_eq_r, 0, 1 ) )
+            {
+                $rnew_lines->[$jl]->{_end_group} = 1;
+            }
+        }
     }
 
     # find subgroups
@@ -2785,7 +2816,7 @@ sub delete_unmatched_tokens {
             my $line    = $rnew_lines->[$jj];
             my $rtokens = $line->get_rtokens();
             my $rhash   = $rline_hashes->[$jj];
-            my $i_eq    = $i_equals[$jj];
+            my $i_eq    = $equals_info[$jj]->[0];
             my @idel;
             my $imax = @{$rtokens} - 2;
             my $delete_above_level;
@@ -2891,7 +2922,7 @@ sub get_line_token_info {
         my $imax = @{$rtokens} - 2;
 
         # But if the line ends in a comma list, walk it back to the first such
-        # comma This will have the effect of making all trailing ragged comma
+        # comma. This will have the effect of making all trailing ragged comma
         # lists match in the prune tree routine.  These trailing comma lists
         # can better be handled by later alignment rules.
         my $tok_end = $rtokens->[$imax];
@@ -2939,8 +2970,6 @@ sub get_line_token_info {
         elsif ( $lev_max == $lev_min ) {
             $rtoken_patterns->{$lev_max} = $token_pattern_max;
             $rtoken_indexes->{$lev_max}  = [ ( 0 .. $imax ) ];
-
-            #return ( $lev_min, $lev_max, $rtoken_patterns );
         }
 
         # handle multiple levels
@@ -3056,8 +3085,10 @@ sub prune_alignment_tree {
     my @match_tree;
 
     # Tree nodes contain these values:
-    # $match_tree[$depth] = [$jbeg, $jend, $n_parent, $level, $pattern]
-    #  $depth = 0,1,2 = index of depth of the match
+    # $match_tree[$depth] = [$jbeg, $jend, $n_parent, $level, $pattern, 
+    #                        $nc_beg_p, $nc_end_p, $rindexes];
+    # where
+    #      $depth = 0,1,2 = index of depth of the match
 
     #  $jbeg beginning index j of the range of lines in this match
     #  $jend ending index j of the range of lines in this match
diff --git a/t/snippets/expect/prune.def b/t/snippets/expect/prune.def
new file mode 100644 (file)
index 0000000..1b7e868
--- /dev/null
@@ -0,0 +1,33 @@
+# some tests for 'sub prune_alignment_tree'
+
+$request->header( 'User-Agent' => $agent )              if $agent;
+$request->header( 'From'       => $from )               if $from;
+$request->header( 'Range'      => "bytes=0-$max_size" ) if $max_size;
+
+for (
+    [ 'CONSTANT', sub { join "foo", "bar" },         0, "bar" ],
+    [ 'CONSTANT', sub { join "foo", "bar", 3 },      1, "barfoo3" ],
+    [ '$var',     sub { join $_, "bar" },            0, "bar" ],
+    [ '$myvar',   sub { my $var; join $var, "bar" }, 0, "bar" ],
+);
+
+[
+    [ [NewXSHdr],     [ NewXSName, NewXSArgs ],            "XSHdr" ],
+    [ [NewXSCHdrs],   [ NewXSName, NewXSArgs, GlobalNew ], "XSCHdrs" ],
+    [ [DefSyms],      [StructName],                        "MkDefSyms" ],
+    [ [NewXSSymTab],  [ DefSyms, NewXSArgs ],              "AddArgsyms" ],
+    [ [NewXSLocals],  [NewXSSymTab],                       "Sym2Loc" ],
+    [ [IsAffineFlag], [],                                  sub { return "0" } ],
+];
+
+@degen_nums[ 1, 2, 4, 8 ]         = ( 'a', 'c', 'g', 't' );
+@degen_nums[ 5, 10, 9, 6, 3, 12 ] = ( 'r', 'y', 'w', 's', 'm', 'k' );
+@degen_nums[ 14, 13, 11, 7, 15 ]  = ( 'b', 'd', 'h', 'v', 'n' );
+
+$_CreateFile   = ff( "k32", "CreateFile",   [ P, N, N, N, N, N, N ], N );
+$_CloseHandle  = ff( "k32", "CloseHandle",  [N],                     N );
+$_GetCommState = ff( "k32", "GetCommState", [ N, P ],                I );
+$_SetCommState = ff( "k32", "SetCommState", [ N, P ],                I );
+$_SetupComm    = ff( "k32", "SetupComm",    [ N, N, N ],             I );
+$_PurgeComm    = ff( "k32", "PurgeComm",    [ N, N ],                I );
+$_CreateEvent  = ff( "k32", "CreateEvent",  [ P, I, I, P ],          N );
index bda515d4bb2454c2022b8df5cd454855706a3800..c512946a986755c8c848bdf184ce77b22d99fb6d 100644 (file)
 ../snippets9.t rt98902.def
 ../snippets9.t rt98902.rt98902
 ../snippets9.t rt99961.def
+../snippets21.t        prune.def
diff --git a/t/snippets/prune.in b/t/snippets/prune.in
new file mode 100644 (file)
index 0000000..1b7e868
--- /dev/null
@@ -0,0 +1,33 @@
+# some tests for 'sub prune_alignment_tree'
+
+$request->header( 'User-Agent' => $agent )              if $agent;
+$request->header( 'From'       => $from )               if $from;
+$request->header( 'Range'      => "bytes=0-$max_size" ) if $max_size;
+
+for (
+    [ 'CONSTANT', sub { join "foo", "bar" },         0, "bar" ],
+    [ 'CONSTANT', sub { join "foo", "bar", 3 },      1, "barfoo3" ],
+    [ '$var',     sub { join $_, "bar" },            0, "bar" ],
+    [ '$myvar',   sub { my $var; join $var, "bar" }, 0, "bar" ],
+);
+
+[
+    [ [NewXSHdr],     [ NewXSName, NewXSArgs ],            "XSHdr" ],
+    [ [NewXSCHdrs],   [ NewXSName, NewXSArgs, GlobalNew ], "XSCHdrs" ],
+    [ [DefSyms],      [StructName],                        "MkDefSyms" ],
+    [ [NewXSSymTab],  [ DefSyms, NewXSArgs ],              "AddArgsyms" ],
+    [ [NewXSLocals],  [NewXSSymTab],                       "Sym2Loc" ],
+    [ [IsAffineFlag], [],                                  sub { return "0" } ],
+];
+
+@degen_nums[ 1, 2, 4, 8 ]         = ( 'a', 'c', 'g', 't' );
+@degen_nums[ 5, 10, 9, 6, 3, 12 ] = ( 'r', 'y', 'w', 's', 'm', 'k' );
+@degen_nums[ 14, 13, 11, 7, 15 ]  = ( 'b', 'd', 'h', 'v', 'n' );
+
+$_CreateFile   = ff( "k32", "CreateFile",   [ P, N, N, N, N, N, N ], N );
+$_CloseHandle  = ff( "k32", "CloseHandle",  [N],                     N );
+$_GetCommState = ff( "k32", "GetCommState", [ N, P ],                I );
+$_SetCommState = ff( "k32", "SetCommState", [ N, P ],                I );
+$_SetupComm    = ff( "k32", "SetupComm",    [ N, N, N ],             I );
+$_PurgeComm    = ff( "k32", "PurgeComm",    [ N, N ],                I );
+$_CreateEvent  = ff( "k32", "CreateEvent",  [ P, I, I, P ],          N );
index 3a2c75d3e649e9aabafc0d43af888424d37285e5..40b8ed6161cf2afaddf664f38b045c3a8ecd3847 100644 (file)
@@ -6,6 +6,7 @@
 #3 switch_plain.switch_plain
 #4 sot.def
 #5 sot.sot
+#6 prune.def
 
 # To locate test #13 you can search for its name or the string '#13'
 
@@ -54,6 +55,42 @@ lc( $self->mime_attr('content-type')
         || 'text/plain' );
 ----------
 
+        'prune' => <<'----------',
+# some tests for 'sub prune_alignment_tree'
+
+$request->header( 'User-Agent' => $agent )              if $agent;
+$request->header( 'From'       => $from )               if $from;
+$request->header( 'Range'      => "bytes=0-$max_size" ) if $max_size;
+
+for (
+    [ 'CONSTANT', sub { join "foo", "bar" },         0, "bar" ],
+    [ 'CONSTANT', sub { join "foo", "bar", 3 },      1, "barfoo3" ],
+    [ '$var',     sub { join $_, "bar" },            0, "bar" ],
+    [ '$myvar',   sub { my $var; join $var, "bar" }, 0, "bar" ],
+);
+
+[
+    [ [NewXSHdr],     [ NewXSName, NewXSArgs ],            "XSHdr" ],
+    [ [NewXSCHdrs],   [ NewXSName, NewXSArgs, GlobalNew ], "XSCHdrs" ],
+    [ [DefSyms],      [StructName],                        "MkDefSyms" ],
+    [ [NewXSSymTab],  [ DefSyms, NewXSArgs ],              "AddArgsyms" ],
+    [ [NewXSLocals],  [NewXSSymTab],                       "Sym2Loc" ],
+    [ [IsAffineFlag], [],                                  sub { return "0" } ],
+];
+
+@degen_nums[ 1, 2, 4, 8 ]         = ( 'a', 'c', 'g', 't' );
+@degen_nums[ 5, 10, 9, 6, 3, 12 ] = ( 'r', 'y', 'w', 's', 'm', 'k' );
+@degen_nums[ 14, 13, 11, 7, 15 ]  = ( 'b', 'd', 'h', 'v', 'n' );
+
+$_CreateFile   = ff( "k32", "CreateFile",   [ P, N, N, N, N, N, N ], N );
+$_CloseHandle  = ff( "k32", "CloseHandle",  [N],                     N );
+$_GetCommState = ff( "k32", "GetCommState", [ N, P ],                I );
+$_SetCommState = ff( "k32", "SetCommState", [ N, P ],                I );
+$_SetupComm    = ff( "k32", "SetupComm",    [ N, N, N ],             I );
+$_PurgeComm    = ff( "k32", "PurgeComm",    [ N, N ],                I );
+$_CreateEvent  = ff( "k32", "CreateEvent",  [ P, I, I, P ],          N );
+----------
+
         'sot' => <<'----------',
 $opt_c = Text::CSV_XS->new(
 {
@@ -245,6 +282,46 @@ __PACKAGE__->load_components( qw(
 ) );
 #5...........
         },
+
+        'prune.def' => {
+            source => "prune",
+            params => "def",
+            expect => <<'#6...........',
+# some tests for 'sub prune_alignment_tree'
+
+$request->header( 'User-Agent' => $agent )              if $agent;
+$request->header( 'From'       => $from )               if $from;
+$request->header( 'Range'      => "bytes=0-$max_size" ) if $max_size;
+
+for (
+    [ 'CONSTANT', sub { join "foo", "bar" },         0, "bar" ],
+    [ 'CONSTANT', sub { join "foo", "bar", 3 },      1, "barfoo3" ],
+    [ '$var',     sub { join $_, "bar" },            0, "bar" ],
+    [ '$myvar',   sub { my $var; join $var, "bar" }, 0, "bar" ],
+);
+
+[
+    [ [NewXSHdr],     [ NewXSName, NewXSArgs ],            "XSHdr" ],
+    [ [NewXSCHdrs],   [ NewXSName, NewXSArgs, GlobalNew ], "XSCHdrs" ],
+    [ [DefSyms],      [StructName],                        "MkDefSyms" ],
+    [ [NewXSSymTab],  [ DefSyms, NewXSArgs ],              "AddArgsyms" ],
+    [ [NewXSLocals],  [NewXSSymTab],                       "Sym2Loc" ],
+    [ [IsAffineFlag], [],                                  sub { return "0" } ],
+];
+
+@degen_nums[ 1, 2, 4, 8 ]         = ( 'a', 'c', 'g', 't' );
+@degen_nums[ 5, 10, 9, 6, 3, 12 ] = ( 'r', 'y', 'w', 's', 'm', 'k' );
+@degen_nums[ 14, 13, 11, 7, 15 ]  = ( 'b', 'd', 'h', 'v', 'n' );
+
+$_CreateFile   = ff( "k32", "CreateFile",   [ P, N, N, N, N, N, N ], N );
+$_CloseHandle  = ff( "k32", "CloseHandle",  [N],                     N );
+$_GetCommState = ff( "k32", "GetCommState", [ N, P ],                I );
+$_SetCommState = ff( "k32", "SetCommState", [ N, P ],                I );
+$_SetupComm    = ff( "k32", "SetupComm",    [ N, N, N ],             I );
+$_PurgeComm    = ff( "k32", "PurgeComm",    [ N, N ],                I );
+$_CreateEvent  = ff( "k32", "CreateEvent",  [ P, I, I, P ],          N );
+#6...........
+        },
     };
 
     my $ntests = 0 + keys %{$rtests};