Skip to content

Commit

Permalink
Add support for new octal number syntax
Browse files Browse the repository at this point in the history
since v5.34 Perl also supports octal number in form 0o0
  • Loading branch information
happy-barney committed Feb 18, 2024
1 parent 1c3c2e3 commit fad776e
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
3 changes: 3 additions & 0 deletions lib/PPI/Token/Number.pm
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ sub __TOKENIZER__on_char {
} elsif ( $char eq 'b' || $char eq 'B' ) {
$t->{class} = $t->{token}->set_class( 'Number::Binary' );
return 1;
} elsif ( $char eq 'o' || $char eq 'O' ) {
$t->{class} = $t->{token}->set_class( 'Number::Octal' );
return 1;
} elsif ( $char =~ /\d/ ) {
# You cannot have 8s and 9s on octals
if ( $char eq '8' or $char eq '9' ) {
Expand Down
2 changes: 2 additions & 0 deletions lib/PPI/Token/Number/Octal.pm
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ sub literal {
my $self = shift;
return if $self->{_error};
my $str = $self->_literal;
# oct supports '0o' notation only since 5.34
$str =~ s (^0[oO]) (0);
my $neg = $str =~ s/^\-//;
my $val = oct $str;
return $neg ? -$val : $val;
Expand Down
20 changes: 19 additions & 1 deletion t/07_token.t
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ sub dies_on_incomplete_bx { $] >= 5.031002 }
use if !(-e 'META.yml'), "Test::InDistDir";
use lib 't/lib';
use PPI::Test::pragmas;
use Test::More tests => 588 + (warns_on_misplaced_underscore() ? 2 : 0 ) + ($ENV{AUTHOR_TESTING} ? 1 : 0);
use Test::More tests => 594 + (warns_on_misplaced_underscore() ? 2 : 0 ) + ($ENV{AUTHOR_TESTING} ? 1 : 0);

use File::Spec::Functions qw( catdir );
use PPI ();
Expand Down Expand Up @@ -212,3 +212,21 @@ HEX: {
is($token->literal, $test->{value}, "literal('$code') is $test->{value}");
}
}

OCTAL: {
my @tests = (
{ code => '0o10', parsed => '0o10', value => 8 },
{ code => '0O10', parsed => '0O10', value => 8 },
);

foreach my $test ( @tests ) {
my $code = $test->{code};
my $T = PPI::Tokenizer->new( \$code );
my $token = $T->get_token;

isa_ok($token, 'PPI::Token::Number::Octal');
is($token->content, $test->{parsed}, "correctly parsed everything expected");
is($token->literal, $test->{value}, "literal('$code') is $test->{value}");
}
}

0 comments on commit fad776e

Please sign in to comment.