Zoom-Meeting
view release on metacpan or search on metacpan
local/lib/perl5/Perl/Critic/Annotation.pm view on Meta::CPAN
$sib->logical_line_number() == $annotation_line
and return 1;
# If the sibling is a node, we may have an annotation on one line of a
# statement that was split over multiple lines. So we descend through the
# children, keeping the last significant child of each, until we bottom
# out. If the ultimate significant descendant is on the same line as the
# annotation, we accept the annotation as a single-line annotation.
if ( $sib->isa( 'PPI::Node' ) &&
$sib->logical_line_number() < $annotation_line
) {
my $neighbor = $sib;
while ( $neighbor->isa( 'PPI::Node' )
and my $kid = $neighbor->schild( $LAST_ELEMENT ) ) {
$neighbor = $kid;
}
if ( $neighbor &&
$neighbor->logical_line_number() == $annotation_line
) {
return 1;
}
}
# We do not understand any other sort of single-line annotation. Accepting
# the annotation as such (if it is) is Someone Else's Problem.
return 0;
}
#-----------------------------------------------------------------------------
sub _parse_annotation {
my ($annotation_element) = @_;
#############################################################################
# This regex captures the list of Policy name patterns that are to be
# disabled. It is generally assumed that the element has already been
# verified as a no-critic annotation. So if this regex does not match,
# then it implies that all Policies are to be disabled.
#
my $no_critic = qr{\#\# \s* no \s+ critic \s* (?:qw)? [(["'] ([\s\w:,]+) }xms;
# -------------------------- ------- ----- -----------
# | | | |
# "## no critic" with optional spaces | | |
# | | |
# Policy list may be prefixed with "qw" | |
# | |
# Optional Policy list must begin with one of these |
# |
# Capture entire Policy list (with delimiters) here
#
#############################################################################
my @disabled_policy_names;
if ( my ($patterns_string) = $annotation_element =~ $no_critic ) {
# Compose the specified modules into a regex alternation. Wrap each
# in a no-capturing group to permit "|" in the modules specification.
my @policy_name_patterns = grep { $_ ne $EMPTY }
split m{\s *[,\s] \s*}xms, $patterns_string;
my $re = join $PIPE, map {"(?:$_)"} @policy_name_patterns;
my @site_policy_names = Perl::Critic::PolicyFactory::site_policy_names();
@disabled_policy_names = grep {m/$re/ixms} @site_policy_names;
# It is possible that the Policy patterns listed in the annotation do not
# match any of the site policy names. This could happen when running
# on a machine that does not have the same set of Policies as the author.
# So we must return something here, otherwise all Policies will be
# disabled. We probably need to add a mechanism to (optionally) warn
# about this, just to help the author avoid writing invalid Policy names.
if (not @disabled_policy_names) {
@disabled_policy_names = @policy_name_patterns;
}
}
return hashify(@disabled_policy_names);
}
#-----------------------------------------------------------------------------
1;
__END__
=pod
=head1 NAME
Perl::Critic::Annotation - A "## no critic" annotation in a document.
=head1 SYNOPSIS
use Perl::Critic::Annotation;
$annotation = Perl::Critic::Annotation->new( -element => $no_critic_ppi_element );
$bool = $annotation->disables_line( $number );
$bool = $annotation->disables_policy( $policy_object );
$bool = $annotation->disables_all_policies();
($start, $end) = $annotation->effective_range();
@disabled_policy_names = $annotation->disabled_policies();
=head1 DESCRIPTION
C<Perl::Critic::Annotation> represents a single C<"## no critic">
annotation in a L<PPI::Document>. The Annotation takes care of parsing
the annotation and keeps track of which lines and Policies it affects.
It is intended to encapsulate the details of the no-critic
annotations, and to provide a way for Policy objects to interact with
the annotations (via a L<Perl::Critic::Document|Perl::Critic::Document>).
=head1 INTERFACE SUPPORT
This is considered to be a non-public class. Its interface is subject
to change without notice.
( run in 0.414 second using v1.01-cache-2.11-cpan-71847e10f99 )