Skip to content

Commit

Permalink
Include radix base prefix in large number representation
Browse files Browse the repository at this point in the history
  • Loading branch information
charliermarsh committed Sep 28, 2023
1 parent 316f759 commit fc3f47b
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 6 deletions.
10 changes: 7 additions & 3 deletions crates/ruff_python_ast/src/int.rs
Expand Up @@ -41,15 +41,19 @@ impl Int {
}

/// Parse an [`Int`] from a string with a given radix.
pub fn from_str_radix(s: &str, radix: u32) -> Result<Self, std::num::ParseIntError> {
match i64::from_str_radix(s, radix) {
pub fn from_str_radix(
src: &str,
radix: u32,
token: &str,
) -> Result<Self, std::num::ParseIntError> {
match i64::from_str_radix(src, radix) {
Ok(value) => Ok(Int::small(value)),
Err(err) => {
if matches!(
err.kind(),
std::num::IntErrorKind::PosOverflow | std::num::IntErrorKind::NegOverflow
) {
Ok(Int::big(s))
Ok(Int::big(token))
} else {
Err(err)
}
Expand Down
9 changes: 7 additions & 2 deletions crates/ruff_python_parser/src/lexer.rs
Expand Up @@ -261,10 +261,14 @@ impl<'source> Lexer<'source> {
'x' | 'o' | 'b'
));

// Lex the portion of the token after the base prefix (e.g., `9D5` in `0x9D5`).
let mut number = LexedText::new(self.offset(), self.source);
self.radix_run(&mut number, radix);

let value = match Int::from_str_radix(number.as_str(), radix.as_u32()) {
// Extract the entire number, including the base prefix (e.g., `0x9D5`).
let token = &self.source[self.token_range()];

let value = match Int::from_str_radix(number.as_str(), radix.as_u32(), token) {
Ok(int) => int,
Err(err) => {
return Err(LexicalError {
Expand Down Expand Up @@ -1462,7 +1466,8 @@ def f(arg=%timeit a = b):

#[test]
fn test_numbers() {
let source = "0x2f 0o12 0b1101 0 123 123_45_67_890 0.2 1e+2 2.1e3 2j 2.2j 000";
let source =
"0x2f 0o12 0b1101 0 123 123_45_67_890 0.2 1e+2 2.1e3 2j 2.2j 000 0x995DC9BBDF1939FA";
assert_debug_snapshot!(lex_source(source));
}

Expand Down
Expand Up @@ -77,8 +77,14 @@ expression: lex_source(source)
},
60..63,
),
(
Int {
value: 0x995DC9BBDF1939FA,
},
64..82,
),
(
Newline,
63..63,
82..82,
),
]

0 comments on commit fc3f47b

Please sign in to comment.