diff --git a/lib/Test/UsedModules.pm b/lib/Test/UsedModules.pm index 85fcf38..86ba689 100644 --- a/lib/Test/UsedModules.pm +++ b/lib/Test/UsedModules.pm @@ -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' ) { @@ -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."); diff --git a/lib/Test/UsedModules/PPIDocument.pm b/lib/Test/UsedModules/PPIDocument.pm index ee35dda..d7db261 100644 --- a/lib/Test/UsedModules/PPIDocument.pm +++ b/lib/Test/UsedModules/PPIDocument.pm @@ -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; @@ -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/ @@ -96,7 +103,7 @@ sub _remove_include_sections { } sub _remove_unnecessary_tokens { - my ( $document, $optional_token ) = @_; + my ( $document ) = @_; my @surplus_tokens = ( 'Operator', @@ -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 ); }