File Coverage

blib/lib/PPI/Token.pm
Criterion Covered Total %
statement 150 157 95.5
branch 14 26 53.8
condition n/a
subroutine 53 53 100.0
pod 6 8 75.0
total 223 244 91.3


line stmt bran cond sub pod time code
1             package PPI::Token;
2              
3             =pod
4              
5             =head1 NAME
6              
7             PPI::Token - A single token of Perl source code
8              
9             =head1 INHERITANCE
10              
11             PPI::Token
12             isa PPI::Element
13              
14             =head1 DESCRIPTION
15              
16             C is the abstract base class for all Tokens. In PPI terms, a "Token" is
17             a L that directly represents bytes of source code.
18              
19             =head1 METHODS
20              
21             =cut
22              
23 65     65   481 use strict;
  65         140  
  65         2305  
24 65     65   818 use Params::Util qw{_INSTANCE};
  65         6790  
  65         2700  
25 65     65   860 use PPI::Element ();
  65         146  
  65         872  
26 65     65   757 use PPI::Exception ();
  65         123  
  65         2465  
27              
28             our $VERSION = '1.277';
29              
30             our @ISA = 'PPI::Element';
31              
32             # We don't load the abstracts, they are loaded
33             # as part of the inheritance process.
34              
35             # Load the token classes
36 65     65   30220 use PPI::Token::BOM ();
  65         175  
  65         1747  
37 65     65   31802 use PPI::Token::Whitespace ();
  65         241  
  65         2040  
38 65     65   29214 use PPI::Token::Comment ();
  65         169  
  65         2253  
39 65     65   28793 use PPI::Token::Pod ();
  65         191  
  65         1866  
40 65     65   28311 use PPI::Token::Number ();
  65         180  
  65         1904  
41 65     65   29302 use PPI::Token::Number::Binary ();
  65         174  
  65         1930  
42 65     65   27939 use PPI::Token::Number::Octal ();
  65         169  
  65         1903  
43 65     65   28081 use PPI::Token::Number::Hex ();
  65         175  
  65         2041  
44 65     65   28933 use PPI::Token::Number::Float ();
  65         165  
  65         2108  
45 65     65   28968 use PPI::Token::Number::Exp ();
  65         182  
  65         2119  
46 65     65   29822 use PPI::Token::Number::Version ();
  65         185  
  65         2225  
47 65     65   29787 use PPI::Token::Word ();
  65         194  
  65         2545  
48 65     65   27195 use PPI::Token::DashedWord ();
  65         188  
  65         2422  
49 65     65   28489 use PPI::Token::Symbol ();
  65         202  
  65         2548  
50 65     65   27811 use PPI::Token::ArrayIndex ();
  65         177  
  65         2489  
51 65     65   29137 use PPI::Token::Magic ();
  65         169  
  65         2725  
52 65     65   31307 use PPI::Token::Quote::Single ();
  65         172  
  65         2716  
53 65     65   29424 use PPI::Token::Quote::Double ();
  65         171  
  65         2823  
54 65     65   28907 use PPI::Token::Quote::Literal ();
  65         166  
  65         3174  
55 65     65   29306 use PPI::Token::Quote::Interpolate ();
  65         180  
  65         3014  
56 65     65   29578 use PPI::Token::QuoteLike::Backtick ();
  65         198  
  65         2842  
57 65     65   28216 use PPI::Token::QuoteLike::Command ();
  65         178  
  65         2853  
58 65     65   28564 use PPI::Token::QuoteLike::Regexp ();
  65         174  
  65         3035  
59 65     65   28577 use PPI::Token::QuoteLike::Words ();
  65         177  
  65         3112  
60 65     65   29031 use PPI::Token::QuoteLike::Readline ();
  65         176  
  65         3080  
61 65     65   28863 use PPI::Token::Regexp::Match ();
  65         173  
  65         3671  
62 65     65   28411 use PPI::Token::Regexp::Substitute ();
  65         184  
  65         3250  
63 65     65   28526 use PPI::Token::Regexp::Transliterate ();
  65         168  
  65         3348  
64 65     65   28328 use PPI::Token::Operator ();
  65         189  
  65         3532  
65 65     65   25885 use PPI::Token::Cast ();
  65         177  
  65         3510  
66 65     65   28967 use PPI::Token::Structure ();
  65         220  
  65         3690  
67 65     65   27296 use PPI::Token::Label ();
  65         210  
  65         3729  
68 65     65   31399 use PPI::Token::HereDoc ();
  65         178  
  65         4004  
69 65     65   26636 use PPI::Token::Separator ();
  65         203  
  65         3902  
70 65     65   27599 use PPI::Token::Data ();
  65         206  
  65         4231  
71 65     65   29868 use PPI::Token::End ();
  65         188  
  65         4017  
72 65     65   28826 use PPI::Token::Prototype ();
  65         196  
  65         3993  
73 65     65   29633 use PPI::Token::Attribute ();
  65         197  
  65         4183  
74 65     65   460 use PPI::Token::Unknown ();
  65         131  
  65         61050  
