App-Midgen
view release on metacpan or search on metacpan
lib/App/Midgen/Role/UseModule.pm view on Meta::CPAN
package App::Midgen::Role::UseModule;
use constant {BLANK => q{ }, TRUE => 1, FALSE => 0, NONE => q{}, TWO => 2,
THREE => 3,};
use Moo::Role;
requires
qw( ppi_document debug verbose format xtest _process_found_modules develop meta2 );
our $VERSION = '0.34';
$VERSION = eval $VERSION; ## no critic
use PPI;
use Data::Printer {caller_info => 1,};
use Try::Tiny;
use Tie::Static qw(static);
#######
# composed method - _xtests_in_single_quote
#######
sub xtests_use_module {
my $self = shift;
my $phase_relationship = shift || NONE;
my @modules;
my @version_strings;
# bug out if there is no Include for Module::Runtime found
return if $self->_is_module_runtime() eq FALSE;
## say 'Option 1: use_module( M::N )...';
#
# use_module("Math::BigInt", 1.31)->new("1_234");
#
#PPI::Document
# PPI::Statement
# PPI::Token::Whitespace ' '
# PPI::Token::Word 'use_module'
# PPI::Structure::List ( ... )
# PPI::Statement::Expression
# PPI::Token::Quote::Double '"Math::BigInt"'
# PPI::Token::Operator ','
# PPI::Token::Whitespace ' '
# PPI::Token::Number::Float '1.31'
# PPI::Token::Operator '->'
# PPI::Token::Word 'new'
# PPI::Structure::List ( ... )
# PPI::Statement::Expression
# PPI::Token::Quote::Double '"1_234"'
# PPI::Token::Structure ';'
# PPI::Token::Whitespace '\n'
try {
my @chunks1 = @{$self->ppi_document->find('PPI::Statement')};
foreach my $chunk (@chunks1) {
if (not $chunk->find(sub { $_[1]->isa('PPI::Token::Symbol') })) {
# test for module-runtime key-words
if (
$chunk->find(
sub {
$_[1]->isa('PPI::Token::Word')
and $_[1]->content
=~ m{\A[Module::Runtime::]*(?:use_module|use_package_optimistically|require_module)\z};
}
)
)
{
if (
not $chunk->find(
sub {
$_[1]->isa('PPI::Token::Word')
and $_[1]->content =~ m{\A(?:return)\z};
}
)
)
{
for (0 .. $#{$chunk->{children}}) {
# find all ppi_sl
if ($chunk->{children}[$_]->isa('PPI::Structure::List')) {
my $ppi_sl = $chunk->{children}[$_]
if $chunk->{children}[$_]->isa('PPI::Structure::List');
print "Option 1: use_module( M::N )...\n" if $self->debug;
$self->_module_names_ppi_sl($ppi_sl, \@modules,
\@version_strings);
}
}
}
}
}
}
};
## say 'Option 2: my $q = use_module( M::N )...';
#
# my $bi = use_module("Math::BigInt", 1.31)->new("1_234");
#
#PPI::Document
# PPI::Statement::Variable
# PPI::Token::Word 'my'
# PPI::Token::Whitespace ' '
# PPI::Token::Symbol '$bi'
# PPI::Token::Whitespace ' '
# PPI::Token::Operator '='
# PPI::Token::Whitespace ' '
# PPI::Token::Word 'use_module'
# PPI::Structure::List ( ... )
# PPI::Statement::Expression
# PPI::Token::Quote::Double '"Math::BigInt"'
# PPI::Token::Operator ','
# PPI::Token::Whitespace ' '
# PPI::Token::Number::Float '1.31'
# PPI::Token::Operator '->'
# PPI::Token::Word 'new'
# PPI::Structure::List ( ... )
# PPI::Statement::Expression
# PPI::Token::Quote::Double '"1_234"'
# PPI::Token::Structure ';'
# PPI::Token::Whitespace '\n'
try {
# let's extract all ppi_sv
my @chunks2 = @{$self->ppi_document->find('PPI::Statement::Variable')};
foreach my $chunk (@chunks2) {
# test for my
if (
$chunk->find(
sub {
$_[1]->isa('PPI::Token::Word')
and $_[1]->content =~ m{\A(?:my)\z};
}
)
)
{
# test for module-runtime key-words
if (
$chunk->find(
sub {
$_[1]->isa('PPI::Token::Word')
and $_[1]->content
=~ m{\A[Module::Runtime::]*(?:use_module|use_package_optimistically)\z};
}
)
)
{
for (0 .. $#{$chunk->{children}}) {
# find all ppi_sl
if ($chunk->{children}[$_]->isa('PPI::Structure::List')) {
my $ppi_sl = $chunk->{children}[$_]
if $chunk->{children}[$_]->isa('PPI::Structure::List');
print "Option 2: my \$q = use_module( M::N )...\n"
if $self->debug;
$self->_module_names_ppi_sl($ppi_sl, \@modules,
\@version_strings);
}
}
}
}
}
};
## say 'Option 3: $q = use_module( M::N )...';
#
# $bi = use_module("Math::BigInt", 1.31)->new("1_234");
#
#PPI::Document
# PPI::Statement
# PPI::Token::Symbol '$bi'
# PPI::Token::Whitespace ' '
# PPI::Token::Operator '='
# PPI::Token::Whitespace ' '
# PPI::Token::Word 'use_module'
# PPI::Structure::List ( ... )
# PPI::Statement::Expression
# PPI::Token::Quote::Double '"Math::BigInt"'
# PPI::Token::Operator ','
# PPI::Token::Whitespace ' '
# PPI::Token::Number::Float '1.31'
# PPI::Token::Operator '->'
# PPI::Token::Word 'new'
# PPI::Structure::List ( ... )
# PPI::Statement::Expression
# PPI::Token::Quote::Double '"1_234"'
# PPI::Token::Structure ';'
# PPI::Token::Whitespace '\n'
try {
my @chunks1 = @{$self->ppi_document->find('PPI::Statement')};
foreach my $chunk (@chunks1) {
# test for not my
if (
not $chunk->find(
sub {
$_[1]->isa('PPI::Token::Word')
and $_[1]->content =~ m{\A(?:my)\z};
}
)
)
{
if ($chunk->find(sub { $_[1]->isa('PPI::Token::Symbol') })) {
if (
$chunk->find(
sub {
$_[1]->isa('PPI::Token::Operator') and $_[1]->content eq '=';
}
)
)
{
# test for module-runtime key-words
if (
$chunk->find(
sub {
$_[1]->isa('PPI::Token::Word')
and $_[1]->content
=~ m{\A[Module::Runtime::]*(?:use_module|use_package_optimistically)\z};
}
)
)
{
for (0 .. $#{$chunk->{children}}) {
# find all ppi_sl
if ($chunk->{children}[$_]->isa('PPI::Structure::List')) {
my $ppi_sl = $chunk->{children}[$_]
if $chunk->{children}[$_]->isa('PPI::Structure::List');
print "Option 3: \$q = use_module( M::N )...\n"
if $self->debug;
$self->_module_names_ppi_sl($ppi_sl, \@modules,
\@version_strings);
}
}
}
}
}
}
}
};
## say 'Option 4: return use_module( M::N )...';
#
# return use_module(\'App::SCS::PageSet\')->new(
# base_dir => $self->share_dir->catdir(\'pages\'),
# plugin_config => $self->page_plugin_config,
# );
#
#PPI::Document
# PPI::Statement::Break
# PPI::Token::Word 'return'
# PPI::Token::Whitespace ' '
# PPI::Token::Word 'use_module'
# PPI::Structure::List ( ... )
# PPI::Statement::Expression
# PPI::Token::Quote::Single ''App::SCS::PageSet''
# PPI::Token::Operator '->'
# PPI::Token::Word 'new'
# PPI::Structure::List ( ... )
# PPI::Token::Whitespace '\n'
# PPI::Token::Whitespace ' '
# PPI::Statement::Expression
# PPI::Token::Word 'base_dir'
# PPI::Token::Whitespace ' '
# PPI::Token::Operator '=>'
# PPI::Token::Whitespace ' '
# PPI::Token::Symbol '$self'
# PPI::Token::Operator '->'
# PPI::Token::Word 'share_dir'
# PPI::Token::Operator '->'
# PPI::Token::Word 'catdir'
# PPI::Structure::List ( ... )
# PPI::Statement::Expression
# PPI::Token::Quote::Single ''pages''
# PPI::Token::Operator ','
# PPI::Token::Whitespace '\n'
# PPI::Token::Whitespace ' '
# PPI::Token::Word 'plugin_config'
# PPI::Token::Whitespace ' '
# PPI::Token::Operator '=>'
# PPI::Token::Whitespace ' '
# PPI::Token::Symbol '$self'
# PPI::Token::Operator '->'
# PPI::Token::Word 'page_plugin_config'
# PPI::Token::Operator ','
# PPI::Token::Whitespace '\n'
# PPI::Token::Whitespace ' '
# PPI::Token::Structure ';'
try {
my @chunks4 = @{$self->ppi_document->find('PPI::Statement::Break')};
for my $chunk (@chunks4) {
if (
$chunk->find(
sub {
$_[1]->isa('PPI::Token::Word')
and $_[1]->content =~ m{\A(?:return)\z};
}
)
( run in 0.443 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )