From 4147c8c813aa6598668ba29eea5ea623f10f8490 Mon Sep 17 00:00:00 2001
From: Steve Hancock <perltidy@users.sourceforge.net>
Date: Tue, 8 Sep 2020 15:08:02 -0700
Subject: [PATCH] fixed rare problem with stored index values for -lp option

---
 lib/Perl/Tidy/Formatter.pm       | 21 ++++++++++++++-------
 lib/Perl/Tidy/IndentationItem.pm | 12 ++++++------
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/lib/Perl/Tidy/Formatter.pm b/lib/Perl/Tidy/Formatter.pm
index 20f3fa5b..95434709 100644
--- a/lib/Perl/Tidy/Formatter.pm
+++ b/lib/Perl/Tidy/Formatter.pm
@@ -5141,6 +5141,14 @@ sub get_available_spaces_to_go {
         my $index = 0;
         if ( $level >= 0 ) { $index = ++$max_gnu_item_index; }
 
+        my $starting_index_K = 0;
+        if (   defined($line_start_index_to_go)
+            && $line_start_index_to_go >= 0
+            && $line_start_index_to_go <= $max_index_to_go )
+        {
+            $starting_index_K = $K_to_go[$line_start_index_to_go];
+        }
+
         my $item = Perl::Tidy::IndentationItem->new(
             spaces              => $spaces,
             level               => $level,
@@ -5150,7 +5158,7 @@ sub get_available_spaces_to_go {
             gnu_sequence_number => $gnu_sequence_number,
             align_paren         => $align_paren,
             stack_depth         => $max_gnu_stack_index,
-            starting_index      => $line_start_index_to_go,
+            starting_index_K    => $starting_index_K,
         );
 
         if ( $level >= 0 ) {
@@ -14891,18 +14899,17 @@ sub pad_array_to_go {
                             $item = $leading_spaces_to_go[ $i_opening + 2 ];
                         }
                         if ( defined($item) ) {
-                            my $i_start_2 = $item->get_starting_index();
+                            my $i_start_2;
+                            my $K_start_2 = $item->get_starting_index_K();
+                            if ( defined($K_start_2) ) {
+                                $i_start_2 = $K_start_2 - $K_to_go[0];
+                            }
                             if (
                                 defined($i_start_2)
 
                                 # we are breaking after an opening brace, paren,
                                 # so don't break before it too
                                 && $i_start_2 ne $i_opening
-
-             # Defensive coding check: be sure the index is valid.
-             # FIXME: We should probably be using K indexes for 'starting_index'
-             # so that the object can remain valid between batches.
-             # See test problem: random_issues/random_487.pro
                                 && $i_start_2 >= 0
                                 && $i_start_2 <= $max_index_to_go
                               )
diff --git a/lib/Perl/Tidy/IndentationItem.pm b/lib/Perl/Tidy/IndentationItem.pm
index d65591bd..d395f441 100644
--- a/lib/Perl/Tidy/IndentationItem.pm
+++ b/lib/Perl/Tidy/IndentationItem.pm
@@ -28,7 +28,7 @@ BEGIN {
         _align_paren_        => $i++,
         _marked_             => $i++,
         _stack_depth_        => $i++,
-        _starting_index_     => $i++,
+        _starting_index_K_   => $i++,
         _arrow_count_        => $i++,
     };
 }
@@ -47,7 +47,7 @@ sub new {
     my $gnu_sequence_number = $input_hash{gnu_sequence_number};
     my $align_paren         = $input_hash{align_paren};
     my $stack_depth         = $input_hash{stack_depth};
-    my $starting_index      = $input_hash{starting_index};
+    my $starting_index_K    = $input_hash{starting_index_K};
 
     my $closed            = -1;
     my $arrow_count       = 0;
@@ -74,7 +74,7 @@ sub new {
     #                        # with an opening structure?
     # marked             =>  # if visited by corrector logic
     # stack_depth        =>  # indentation nesting depth
-    # starting_index     =>  # first token index of this level
+    # starting_index_K   =>  # first token index K of this level
     # arrow_count        =>  # how many =>'s
 
     my $self = [];
@@ -91,7 +91,7 @@ sub new {
     $self->[_align_paren_]        = $align_paren;
     $self->[_marked_]             = $marked;
     $self->[_stack_depth_]        = $stack_depth;
-    $self->[_starting_index_]     = $starting_index;
+    $self->[_starting_index_K_]   = $starting_index_K;
     $self->[_arrow_count_]        = $arrow_count;
 
     bless $self, $class;
@@ -225,9 +225,9 @@ sub get_index {
     return $self->[_index_];
 }
 
-sub get_starting_index {
+sub get_starting_index_K {
     my $self = shift;
-    return $self->[_starting_index_];
+    return $self->[_starting_index_K_];
 }
 
 sub set_have_child {
-- 
2.39.5