| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Perl::Metrics::Lite::Analysis::File; |
|
2
|
4
|
|
|
4
|
|
34
|
use strict; |
|
|
4
|
|
|
|
|
9
|
|
|
|
4
|
|
|
|
|
118
|
|
|
3
|
4
|
|
|
4
|
|
21
|
use warnings; |
|
|
4
|
|
|
|
|
7
|
|
|
|
4
|
|
|
|
|
118
|
|
|
4
|
|
|
|
|
|
|
|
|
5
|
4
|
|
|
4
|
|
27
|
use Carp qw(cluck confess); |
|
|
4
|
|
|
|
|
19
|
|
|
|
4
|
|
|
|
|
220
|
|
|
6
|
4
|
|
|
4
|
|
24
|
use Perl::Metrics::Lite::Analysis; |
|
|
4
|
|
|
|
|
18
|
|
|
|
4
|
|
|
|
|
109
|
|
|
7
|
4
|
|
|
4
|
|
24
|
use Perl::Metrics::Lite::Analysis::Util; |
|
|
4
|
|
|
|
|
6
|
|
|
|
4
|
|
|
|
|
95
|
|
|
8
|
4
|
|
|
4
|
|
1744
|
use Perl::Metrics::Lite::Analysis::DocumentFactory; |
|
|
4
|
|
|
|
|
28
|
|
|
|
4
|
|
|
|
|
237
|
|
|
9
|
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
our $VERSION = '0.092'; |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
use Module::Pluggable |
|
13
|
4
|
|
|
|
|
31
|
require => 1, |
|
14
|
|
|
|
|
|
|
search_path => 'Perl::Metrics::Lite::Analysis::File::Plugin', |
|
15
|
4
|
|
|
4
|
|
1936
|
sub_name => 'file_plugins'; |
|
|
4
|
|
|
|
|
33162
|
|
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
use Module::Pluggable |
|
18
|
4
|
|
|
|
|
24
|
require => 1, |
|
19
|
|
|
|
|
|
|
search_path => 'Perl::Metrics::Lite::Analysis::Sub::Plugin', |
|
20
|
4
|
|
|
4
|
|
454
|
sub_name => 'sub_plugins'; |
|
|
4
|
|
|
|
|
9
|
|
|
21
|
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
# Private instance variables: |
|
23
|
|
|
|
|
|
|
my %_PATH = (); |
|
24
|
|
|
|
|
|
|
my %_MAIN_STATS = (); |
|
25
|
|
|
|
|
|
|
my %_SUBS = (); |
|
26
|
|
|
|
|
|
|
my %_PACKAGES = (); |
|
27
|
|
|
|
|
|
|
my %_LINES = (); |
|
28
|
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
sub new { |
|
30
|
18
|
|
|
18
|
0
|
2144
|
my ( $class, %parameters ) = @_; |
|
31
|
18
|
|
|
|
|
44
|
my $self = {}; |
|
32
|
18
|
|
|
|
|
48
|
bless $self, $class; |
|
33
|
18
|
|
|
|
|
88
|
$self->_init(%parameters); |
|
34
|
18
|
|
|
|
|
12063
|
return $self; |
|
35
|
|
|
|
|
|
|
} |
|
36
|
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
sub _init { |
|
38
|
18
|
|
|
18
|
|
54
|
my ( $self, %parameters ) = @_; |
|
39
|
18
|
|
|
|
|
75
|
$_PATH{$self} = $parameters{'path'}; |
|
40
|
|
|
|
|
|
|
|
|
41
|
18
|
|
|
|
|
57
|
my $path = $self->path(); |
|
42
|
|
|
|
|
|
|
|
|
43
|
18
|
|
|
|
|
141
|
my $document = Perl::Metrics::Lite::Analysis::DocumentFactory |
|
44
|
|
|
|
|
|
|
->create_normalized_document($path); |
|
45
|
18
|
50
|
|
|
|
70
|
if ( !defined $document ) { |
|
46
|
0
|
|
|
|
|
0
|
cluck "Could not make a PPI document from '$path'"; |
|
47
|
0
|
|
|
|
|
0
|
return; |
|
48
|
|
|
|
|
|
|
} |
|
49
|
|
|
|
|
|
|
|
|
50
|
18
|
|
|
|
|
74
|
my $packages |
|
51
|
|
|
|
|
|
|
= Perl::Metrics::Lite::Analysis::Util::get_packages($document); |
|
52
|
|
|
|
|
|
|
|
|
53
|
18
|
|
|
|
|
41
|
my @sub_analysis = (); |
|
54
|
18
|
|
|
|
|
58
|
my $sub_elements = $document->find('PPI::Statement::Sub'); |
|
55
|
18
|
|
|
|
|
50741
|
@sub_analysis = @{ $self->analyze_subs($sub_elements) }; |
|
|
18
|
|
|
|
|
86
|
|
|
56
|
|
|
|
|
|
|
|
|
57
|
18
|
|
|
|
|
75
|
$_MAIN_STATS{$self} = $self->analyze_file($document); |
|
58
|
18
|
|
|
|
|
52
|
$_SUBS{$self} = \@sub_analysis; |
|
59
|
18
|
|
|
|
|
51
|
$_PACKAGES{$self} = $packages; |
|
60
|
18
|
|
|
|
|
57
|
$_LINES{$self} |
|
61
|
|
|
|
|
|
|
= Perl::Metrics::Lite::Analysis::Util::get_node_length($document); |
|
62
|
|
|
|
|
|
|
|
|
63
|
18
|
|
|
|
|
111
|
return $self; |
|
64
|
|
|
|
|
|
|
} |
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
sub all_counts { |
|
67
|
0
|
|
|
0
|
0
|
0
|
my $self = shift; |
|
68
|
0
|
|
|
|
|
0
|
my $stats_hash = { |
|
69
|
|
|
|
|
|
|
path => $self->path, |
|
70
|
|
|
|
|
|
|
lines => $self->lines, |
|
71
|
|
|
|
|
|
|
main_stats => $self->main_stats, |
|
72
|
|
|
|
|
|
|
subs => $self->subs, |
|
73
|
|
|
|
|
|
|
packages => $self->packages, |
|
74
|
|
|
|
|
|
|
}; |
|
75
|
0
|
|
|
|
|
0
|
return $stats_hash; |
|
76
|
|
|
|
|
|
|
} |
|
77
|
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
sub analyze_file { |
|
79
|
18
|
|
|
18
|
0
|
48
|
my ($self, $document) = @_; |
|
80
|
|
|
|
|
|
|
|
|
81
|
18
|
50
|
|
|
|
80
|
if ( !$document->isa('PPI::Document') ) { |
|
82
|
0
|
|
|
|
|
0
|
Carp::confess('Did not supply a PPI::Document'); |
|
83
|
|
|
|
|
|
|
} |
|
84
|
|
|
|
|
|
|
|
|
85
|
18
|
|
|
|
|
58
|
my $metrics = $self->measure_file_metrics($document); |
|
86
|
18
|
|
|
|
|
55
|
$metrics->{path} = $self->path; |
|
87
|
18
|
|
|
|
|
77
|
return $metrics; |
|
88
|
|
|
|
|
|
|
} |
|
89
|
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
sub measure_file_metrics { |
|
91
|
18
|
|
|
18
|
0
|
42
|
my ( $self, $file ) = @_; |
|
92
|
18
|
|
|
|
|
40
|
my $metrics = {}; |
|
93
|
18
|
|
|
|
|
79
|
foreach my $plugin ( $self->file_plugins ) { |
|
94
|
54
|
|
|
|
|
34884
|
$plugin->init; |
|
95
|
54
|
50
|
|
|
|
309
|
next unless $plugin->can('init'); |
|
96
|
54
|
50
|
|
|
|
226
|
next unless $plugin->can('measure'); |
|
97
|
54
|
|
|
|
|
168
|
my $metric = $plugin->measure( $self, $file ); |
|
98
|
54
|
|
|
|
|
165
|
my $metric_name = $self->metric_name($plugin); |
|
99
|
54
|
|
|
|
|
241
|
$metrics->{$metric_name} = $metric; |
|
100
|
|
|
|
|
|
|
} |
|
101
|
18
|
|
|
|
|
52
|
return $metrics; |
|
102
|
|
|
|
|
|
|
} |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
sub metric_name { |
|
105
|
111
|
|
|
111
|
0
|
265
|
my ( $self, $plugin ) = @_; |
|
106
|
111
|
|
|
|
|
205
|
my $metric_name = $plugin; |
|
107
|
111
|
|
|
|
|
648
|
$metric_name =~ s/.*::(.*)$/$1/; |
|
108
|
111
|
|
|
|
|
294
|
$metric_name = _decamelize($metric_name); |
|
109
|
111
|
|
|
|
|
259
|
$metric_name; |
|
110
|
|
|
|
|
|
|
} |
|
111
|
|
|
|
|
|
|
|
|
112
|
|
|
|
|
|
|
sub _decamelize { |
|
113
|
111
|
|
|
111
|
|
211
|
my $s = shift; |
|
114
|
111
|
|
|
|
|
571
|
$s =~ s{([^a-zA-Z]?)([A-Z]*)([A-Z])([a-z]?)}{ |
|
115
|
185
|
|
|
|
|
369
|
my $fc = pos($s)==0; |
|
116
|
185
|
|
|
|
|
728
|
my ($p0,$p1,$p2,$p3) = ($1,lc$2,lc$3,$4); |
|
117
|
185
|
100
|
66
|
|
|
752
|
my $t = $p0 || $fc ? $p0 : '_'; |
|
118
|
185
|
50
|
|
|
|
462
|
$t .= $p3 ? $p1 ? "${p1}_$p2$p3" : "$p2$p3" : "$p1$p2"; |
|
|
|
50
|
|
|
|
|
|
|
119
|
185
|
|
|
|
|
1000
|
$t; |
|
120
|
|
|
|
|
|
|
}ge; |
|
121
|
111
|
|
|
|
|
331
|
$s; |
|
122
|
|
|
|
|
|
|
} |
|
123
|
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
sub path { |
|
125
|
85
|
|
|
85
|
0
|
215
|
my ($self) = @_; |
|
126
|
85
|
|
|
|
|
258
|
return $_PATH{$self}; |
|
127
|
|
|
|
|
|
|
} |
|
128
|
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
sub main_stats { |
|
130
|
30
|
|
|
30
|
0
|
55
|
my ($self) = @_; |
|
131
|
30
|
|
|
|
|
85
|
return $_MAIN_STATS{$self}; |
|
132
|
|
|
|
|
|
|
} |
|
133
|
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
sub subs { |
|
135
|
17
|
|
|
17
|
0
|
37
|
my ($self) = @_; |
|
136
|
17
|
|
|
|
|
61
|
return $_SUBS{$self}; |
|
137
|
|
|
|
|
|
|
} |
|
138
|
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
sub packages { |
|
140
|
16
|
|
|
16
|
0
|
36
|
my ($self) = @_; |
|
141
|
16
|
|
|
|
|
48
|
return $_PACKAGES{$self}; |
|
142
|
|
|
|
|
|
|
} |
|
143
|
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
sub lines { |
|
145
|
15
|
|
|
15
|
0
|
31
|
my ($self) = @_; |
|
146
|
15
|
|
|
|
|
45
|
return $_LINES{$self}; |
|
147
|
|
|
|
|
|
|
} |
|
148
|
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
sub analyze_subs { |
|
150
|
18
|
|
|
18
|
0
|
62
|
my $self = shift; |
|
151
|
18
|
|
|
|
|
37
|
my $found_subs = shift; |
|
152
|
|
|
|
|
|
|
|
|
153
|
18
|
100
|
|
|
|
61
|
return [] |
|
154
|
|
|
|
|
|
|
if ( |
|
155
|
|
|
|
|
|
|
!Perl::Metrics::Lite::Analysis::Util::is_ref( $found_subs, 'ARRAY' ) |
|
156
|
|
|
|
|
|
|
); |
|
157
|
|
|
|
|
|
|
|
|
158
|
8
|
|
|
|
|
29
|
my @subs = (); |
|
159
|
8
|
|
|
|
|
20
|
foreach my $sub ( @{$found_subs} ) { |
|
|
8
|
|
|
|
|
37
|
|
|
160
|
19
|
|
|
|
|
63
|
my $metrics = $self->measure_sub_metrics($sub); |
|
161
|
19
|
|
|
|
|
71
|
$self->add_basic_sub_info( $sub, $metrics ); |
|
162
|
19
|
|
|
|
|
676
|
push @subs, $metrics; |
|
163
|
|
|
|
|
|
|
} |
|
164
|
8
|
|
|
|
|
45
|
return \@subs; |
|
165
|
|
|
|
|
|
|
} |
|
166
|
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
sub measure_sub_metrics { |
|
168
|
19
|
|
|
19
|
0
|
47
|
my ( $self, $sub ) = @_; |
|
169
|
19
|
|
|
|
|
50
|
my $metrics = {}; |
|
170
|
19
|
|
|
|
|
85
|
foreach my $plugin ( $self->sub_plugins ) { |
|
171
|
57
|
|
|
|
|
37521
|
$plugin->init; |
|
172
|
57
|
50
|
|
|
|
352
|
next unless $plugin->can('init'); |
|
173
|
57
|
50
|
|
|
|
253
|
next unless $plugin->can('measure'); |
|
174
|
57
|
|
|
|
|
169
|
my $metric = $plugin->measure( $self, $sub ); |
|
175
|
57
|
|
|
|
|
39097
|
my $metric_name = $self->metric_name($plugin); |
|
176
|
57
|
|
|
|
|
220
|
$metrics->{$metric_name} = $metric; |
|
177
|
|
|
|
|
|
|
} |
|
178
|
19
|
|
|
|
|
51
|
return $metrics; |
|
179
|
|
|
|
|
|
|
} |
|
180
|
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
sub add_basic_sub_info { |
|
182
|
19
|
|
|
19
|
0
|
50
|
my ( $self, $sub, $metrics ) = @_; |
|
183
|
19
|
|
|
|
|
42
|
$metrics->{path} = $self->path; |
|
184
|
19
|
|
|
|
|
80
|
$metrics->{name} = $sub->name; |
|
185
|
|
|
|
|
|
|
} |
|
186
|
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
1; |
|
188
|
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
__END__ |