Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 5 additions & 8 deletions lib/Test/UsedModules.pm
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,10 @@ sub _used_modules_ok {
sub _check_used_modules {
my ( $builder, $file ) = @_;

my ($ppi_document, $load_removed) = Test::UsedModules::PPIDocument::generate($file);
my ($ppi_document_without_symbol) = Test::UsedModules::PPIDocument::generate($file, 'Symbol');

my @used_modules = Test::UsedModules::PPIDocument::fetch_modules_in_module($file);
my $doc = Test::UsedModules::PPIDocument->new($file);

my $fail = 0;
CHECK: for my $used_module (@used_modules) {
CHECK: for my $used_module (@{$doc->{used_modules}}) {
my $module_in_whitelist = 0;
for my $whitelist_item (@$MODULES_WHITELIST) {
if ( ref $whitelist_item eq 'Regexp' ) {
Expand All @@ -79,12 +76,12 @@ sub _check_used_modules {

next if $module_in_whitelist;

next if $used_module->{name} eq 'Module::Load' && $load_removed;
next if $ppi_document =~ /$used_module->{name}/;
next if $used_module->{name} eq 'Module::Load' && $doc->{load_removed};
next if $doc->{ppi_document} =~ /$used_module->{name}/;

my @imported_subs = _fetch_imported_subs($used_module);
for my $sub (@imported_subs) {
next CHECK if $ppi_document_without_symbol =~ /$sub/;
next CHECK if $doc->{ppi_document_without_symbol} =~ /$sub/;
}

$builder->diag( "Test::UsedModules failed: '$used_module->{name}' is not used.");
Expand Down
43 changes: 23 additions & 20 deletions lib/Test/UsedModules/PPIDocument.pm
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,30 @@ use PPI::Document;
use PPI::Dumper;
use Test::UsedModules::Constants;

sub generate {
my ($file, $extra_remove_token) = shift;

my $document = _generate_with_include($file, $extra_remove_token);
return _remove_include_sections($document);
sub new {
my ($class, $file) = @_;

my $document = PPI::Document->new($file);
_remove_unnecessary_tokens($document);
my $document_str = PPI::Dumper->new($document)->string();
my ($ppi_document, $load_removed) = _remove_include_sections($document_str);

my @modules = _fetch_modules_in_module($document_str);

$document->prune('PPI::Symbol');
my ($ppi_document_without_symbol) = _remove_include_sections(PPI::Dumper->new($document)->string());

bless {
file => $file,
used_modules => \@modules,
ppi_document => $ppi_document,
load_removed => $load_removed,
ppi_document_without_symbol => $ppi_document_without_symbol,
}, $class;
}

sub fetch_modules_in_module {
my ($file) = @_;
my $ppi_document = _generate_with_include($file);
sub _fetch_modules_in_module {
my ($ppi_document) = @_;
my @ppi_used_modules = _list_up_modules($ppi_document);

my @used_modules;
Expand Down Expand Up @@ -69,13 +83,6 @@ sub _list_up_modules {
return @ppi_used_modules;
}

sub _generate_with_include {
my ($file, $extra_remove_token) = shift;

my $document = _remove_unnecessary_tokens(PPI::Document->new($file), $extra_remove_token);
return PPI::Dumper->new($document)->string();
}

sub _remove_include_sections {
my ($ppi_document) = @_;
$ppi_document =~ s/
Expand All @@ -96,7 +103,7 @@ sub _remove_include_sections {
}

sub _remove_unnecessary_tokens {
my ( $document, $optional_token ) = @_;
my ( $document ) = @_;

my @surplus_tokens = (
'Operator',
Expand All @@ -111,10 +118,6 @@ sub _remove_unnecessary_tokens {
'Whitespace'
);

if ($optional_token) {
push @surplus_tokens, $optional_token;
}

foreach my $surplus_token (@surplus_tokens) {
$document->prune( 'PPI::Token::' . $surplus_token );
}
Expand Down