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 6, 2024
1 parent 93d6cb2 commit 5435ef6
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 5435ef6

Please sign in to comment.