File Coverage

blib/lib/Perl/Critic/Policy/BuiltinFunctions/RequireSimpleSortBlock.pm
Criterion Covered Total %
statement 23 34 67.6
branch 1 14 7.1
condition 0 6 0.0
subroutine 11 11 100.0
pod 4 5 80.0
total 39 70 55.7


line stmt bran cond sub pod time code
1             package Perl::Critic::Policy::BuiltinFunctions::RequireSimpleSortBlock;
2              
3 40     40   26419 use 5.010001;
  40         212  
4 40     40   280 use strict;
  40         119  
  40         922  
5 40     40   249 use warnings;
  40         125  
  40         1209  
6 40     40   263 use Readonly;
  40         137  
  40         2271  
7              
8 40     40   335 use Perl::Critic::Utils qw{ :severities :classification };
  40         142  
  40         2194  
9 40     40   14120 use parent 'Perl::Critic::Policy';
  40         153  
  40         273  
10              
11             our $VERSION = '1.150';
12              
13             #-----------------------------------------------------------------------------
14              
15             Readonly::Scalar my $DESC => q{Sort blocks should have a single statement};
16             Readonly::Scalar my $EXPL => [ 149 ];
17              
18             #-----------------------------------------------------------------------------
19              
20 89     89 0 1598 sub supported_parameters { return () }
21 74     74 1 314 sub default_severity { return $SEVERITY_MEDIUM }
22 86     86 1 347 sub default_themes { return qw( core pbp maintenance complexity) }
23 30     30 1 80 sub applies_to { return 'PPI::Token::Word' }
24              
25             #-----------------------------------------------------------------------------
26              
27             sub violates {
28 329     329 1 558 my ( $self, $elem, undef ) = @_;
29              
30 329 50       525 return if $elem->content() ne 'sort';
31 0 0         return if ! is_function_call($elem);
32              
33 0           my $sib = $elem->snext_sibling();
34 0 0         return if !$sib;
35              
36 0           my $arg = $sib;
37 0 0         if ( $arg->isa('PPI::Structure::List') ) {
38 0           $arg = $arg->schild(0);
39             # Forward looking: PPI might change in v1.200 so schild(0) is a PPI::Statement::Expression
40 0 0 0       if ( $arg && $arg->isa('PPI::Statement::Expression') ) {
41 0           $arg = $arg->schild(0);
42             }
43             }
44 0 0 0       return if !$arg || !$arg->isa('PPI::Structure::Block');
45              
46             # If we get here, we found a sort with a block as the first arg
47 0 0         return if ( 1 >= $arg->schildren() );
48              
49             # more than one child statements
50 0           return $self->violation( $DESC, $EXPL, $elem );
51             }
52              
53             1;
54              
55             #-----------------------------------------------------------------------------
56              
57             __END__
58              
59             =pod
60              
61             =head1 NAME
62              
63             Perl::Critic::Policy::BuiltinFunctions::RequireSimpleSortBlock - Sort blocks should have a single statement.
64              
65              
66             =head1 AFFILIATION
67              
68             This Policy is part of the core L<Perl::Critic|Perl::Critic>
69             distribution.
70              
71              
72             =head1 DESCRIPTION
73              
74             Conway advises that sort functions should be simple. Any complicated
75             operations on list elements should be computed and cached (perhaps via
76             a Schwartzian Transform) before the sort, rather than computed inside
77             the sort block, because the sort block is called C<N log N> times
78             instead of just C<N> times.
79              
80             This policy prohibits the most blatant case of complicated sort
81             blocks: multiple statements. Future policies may wish to examine the
82             sort block in more detail -- looking for subroutine calls or large
83             numbers of operations.
84              
85              
86             =head1 CONFIGURATION
87              
88             This Policy is not configurable except for the standard options.
89              
90              
91             =head1 AUTHOR
92              
93             Chris Dolan <cdolan@cpan.org>
94              
95             =head1 COPYRIGHT
96              
97             Copyright (c) 2006-2011 Chris Dolan.
98              
99             This program is free software; you can redistribute it and/or modify
100             it under the same terms as Perl itself.
101              
102             =cut
103              
104             # Local Variables:
105             # mode: cperl
106             # cperl-indent-level: 4
107             # fill-column: 78
108             # indent-tabs-mode: nil
109             # c-indentation-style: bsd
110             # End:
111             # ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :