File: ProhibitSpecialLiteralHeredocTerminator.pm

package info (click to toggle)
libperl-critic-perl 1.156-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 3,544 kB
  • sloc: perl: 24,092; lisp: 341; makefile: 7
file content (128 lines) | stat: -rw-r--r-- 3,101 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package Perl::Critic::Policy::ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator;

use 5.010001;
use strict;
use warnings;

use Readonly;

use Perl::Critic::Utils qw{ :severities };
use parent 'Perl::Critic::Policy';

our $VERSION = '1.156';

#-----------------------------------------------------------------------------

Readonly::Hash my %SPECIAL_LITERAL => map { '__' . $_ . '__' => 1 }
                                      qw( FILE LINE PACKAGE END DATA );
Readonly::Scalar my $DESC =>
    q{Heredoc terminator must not be a special literal};

#-----------------------------------------------------------------------------

sub supported_parameters { return ()                       }
sub default_severity     { return $SEVERITY_MEDIUM         }
sub default_themes       { return qw(core maintenance)     }
sub applies_to           { return 'PPI::Token::HereDoc'    }

#-----------------------------------------------------------------------------

sub violates {
    my ( $self, $elem, undef ) = @_;

    # remove << and (optional) quotes from around terminator
    ( my $heredoc_terminator = $elem ) =~
        s{ \A << ~? \s* (["']?) (.*) \1 \z }{$2}xms;

    if ( $SPECIAL_LITERAL{ $heredoc_terminator } ) {
        my $expl = qq{Used "$heredoc_terminator" as heredoc terminator};
        return $self->violation( $DESC, $expl, $elem );
    }

    return;    #ok!
}

1;

__END__

#-----------------------------------------------------------------------------

=pod

=head1 NAME

Perl::Critic::Policy::ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator - Don't write C< print <<'__END__' >.


=head1 AFFILIATION

This Policy is part of the core L<Perl::Critic|Perl::Critic>
distribution.


=head1 DESCRIPTION

Using one of Perl's special literals as a HEREDOC terminator could be
confusing to tools that try to parse perl.

    print <<'__END__';           #not ok
    Hello world
    __END__

    print <<'__END_OF_WORLD__';  #ok
    Goodbye world!
    __END_OF_WORLD__

The special literals that this policy prohibits are:

=over

=item __END__

=item __DATA__

=item __PACKAGE__

=item __FILE__

=item __LINE__

=back


=head1 CONFIGURATION

This Policy is not configurable except for the standard options.


=head1 SEE ALSO

L<Perl::Critic::Policy::ValuesAndExpressions::RequireUpperCaseHeredocTerminator|Perl::Critic::Policy::ValuesAndExpressions::RequireUpperCaseHeredocTerminator>

L<Perl::Critic::Policy::ValuesAndExpressions::RequireQuotedHeredocTerminator|Perl::Critic::Policy::ValuesAndExpressions::RequireQuotedHeredocTerminator>


=head1 AUTHOR

Kyle Hasselbacher <kyle@cpan.org>


=head1 COPYRIGHT

Copyright (c) 2009-2011 Kyle Hasselbacher.

This program is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.  The full text of this license
can be found in the LICENSE file included with this module.

=cut

# Local Variables:
#   mode: cperl
#   cperl-indent-level: 4
#   fill-column: 78
#   indent-tabs-mode: nil
#   c-indentation-style: bsd
# End:
# ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :