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 68     68   335 use strict;
  68         101  
  68         2329  
24 68     68   603 use Params::Util qw{_INSTANCE};
  68         5266  
  68         2933  
25 68     68   683 use PPI::Element ();
  68         98  
  68         807  
26 68     68   618 use PPI::Exception ();
  68         91  
  68         2689  
27              
28             our $VERSION = '1.287';
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 68     68   25271 use PPI::Token::BOM ();
  68         146  
  68         1751  
37 68     68   27764 use PPI::Token::Whitespace ();
  68         160  
  68         2054  
38 68     68   24171 use PPI::Token::Comment ();
  68         152  
  68         1452  
39 68     68   22994 use PPI::Token::Pod ();
  68         158  
  68         1741  
40 68     68   23043 use PPI::Token::Number ();
  68         175  
  68         1819  
41 68     68   25153 use PPI::Token::Number::Binary ();
  68         162  
  68         1840  
42 68     68   23762 use PPI::Token::Number::Octal ();
  68         151  
  68         1757  
43 68     68   23710 use PPI::Token::Number::Hex ();
  68         172  
  68         1814  
44 68     68   25753 use PPI::Token::Number::Float ();
  68         184  
  68         2015  
45 68     68   26145 use PPI::Token::Number::Exp ();
  68         161  
  68         2031  
46 68     68   27800 use PPI::Token::Number::Version ();
  68         175  
  68         2114  
47 68     68   27313 use PPI::Token::Word ();
  68         188  
  68         2353  
48 68     68   24108 use PPI::Token::DashedWord ();
  68         164  
  68         2173  
49 68     68   24114 use PPI::Token::Symbol ();
  68         190  
  68         2598  
50 68     68   23929 use PPI::Token::ArrayIndex ();
  68         348  
  68         2435  
51 68     68   24143 use PPI::Token::Magic ();
  68         169  
  68         2703  
52 68     68   24695 use PPI::Token::Quote::Single ();
  68         157  
  68         2496  
53 68     68   25614 use PPI::Token::Quote::Double ();
  68         172  
  68         2657  
54 68     68   25425 use PPI::Token::Quote::Literal ();
  68         186  
  68         2748  
55 68     68   25858 use PPI::Token::Quote::Interpolate ();
  68         158  
  68         2494  
56 68     68   25492 use PPI::Token::QuoteLike::Backtick ();
  68         150  
  68         2489  
57 68     68   23335 use PPI::Token::QuoteLike::Command ();
  68         149  
  68         2789  
58 68     68   24831 use PPI::Token::QuoteLike::Regexp ();
  68         173  
  68         2728  
59 68     68   24595 use PPI::Token::QuoteLike::Words ();
  68         148  
  68         4274  
60 68     68   24131 use PPI::Token::QuoteLike::Readline ();
  68         151  
  68         2963  
61 68     68   25841 use PPI::Token::Regexp::Match ();
  68         162  
  68         2860  
62 68     68   24119 use PPI::Token::Regexp::Substitute ();
  68         196  
  68         2824  
63 68     68   24130 use PPI::Token::Regexp::Transliterate ();
  68         150  
  68         3152  
64 68     68   24440 use PPI::Token::Operator ();
  68         156  
  68         3617  
65 68     68   22782 use PPI::Token::Cast ();
  68         160  
  68         3353  
66 68     68   22819 use PPI::Token::Structure ();
  68         168  
  68         3719  
67 68     68   23913 use PPI::Token::Label ();
  68         171  
  68         3612  
68 68     68   26903 use PPI::Token::HereDoc ();
  68         175  
  68         4010  
69 68     68   22522 use PPI::Token::Separator ();
  68         155  
  68         3328  
70 68     68   21986 use PPI::Token::Data ();
  68         156  
  68         4189  
71 68     68   26278 use PPI::Token::End ();
  68         166  
  68         3808  
72 68     68   22376 use PPI::Token::Prototype ();
  68         164  
  68         3811  
73 68     68   22158 use PPI::Token::Attribute ();
  68         164  
  68         4005  
74 68     68   378 use PPI::Token::Unknown ();
  68         115  
  68         46693  
75              
76              
77              
78              
79              
80             #####################################################################
81             # Constructor and Related
82              
83             sub new {
84 579003 50   579003 0 3719262 bless { content => (defined $_[1] ? "$_[1]" : '') }, $_[0];
85             }
86              
87             sub set_class {
88 43027     43027 0 47613 my $self = shift;
89             # @_ or throw Exception("No arguments to set_class");
90 43027 50       80496 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 43027 50       127064 my $old_quote = (ref($self) =~ /\b(?:Quote|Regex)\b/o) ? 1 : 0;
94 43027 50       88336 my $new_quote = ($class =~ /\b(?:Quote|Regex)\b/o) ? 1 : 0;
95              
96             # No matter what happens, we will have to rebless
97 43027         65569 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 43027 50       114098 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 6 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 195 sub length { CORE::length($_[0]->{content}) }
157              
158              
159              
160              
161              
162             #####################################################################
163             # Overloaded PPI::Element methods
164              
165             sub content {
166 1404320     1404320 1 3204788 $_[0]->{content};
167             }
168              
169             # You can insert either a statement, or a non-significant token.
170             sub insert_before {
171 1     1 1 3 my $self = shift;
172 1 50       9 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 3 my $self = shift;
184 1 50       10 my $Element = _INSTANCE(shift, 'PPI::Element') or return undef;
185 1 50       8 if ( $Element->isa('PPI::Structure') ) {
    50          
186 0         0 return $self->__insert_after($Element);
187             } elsif ( $Element->isa('PPI::Token') ) {
188 1         5 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 61930 50   61930   286501 $_[0]->{content} =~ /(?:\(|\[|\{)/
215             }
216              
217             sub __LEXER__closes {
218             ref($_[0]) eq 'PPI::Token::Structure'
219             and
220 330708 100   330708   1411652 $_[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