X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FPerl%2FCritic%2FPolicy%2FDynamic%2FNoIndirect.pm;h=5236bda9a6516ef6e048775d6741e1674119c6b8;hb=fdfcb1cec5f258ed25e22c7d1fea67e03098b3fd;hp=5b0ac623c72b1a6f34b2beeccf073b97f4179db6;hpb=c2e8dfbf550e0a15ff415a698c806e1fc8ca03fe;p=perl%2Fmodules%2FPerl-Critic-Policy-Dynamic-NoIndirect.git diff --git a/lib/Perl/Critic/Policy/Dynamic/NoIndirect.pm b/lib/Perl/Critic/Policy/Dynamic/NoIndirect.pm index 5b0ac62..5236bda 100644 --- a/lib/Perl/Critic/Policy/Dynamic/NoIndirect.pm +++ b/lib/Perl/Critic/Policy/Dynamic/NoIndirect.pm @@ -11,11 +11,11 @@ Perl::Critic::Policy::Dynamic::NoIndirect - Perl::Critic policy against indirect =head1 VERSION -Version 0.01 +Version 0.02 =cut -our $VERSION = '0.01'; +our $VERSION = '0.02'; =head1 DESCRIPTION @@ -74,23 +74,24 @@ sub violates_dynamic { my @violations; if (@errs) { - my ($err, $obj, $meth, $line); + my %errs_tags; + for (@errs) { + my ($obj, $meth, $line) = @$_[0, 1, 3]; + $line -= $offset; + my $tag = join "\0", $line, $meth, $obj; + push @{$errs_tags{$tag}}, [ $obj, $meth ]; + } $doc->find(sub { - unless ($err) { - return 1 unless @errs; - $err = shift @errs; - ($obj, $meth, $line) = @$err[0, 1, 3]; - $line -= $offset; - } - my $elt = $_[1]; my $pos = $elt->location; + return 0 unless $pos; - if ($pos and $pos->[0] == $line and $elt eq $meth - and $elt->snext_sibling eq $obj) { - push @violations, [ $obj, $meth, $elt ]; - undef $err; + my $tag = join "\0", $pos->[0], $elt, $elt->snext_sibling; + if (my $errs = $errs_tags{$tag}) { + push @violations, do { my $e = pop @$errs; push @$e, $elt; $e }; + delete $errs_tags{$tag} unless @$errs; + return 1 unless %errs_tags; } return 0;