use
5.010001;
our
$VERSION
=
'1.156'
;
Readonly::Scalar
my
$EXPL
=>
q<Unused variables clutter code and make it harder to read>
;
sub
supported_parameters {
return
() }
sub
default_severity {
return
$SEVERITY_MEDIUM
}
sub
default_themes {
return
qw< core maintenance certrec >
}
sub
applies_to {
return
qw< PPI::Document >
}
sub
violates {
my
(
$self
,
undef
,
$document
) =
@_
;
my
%symbol_usage
;
_get_symbol_usage( \
%symbol_usage
,
$document
);
_get_regexp_symbol_usage( \
%symbol_usage
,
$document
);
return
if
not
%symbol_usage
;
my
$declarations
=
$document
->find(
'PPI::Statement::Variable'
);
return
if
not
$declarations
;
my
@violations
;
DECLARATION:
foreach
my
$declaration
( @{
$declarations
} ) {
next
DECLARATION
if
'my'
ne
$declaration
->type();
my
@children
=
$declaration
->schildren();
next
DECLARATION
if
any {
$_
->content() eq
q<=>
}
@children
;
VARIABLE:
foreach
my
$variable
(
$declaration
->variables() ) {
my
$count
=
$symbol_usage
{
$variable
};
next
VARIABLE
if
not
$count
;
next
VARIABLE
if
$count
> 1;
push
@violations
,
$self
->violation(
qq<"$variable" is declared but not used.>
,
$EXPL
,
$declaration
,
);
}
}
return
@violations
;
}
sub
_get_symbol_usage {
my
(
$symbol_usage
,
$document
) =
@_
;
my
$symbols
=
$document
->find(
'PPI::Token::Symbol'
);
return
if
not
$symbols
;
foreach
my
$symbol
( @{
$symbols
} ) {
$symbol_usage
->{
$symbol
->symbol() }++;
}
foreach
my
$class
(
qw{
PPI::Token::Quote::Double
PPI::Token::Quote::Interpolate
PPI::Token::QuoteLike::Backtick
PPI::Token::QuoteLike::Command
PPI::Token::QuoteLike::Readline
PPI::Token::HereDoc
}
) {
foreach
my
$double_quotish
(
@{
$document
->find(
$class
) || [] }
) {
my
$str
= PPIx::QuoteLike->new(
$double_quotish
)
or
next
;
foreach
my
$var
(
$str
->variables() ) {
$symbol_usage
->{
$var
}++;
}
}
}
return
;
}
sub
_get_regexp_symbol_usage {
my
(
$symbol_usage
,
$document
) =
@_
;
foreach
my
$class
(
qw{
PPI::Token::Regexp::Match
PPI::Token::Regexp::Substitute
PPI::Token::QuoteLike::Regexp
}
) {
foreach
my
$regex
( @{
$document
->find(
$class
) || [] } ) {
my
$ppix
=
$document
->ppix_regexp_from_element(
$regex
) or
next
;
$ppix
->failures() and
next
;
foreach
my
$code
( @{
$ppix
->find(
'PPIx::Regexp::Token::Code'
) || [] } ) {
my
$subdoc
=
$code
->ppi() or
next
;
_get_symbol_usage(
$symbol_usage
,
$subdoc
);
}
}
}
return
;
}
1;