Babble
view release on metacpan or search on metacpan
lib/Babble/Plugin/CoreSignatures.pm view on Meta::CPAN
package Babble::Plugin::CoreSignatures;
use strictures 2;
use Moo;
sub extend_grammar { } # PPR::X can already parse everything we need
# .......bbbbbSSSSSSSa
# sub foo :Bar ($baz) {
# .......bSSSSSSSaaaaa
# sub foo ($baz) :Bar {
sub transform_to_signatures {
my ($self, $top) = @_;
my $tf = sub {
my $s = (my $m = shift)->submatches;
if ((my $after = $s->{after}->text) =~ /\S/) {
$s->{after}->replace_text('');
$s->{before}->replace_text($s->{before}->text.$after);
}
};
$self->_transform_signatures($top, $tf);
}
sub transform_to_oldsignatures {
my ($self, $top) = @_;
my $tf = sub {
my $s = (my $m = shift)->submatches;
if ((my $before = $s->{before}->text) =~ /\S/) {
$s->{before}->replace_text('');
$s->{after}->replace_text($before.$s->{after}->text);
}
};
$self->_transform_signatures($top, $tf);
}
sub transform_to_plain {
my ($self, $top) = @_;
$top->remove_use_argument(experimental => 'signatures');
$top->remove_use_argument('Mojo::Base' => '-signatures', 1);
my $tf = sub {
my $s = (my $m = shift)->submatches;
# shift attributes after first before we go hunting for :prototype
if ((my $before = $s->{before}->text) =~ /\S/) {
$s->{before}->replace_text('');
$s->{after}->replace_text($before.$s->{after}->text);
}
my $proto = '';
{
my $try = $s->{after};
local $try->{top_rule} = 'Attributes';
my $grammar = $m->grammar->clone;
$grammar->add_rule(Attribute =>
'(?&PerlOWS) :? (?&PerlOWS)
(?&PerlIdentifier)
(?: (?= \( ) (?&PPR_X_quotelike_body) )?+'
)->replace_rule(Attributes =>
'(?=(?&PerlOWS):)(?&PerlAttribute)
(?&PerlAttribute)*'
);
local $try->{grammar} = $grammar;
my $each; $each = sub {
my ($attr) = @_;
if ($attr->text =~ /prototype(\(.*?\))/) {
$proto = $1;
$attr->replace_text('');
$each = sub {
my ($attr) = @_;
$attr->transform_text(sub { s/^(\s*)/${1}:/ }) unless $attr->text =~ /^\s*:/;
$each = sub {};
};
}
};
$try->each_match_of(Attribute => sub { $each->(@_) });
undef($each);
}
s/\A\s*\(//, s/\)\s*\Z// for my $sig_orig = $s->{sig}->text;
my $grammar_re = $m->grammar_regexp;
my @sig_parts = grep defined($_),
$sig_orig =~ /((?&PerlAssignment)) ${grammar_re}/xg;
my (@sig_text, @defaults);
( run in 0.618 second using v1.01-cache-2.11-cpan-71847e10f99 )