# PPos -- simply ignore the position and ->as_js the real contents.
# The position is stored in $CUR_POS -- that way PIL::PStmts can update
# $?POSITION accordingly.
{
package PIL::PPos;
use warnings;
use strict;
sub fixup {
die unless keys %{ $_[0] } == 3;
die unless $_[0]->{pPos}->isa("PIL::MkPos");
die if $_[0]->{pExp};
$_[0]->{pNode} = bless {} => "PIL::PNoop" if $_[0]->{pNode} eq "PNoop";
return bless {
pPos => $_[0]->{pPos}->fixup,
pExp => undef,
pNode => $_[0]->{pNode}->fixup,
} => "PIL::PPos";
}
sub as_js {
my $self = shift;
local $PIL::CUR_POS = $self->{pPos};
($self->{pNode}{CC} and die) or $self->{pNode}{CC} = $self->{CC} if $self->{CC};
no warnings "recursion";
return sprintf
"_24Main_3a_3a_3fPOSITION.BINDTO(new PIL2JS.Box.Constant(%s));\n%s",
PIL::doublequote($self->{pPos}), $self->{pNode}->as_js;
}
sub unwrap { $_[0]->{pNode}->unwrap }
}
{
package PIL::MkPos;
use warnings;
use strict;
use overload '""' => \&as_string;
sub fixup {
die unless keys %{ $_[0] } == 5;
return bless {%{ $_[0] }} => "PIL::MkPos";
}
sub as_string {
my ($file, $line_start, $column_start, $line_end, $column_end) =
@{ $_[0] }{qw< posName posBeginLine posBeginColumn posEndLine posEndColumn>};
return "$file line $line_start-$line_end, column $column_start-$column_end";
}
}
1;