B-DeparseTree
view release on metacpan or search on metacpan
lib/B/DeparseTree/PPfns.pm view on Meta::CPAN
my $line = sprintf("\n# line %s '%s'", $op->line, $op->file);
$line .= sprintf(" 0x%x", $$op) if $self->{'opaddr'};
$opts->{'omit_next_semicolon'} = 1;
push @texts, $line;
}
if ($op->label) {
$fmt .= "%c\n";
push @args_spec, scalar(@args_spec);
push @texts, $op->label . ": " ;
}
my $node = $self->info_from_template($name, $op, $fmt,
\@args_spec, \@texts, $opts);
return $node;
}
sub deparse_binop_left {
my $self = shift;
my($op, $left, $prec) = @_;
if ($left{assoc_class($op)} && $left{assoc_class($left)}
and $left{assoc_class($op)} == $left{assoc_class($left)})
{
return $self->deparse($left, $prec - .00001, $op);
} else {
return $self->deparse($left, $prec, $op);
}
}
# Right associative operators, like '=', for which
# $a = $b = $c is equivalent to $a = ($b = $c)
BEGIN {
%right = ('pow' => 22,
'sassign=' => 7, 'aassign=' => 7,
'multiply=' => 7, 'i_multiply=' => 7,
'divide=' => 7, 'i_divide=' => 7,
'modulo=' => 7, 'i_modulo=' => 7,
'repeat=' => 7,
'add=' => 7, 'i_add=' => 7,
'subtract=' => 7, 'i_subtract=' => 7,
'concat=' => 7,
'left_shift=' => 7, 'right_shift=' => 7,
'bit_and=' => 7,
'bit_or=' => 7, 'bit_xor=' => 7,
'andassign' => 7,
'orassign' => 7,
);
}
sub deparse_format($$$)
{
my ($self, $form, $parent) = @_;
my @texts;
local($self->{'curcv'}) = $form;
local($self->{'curcvlex'});
local($self->{'in_format'}) = 1;
local(@$self{qw'curstash warnings hints hinthash'})
= @$self{qw'curstash warnings hints hinthash'};
my $op = $form->ROOT;
local $B::overlay = {};
$self->pessimise($op, $form->START);
my $info = {
op => $op,
parent => $parent,
cop => $self->{'curcop'}
};
$self->{optree}{$$op} = $info;
if ($op->first->name eq 'stub' || $op->first->name eq 'nextstate') {
my $info->{text} = "\f.";
return $info;
}
$op->{other_ops} = [$op->first];
$op = $op->first->first; # skip leavewrite, lineseq
my $kid;
while (not B::Deparse::null $op) {
push @{$op->{other_ops}}, $op;
$op = $op->sibling; # skip nextstate
my @body;
push @{$op->{other_ops}}, $op->first;
$kid = $op->first->sibling; # skip a pushmark
push @texts, "\f".$self->const_sv($kid)->PV;
push @{$op->{other_ops}}, $kid;
$kid = $kid->sibling;
for (; not B::Deparse::null $kid; $kid = $kid->sibling) {
push @body, $self->deparse($kid, -1, $op);
$body[-1] =~ s/;\z//;
}
push @texts, "\f".$self->combine2str("\n", \@body) if @body;
$op = $op->sibling;
}
$info->{text} = $self->combine2str(\@texts) . "\f.";
$info->{texts} = \@texts;
return $info;
}
sub dedup_func_parens($$)
{
my $self = shift;
my ($args_ref) = @_;
my @args = @$args_ref;
return (
scalar @args == 1 &&
substr($args[0]->{text}, 0, 1) eq '(' &&
substr($args[0]->{text}, 0, 1) eq ')');
}
sub dedup_parens_func($$$)
{
my $self = shift;
my $sub_info = shift;
my ($args_ref) = @_;
my @args = @$args_ref;
if (scalar @args == 1 && substr($args[0], 0, 1) eq '(' &&
substr($args[0], -1, 1) eq ')') {
return ($sub_info, $self->combine(', ', \@args), );
} else {
return ($sub_info, '(', $self->combine(', ', \@args), ')', );
( run in 0.524 second using v1.01-cache-2.11-cpan-39bf76dae61 )