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 69     69   364 use strict;
  69         103  
  69         2353  
24 69     69   629 use Params::Util qw{_INSTANCE};
  69         5512  
  69         2845  
25 69     69   705 use PPI::Element ();
  69         149  
  69         736  
26 69     69   638 use PPI::Exception ();
  69         99  
  69         2514  
27              
28             our $VERSION = '1.290';
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 69     69   24488 use PPI::Token::BOM ();
  69         167  
  69         1769  
37 69     69   26788 use PPI::Token::Whitespace ();
  69         171  
  69         1993  
38 69     69   24800 use PPI::Token::Comment ();
  69         148  
  69         1595  
39 69     69   22807 use PPI::Token::Pod ();
  69         200  
  69         1784  
40 69     69   23095 use PPI::Token::Number ();
  69         183  
  69         1776  
41 69     69   25205 use PPI::Token::Number::Binary ();
  69         164  
  69         1726  
42 69     69   23101 use PPI::Token::Number::Octal ();
  69         189  
  69         1699  
43 69     69   22717 use PPI::Token::Number::Hex ();
  69         152  
  69         1720  
44 69     69   24907 use PPI::Token::Number::Float ();
  69         156  
  69         1984  
45 69     69   25875 use PPI::Token::Number::Exp ();
  69         140  
  69         2025  
46 69     69   26345 use PPI::Token::Number::Version ();
  69         155  
  69         2089  
47 69     69   26872 use PPI::Token::Word ();
  69         211  
  69         2329  
48 69     69   23414 use PPI::Token::DashedWord ();
  69         170  
  69         2108  
49 69     69   23294 use PPI::Token::Symbol ();
  69         163  
  69         2545  
50 69     69   22820 use PPI::Token::ArrayIndex ();
  69         528  
  69         2321  
51 69     69   22865 use PPI::Token::Magic ();
  69         161  
  69         2587  
52 69     69   24378 use PPI::Token::Quote::Single ();
  69         156  
  69         2572  
53 69     69   26063 use PPI::Token::Quote::Double ();
  69         174  
  69         2549  
54 69     69   25432 use PPI::Token::Quote::Literal ();
  69         176  
  69         2789  
55 69     69   25902 use PPI::Token::Quote::Interpolate ();
  69         158  
  69         2556  
56 69     69   25757 use PPI::Token::QuoteLike::Backtick ();
  69         148  
  69         2727  
57 69     69   24790 use PPI::Token::QuoteLike::Command ();
  69         201  
  69         2880  
58 69     69   25486 use PPI::Token::QuoteLike::Regexp ();
  69         179  
  69         2666  
59 69     69   25299 use PPI::Token::QuoteLike::Words ();
  69         151  
  69         2933  
60 69     69   26847 use PPI::Token::QuoteLike::Readline ();
  69         157  
  69         3206  
61 69     69   25323 use PPI::Token::Regexp::Match ();
  69         159  
  69         2991  
62 69     69   24354 use PPI::Token::Regexp::Substitute ();
  69         158  
  69         2861  
63 69     69   24955 use PPI::Token::Regexp::Transliterate ();
  69         149  
  69         3085  
64 69     69   25192 use PPI::Token::Operator ();
  69         171  
  69         3626  
65 69     69   23330 use PPI::Token::Cast ();
  69         177  
  69         3307  
66 69     69   23726 use PPI::Token::Structure ();
  69         470  
  69         3883  
67 69     69   25058 use PPI::Token::Label ();
  69         165  
  69         3845  
68 69     69   27605 use PPI::Token::HereDoc ();
  69         165  
  69         3950  
69 69     69   23259 use PPI::Token::Separator ();
  69         163  
  69         3370  
70 69     69   22547 use PPI::Token::Data ();
  69         147  
  69         20878  
71 69     69   26432 use PPI::Token::End ();
  69         162  
  69         3915  
72 69     69   23082 use PPI::Token::Prototype ();
  69         156  
  69         3701  
73 69     69   22544 use PPI::Token::Attribute ();
  69         217  
  69         3948  
74 69     69   324 use PPI::Token::Unknown ();
  69         102  
  69         47515  
75              
76              
77              
78              
79              
80             #####################################################################
81             # Constructor and Related
82              
83             sub new {
84 578944 50   578944 0 3568885 bless { content => (defined $_[1] ? "$_[1]" : '') }, $_[0];
85             }
86              
87             sub set_class {
88 42912     42912 0 48443 my $self = shift;
89             # @_ or throw Exception("No arguments to set_class");
90 42912 50       78334 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 42912 50       124350 my $old_quote = (ref($self) =~ /\b(?:Quote|Regex)\b/o) ? 1 : 0;
94 42912 50       82500 my $new_quote = ($class =~ /\b(?:Quote|Regex)\b/o) ? 1 : 0;
95              
96             # No matter what happens, we will have to rebless
97 42912         64003 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 42912 50       110778 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 5 $_[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 153 sub length { CORE::length($_[0]->{content}) }
157              
158              
159              
160              
161              
162             #####################################################################
163             # Overloaded PPI::Element methods
164              
165             sub content {
166 1404015     1404015 1 3077209 $_[0]->{content};
167             }
168              
169             # You can insert either a statement, or a non-significant token.
170             sub insert_before {
171 1     1 1 2 my $self = shift;
172 1 50       10 my $Element = _INSTANCE(shift, 'PPI::Element') or return undef;
173 1 50       7 if ( $Element->isa('PPI::Structure') ) {
    50          
174 0         0 return $self->__insert_before($Element);
175             } elsif ( $Element->isa('PPI::Token') ) {
176 1         5 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 2 my $self = shift;
184 1 50       10 my $Element = _INSTANCE(shift, 'PPI::Element') or return undef;
185 1 50       6 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 61730 50   61730   279655 $_[0]->{content} =~ /(?:\(|\[|\{)/
215             }
216              
217             sub __LEXER__closes {
218             ref($_[0]) eq 'PPI::Token::Structure'
219             and
220 330108 100   330108   1364565 $_[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