Benchmark-Perl-Formance-Cargo
view release on metacpan or search on metacpan
share/PerlCritic/Critic/Policy/RegularExpressions/ProhibitCaptureWithoutTest.pm view on Meta::CPAN
$parent = $parent->parent()
or next FIND_REGEXP_NOT_IN_BLOCK;
}
return $regexp;
}
return;
}
# If the argument introduces a method call, return the method name;
# otherwise just return.
sub _get_method_name {
my ( $elem ) = @_;
# We fail unless the element we were given looks like it might be an
# object or a class name.
$elem or return;
(
$elem->isa( 'PPI::Token::Symbol' ) &&
q<$> eq $elem->raw_type() ||
$elem->isa( 'PPI::Token::Word' ) &&
$elem->content() =~ m/ \A [\w:]+ \z /smx
) or return;
# We skip over all the subscripts and '->' operators to the right of
# the original element, failing if we run out of objects.
my $prior;
my $next = $elem->snext_sibling() or return;
while ( $next->isa( 'PPI::Token::Subscript' ) ||
$next->isa( 'PPI::Token::Operator' ) &&
q{->} eq $next->content() ) {
$prior = $next;
$next = $next->snext_sibling or return; # fail
}
# A method call must have a '->' operator before it.
( $prior &&
$prior->isa( 'PPI::Token::Operator' ) &&
q{->} eq $prior->content()
) or return;
# Anything other than a PPI::Token::Word can not be statically
# recognized as a method name.
$next->isa( 'PPI::Token::Word' ) or return;
# Whatever we have left at this point looks very like a method name.
return $next;
}
# Determine whether the given element represents an unambiguous transfer of
# control around anything that follows it in the same block. The arguments are
# the element to check, and the capture variable that is the subject of this
# call to the policy.
sub _unambiguous_control_transfer { # RT 36081.
my ( $xfer, $elem ) = @_;
my $content = $xfer->content();
# Anything in the hash is always a transfer of control.
return $TRUE if $UNAMBIGUOUS_CONTROL_TRANSFER{ $content };
# A goto is not unambiguous on the face of it, but at least some forms of
# it can be accepted.
q<goto> eq $content
and return _unambiguous_goto( $xfer, $elem );
# Anything left at this point is _not_ an unambiguous transfer of control
# around whatever follows it.
return;
}
# Determine whether the given goto represents an unambiguous transfer of
# control around anything that follows it in the same block. The arguments are
# the element to check, and the capture variable that is the subject of this
# call to the policy.
sub _unambiguous_goto {
my ( $xfer, $elem ) = @_;
# A goto without a target?
my $target = $xfer->snext_sibling() or return;
# The co-routine form of goto is an unambiguous transfer of control.
$target->isa( 'PPI::Token::Symbol' )
and q<&> eq $target->raw_type()
and return $TRUE;
# The label form of goto is an unambiguous transfer of control,
# provided the label does not occur between the goto and the capture
# variable.
if ( $target->isa( 'PPI::Token::Word' ) ) {
# We need to search in our most-local block, or the document if
# there is no enclosing block.
my $container = $target;
while ( my $parent = $container->parent() ) {
$container = $parent;
$container->isa( 'PPI::Structure::Block' ) and last;
}
# We search the container for our label. If we find it, we return
# true if it occurs before the goto or after the capture variable,
# otherwise we return false. If we do not find it we return true.
# Note that perl does not seem to consider duplicate labels an
# error, but also seems to take the first one in the relevant
# scope when this happens.
my $looking_for = qr/ \A @{[ $target->content() ]} \s* : \z /smx;
my ($start_line, $start_char) = @{ $xfer->location() || [] };
defined $start_line or return; # document not indexed.
my ($end_line, $end_char) = @{ $elem->location() || [] };
foreach my $label (
@{ $container->find( 'PPI::Token::Label' ) || [] } )
{
$label->content() =~ m/$looking_for/smx or next;
my ( $line, $char ) = @{ $label->location() || [] };
return $TRUE
if $line < $start_line ||
$line == $start_line && $char < $start_char;
return $TRUE
if $line > $end_line ||
$line == $end_line && $char > $end_char;
return;
}
return $TRUE;
}
# Any other form of goto can not be statically analyzed, and so is not
# an unambiguous transfer of control around the capture variable.
( run in 0.631 second using v1.01-cache-2.11-cpan-5837b0d9d2c )