75              
76              
77              
78              
79              
80             #####################################################################
81             # Constructor and Related
82              
83             sub new {
84 365185 50   365185 0 1702626 bless { content => (defined $_[1] ? "$_[1]" : '') }, $_[0];
85             }
86              
87             sub set_class {
88 34393     34393 0 55403 my $self = shift;
89             # @_ or throw Exception("No arguments to set_class");
90 34393 50       88833 my $class = substr( $_[0], 0, 12 ) eq 'PPI::Token::' ? shift : 'PPI::Token::' . shift;
91              
92             # Find out if the current and new classes are complex
93 34393 50       129599 my $old_quote = (ref($self) =~ /\b(?:Quote|Regex)\b/o) ? 1 : 0;
94 34393 50       89294 my $new_quote = ($class =~ /\b(?:Quote|Regex)\b/o) ? 1 : 0;
95              
96             # No matter what happens, we will have to rebless
97 34393         63329 bless $self, $class;
98              
99             # If we are changing to or from a Quote style token, we
100             # can't just rebless and need to do some extra thing
101             # Otherwise, we have done enough
102 34393 50       120457 return $class if ($old_quote - $new_quote) == 0;
103              
104             # Make a new token from the old content, and overwrite the current
105             # token's attributes with the new token's attributes.
106 0         0 my $token = $class->new( $self->{content} );
107 0         0 %$self = %$token;
108              
109             # Return the class as a convenience
110 0         0 return $class;
111             }
112              
113              
114              
115              
116              
117             #####################################################################
118             # PPI::Token Methods
119              
120             =pod
121              
122             =head2 set_content $string
123              
124             The C method allows you to set/change the string that the
125             C object represents.
126              
127             Returns the string you set the Token to
128              
129             =cut
130              
131             sub set_content {
132 1     1 1 7 $_[0]->{content} = $_[1];
133             }
134              
135             =pod
136              
137             =head2 add_content $string
138              
139             The C method allows you to add additional bytes of code
140             to the end of the Token.
141              
142             Returns the new full string after the bytes have been added.
143              
144             =cut
145              
146 1     1 1 5 sub add_content { $_[0]->{content} .= $_[1] }
147              
148             =pod
149              
150             =head2 length
151              
152             The C method returns the length of the string in a Token.
153              
154             =cut
155              
156 7     7 1 183 sub length { CORE::length($_[0]->{content}) }
157              
158              
159              
160              
161              
162             #####################################################################
163             # Overloaded PPI::Element methods
164              
165             sub content {
166 1191511     1191511 1 3512870 $_[0]->{content};
167             }
168              
169             # You can insert either a statement, or a non-significant token.
170             sub insert_before {
171 1     1 1 4 my $self = shift;
172 1 50       14 my $Element = _INSTANCE(shift, 'PPI::Element') or return undef;
173 1 50       13 if ( $Element->isa('PPI::Structure') ) {
    50          
174 0         0 return $self->__insert_before($Element);
175             } elsif ( $Element->isa('PPI::Token') ) {
176 1         4 return $self->__insert_before($Element);
177             }
178 0         0 '';
179             }
180              
181             # As above, you can insert a statement, or a non-significant token
182             sub insert_after {
183 1     1 1 3 my $self = shift;
184 1 50       12 my $Element = _INSTANCE(shift, 'PPI::Element') or return undef;
185 1 50       10 if ( $Element->isa('PPI::Structure') ) {
    50          
186 0         0 return $self->__insert_after($Element);
187             } elsif ( $Element->isa('PPI::Token') ) {
188 1         4 return $self->__insert_after($Element);
189             }
190 0         0 '';
191             }
192              
193              
194              
195              
196              
197             #####################################################################
198             # Tokenizer Methods
199              
200             sub __TOKENIZER__on_line_start() { 1 }
201             sub __TOKENIZER__on_line_end() { 1 }
202             sub __TOKENIZER__on_char() { 'Unknown' }
203              
204              
205              
206              
207              
208             #####################################################################
209             # Lexer Methods
210              
211             sub __LEXER__opens {
212             ref($_[0]) eq 'PPI::Token::Structure'
213             and
214 45660 50   45660   296317 $_[0]->{content} =~ /(?:\(|\[|\{)/
215             }
216              
217             sub __LEXER__closes {
218             ref($_[0]) eq 'PPI::Token::Structure'
219             and
220 187499 100   187499   1221371 $_[0]->{content} =~ /(?:\)|\]|\})/
221             }
222              
223             1;
224              
225             =pod
226              
227             =head1 SUPPORT
228              
229             See the L in the main module.
230              
231             =head1 AUTHOR
232              
233             Adam Kennedy Eadamk@cpan.orgE
234              
235             =head1 COPYRIGHT
236              
237             Copyright 2001 - 2011 Adam Kennedy.
238              
239             This program is free software; you can redistribute
240             it and/or modify it under the same terms as Perl itself.
241              
242             The full text of the license can be found in the
243             LICENSE file included with this module.
244              
245             =cut