]> git.donarmstrong.com Git - perltidy.git/blob - lib/Perl/Tidy/VerticalAligner/Line.pm
New upstream version 20220217
[perltidy.git] / lib / Perl / Tidy / VerticalAligner / Line.pm
1 #####################################################################
2 #
3 # the Perl::Tidy::VerticalAligner::Line class supplies an object to
4 # contain a single output line
5 #
6 #####################################################################
7
8 package Perl::Tidy::VerticalAligner::Line;
9 use strict;
10 use warnings;
11 our $VERSION = '20220217';
12
13 BEGIN {
14
15     # Indexes for variables in $self.
16     # Do not combine with other BEGIN blocks (c101).
17     my $i = 0;
18     use constant {
19         _jmax_                      => $i++,
20         _rtokens_                   => $i++,
21         _rfields_                   => $i++,
22         _rfield_lengths_            => $i++,
23         _rpatterns_                 => $i++,
24         _indentation_               => $i++,
25         _leading_space_count_       => $i++,
26         _outdent_long_lines_        => $i++,
27         _list_seqno_                => $i++,
28         _list_type_                 => $i++,
29         _is_hanging_side_comment_   => $i++,
30         _ralignments_               => $i++,
31         _maximum_line_length_       => $i++,
32         _rvertical_tightness_flags_ => $i++,
33         _is_terminal_ternary_       => $i++,
34         _j_terminal_match_          => $i++,
35         _end_group_                 => $i++,
36         _Kend_                      => $i++,
37         _ci_level_                  => $i++,
38         _level_                     => $i++,
39         _level_end_                 => $i++,
40         _imax_pair_                 => $i++,
41     };
42 }
43
44 sub AUTOLOAD {
45
46     # Catch any undefined sub calls so that we are sure to get
47     # some diagnostic information.  This sub should never be called
48     # except for a programming error.
49     our $AUTOLOAD;
50     return if ( $AUTOLOAD =~ /\bDESTROY$/ );
51     my ( $pkg, $fname, $lno ) = caller();
52     my $my_package = __PACKAGE__;
53     print STDERR <<EOM;
54 ======================================================================
55 Error detected in package '$my_package', version $VERSION
56 Received unexpected AUTOLOAD call for sub '$AUTOLOAD'
57 Called from package: '$pkg'  
58 Called from File '$fname'  at line '$lno'
59 This error is probably due to a recent programming change
60 ======================================================================
61 EOM
62     exit 1;
63 }
64
65 {
66
67     ##use Carp;
68
69     # Constructor may be called as a class method
70     sub new {
71         my ( $class, $ri ) = @_;
72         my $self = bless [], $class;
73
74         $self->[_jmax_]                      = $ri->{jmax};
75         $self->[_rtokens_]                   = $ri->{rtokens};
76         $self->[_rfields_]                   = $ri->{rfields};
77         $self->[_rfield_lengths_]            = $ri->{rfield_lengths};
78         $self->[_rpatterns_]                 = $ri->{rpatterns};
79         $self->[_indentation_]               = $ri->{indentation};
80         $self->[_leading_space_count_]       = $ri->{leading_space_count};
81         $self->[_outdent_long_lines_]        = $ri->{outdent_long_lines};
82         $self->[_list_type_]                 = $ri->{list_type};
83         $self->[_list_seqno_]                = $ri->{list_seqno};
84         $self->[_is_hanging_side_comment_]   = $ri->{is_hanging_side_comment};
85         $self->[_maximum_line_length_]       = $ri->{maximum_line_length};
86         $self->[_rvertical_tightness_flags_] = $ri->{rvertical_tightness_flags};
87         $self->[_is_terminal_ternary_]       = $ri->{is_terminal_ternary};
88         $self->[_j_terminal_match_]          = $ri->{j_terminal_match};
89         $self->[_end_group_]                 = $ri->{end_group};
90         $self->[_Kend_]                      = $ri->{Kend};
91         $self->[_ci_level_]                  = $ri->{ci_level};
92         $self->[_level_]                     = $ri->{level};
93         $self->[_level_end_]                 = $ri->{level_end};
94         $self->[_imax_pair_]                 = $ri->{imax_pair};
95
96         $self->[_ralignments_] = [];
97
98         return $self;
99     }
100
101     sub get_jmax { return $_[0]->[_jmax_] }
102
103     sub get_rtokens        { return $_[0]->[_rtokens_] }
104     sub get_rfields        { return $_[0]->[_rfields_] }
105     sub get_rfield_lengths { return $_[0]->[_rfield_lengths_] }
106     sub get_rpatterns      { return $_[0]->[_rpatterns_] }
107     sub get_indentation    { return $_[0]->[_indentation_] }
108     sub get_Kend           { return $_[0]->[_Kend_] }
109     sub get_ci_level       { return $_[0]->[_ci_level_] }
110     sub get_level          { return $_[0]->[_level_] }
111     sub get_level_end      { return $_[0]->[_level_end_] }
112     sub get_list_seqno     { return $_[0]->[_list_seqno_] }
113
114     sub get_imax_pair { return $_[0]->[_imax_pair_] }
115
116     sub set_imax_pair {
117         my ( $self, $val ) = @_;
118         $self->[_imax_pair_] = $val;
119         return;
120     }
121
122     sub get_j_terminal_match {
123         return $_[0]->[_j_terminal_match_];
124     }
125
126     sub set_j_terminal_match {
127         my ( $self, $val ) = @_;
128         $self->[_j_terminal_match_] = $val;
129         return;
130     }
131
132     sub get_is_terminal_ternary {
133         return $_[0]->[_is_terminal_ternary_];
134     }
135
136     sub get_leading_space_count {
137         return $_[0]->[_leading_space_count_];
138     }
139
140     sub get_outdent_long_lines {
141         return $_[0]->[_outdent_long_lines_];
142     }
143     sub get_list_type { return $_[0]->[_list_type_] }
144
145     sub get_is_hanging_side_comment {
146         return $_[0]->[_is_hanging_side_comment_];
147     }
148
149     sub get_maximum_line_length {
150         return $_[0]->[_maximum_line_length_];
151     }
152
153     sub get_rvertical_tightness_flags {
154         return $_[0]->[_rvertical_tightness_flags_];
155     }
156
157     sub get_alignment {
158         my ( $self, $j ) = @_;
159         return $self->[_ralignments_]->[$j];
160     }
161     sub get_alignments { return @{ $_[0]->[_ralignments_] } }
162
163     sub get_column {
164         ##my ( $self, $j ) = @_;
165         my $alignment = $_[0]->[_ralignments_]->[ $_[1] ];
166         return unless defined($alignment);
167         return $alignment->get_column();
168     }
169
170     sub set_alignments {
171         my ( $self, @args ) = @_;
172         @{ $self->[_ralignments_] } = @args;
173         return;
174     }
175
176     sub current_field_width {
177         my ( $self, $j ) = @_;
178         my $col_j  = 0;
179         my $col_jm = 0;
180
181         my $alignment_j = $self->[_ralignments_]->[$j];
182         $col_j = $alignment_j->get_column() if defined($alignment_j);
183
184         if ( $j > 0 ) {
185             my $alignment_jm = $self->[_ralignments_]->[ $j - 1 ];
186             $col_jm = $alignment_jm->get_column() if defined($alignment_jm);
187         }
188         return $col_j - $col_jm;
189     }
190
191     sub increase_field_width {
192
193         my ( $self, $j, $pad ) = @_;
194         my $jmax = $self->[_jmax_];
195         foreach ( $j .. $jmax ) {
196             my $alignment = $self->[_ralignments_]->[$_];
197             if ( defined($alignment) ) {
198                 $alignment->increment_column($pad);
199             }
200         }
201         return;
202     }
203
204     sub get_available_space_on_right {
205         my $jmax = $_[0]->[_jmax_];
206         return $_[0]->[_maximum_line_length_] - $_[0]->get_column($jmax);
207     }
208
209     sub set_jmax { my ( $self, $val ) = @_; $self->[_jmax_] = $val; return }
210
211     sub set_rtokens {
212         my ( $self, $val ) = @_;
213         $self->[_rtokens_] = $val;
214         return;
215     }
216
217     sub set_rfields {
218         my ( $self, $val ) = @_;
219         $self->[_rfields_] = $val;
220         return;
221     }
222
223     sub set_rfield_lengths {
224         my ( $self, $val ) = @_;
225         $self->[_rfield_lengths_] = $val;
226         return;
227     }
228
229     sub set_rpatterns {
230         my ( $self, $val ) = @_;
231         $self->[_rpatterns_] = $val;
232         return;
233     }
234
235     sub set_list_type {
236         my ( $self, $val ) = @_;
237         $self->[_list_type_] = $val;
238         return;
239     }
240
241     sub set_is_hanging_side_comment {
242         my ( $self, $val ) = @_;
243         $self->[_is_hanging_side_comment_] = $val;
244         return;
245     }
246
247     sub set_alignment {
248         my ( $self, $j, $val ) = @_;
249         $self->[_ralignments_]->[$j] = $val;
250         return;
251     }
252
253     sub get_end_group { return $_[0]->[_end_group_] }
254
255     sub set_end_group {
256         my ( $self, $val ) = @_;
257         $self->[_end_group_] = $val;
258         return;
259     }
260 }
261
262 1;