Skip to content

Instantly share code, notes, and snippets.

@dann
Created September 20, 2008 14:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dann/11757 to your computer and use it in GitHub Desktop.
Save dann/11757 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use strict;
use warnings;
use Carp;
use PPI::Document;
use Path::Class qw(dir);
use File::Find::Rule;
use List::MoreUtils qw(uniq any);
use Perl6::Say;
main();
sub main {
my $dir = $ARGV[0];
croak 'module dir must be set.' unless $dir;
my $perl_files = find_perl_files($dir);
my $all_modules = extract_all_modules($perl_files);
my $module_name_space = $ARGV[1];
croak 'module namespace must be set.' unless $module_name_space;
my $modules_in_plagger
= used_modules_by_module( $all_modules, $module_name_space );
print_modules($modules_in_plagger);
}
sub extract_all_modules {
my $perl_files = shift;
my @all_modules = ();
for my $file ( @{$perl_files} ) {
my $modules = extract_modules($file);
push @all_modules, @{$modules};
}
¥@all_modules;
}
sub find_perl_files {
my $module_dir = shift;
my @files = File::Find::Rule->file()->name('*.pm')->in($module_dir);
¥@files;
}
sub extract_modules {
my $file = shift;
croak "File does not exist!" unless -e $file;
my $document = eval { PPI::Document->new($file) };
unless ($document) {
warn "Could not parse file [$file]";
return;
}
my $modules = $document->find( ¥&is_module_statement );
my @modules = eval {
map { $_->module } @{$modules};
};
¥@modules;
}
sub is_module_statement {
my $ppi = $_[1];
return 0 unless ( $ppi->isa('PPI::Statement::Include') );
return 0 unless $ppi->type eq 'use';
my @not_modules
= qw/strict warnings utf8 overload integer mro parent vars constant bytes attributes base/;
return 0 if any { $ppi->module eq $_ } @not_modules;
return 1;
}
sub used_modules_by_module {
my $all_modules = shift;
my $module_namespace = shift;
my @used_modules = uniq @{$all_modules};
@used_modules = grep { $_ !~ /^${module_namespace}/ } @used_modules;
¥@used_modules;
}
sub print_modules {
my $modules = shift;
my @sorted_modules = sort @{$modules};
say join( "¥n", @sorted_modules );
}
__END__
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment