Merge pull request #4417 from harupy/add-with-offset-methods

Add `with_col_offset` and `with_row_offset` to `Location` for conveniece
This commit is contained in:
Jeong YunWon 2023-01-04 17:07:31 +09:00 committed by GitHub
commit 958c7e33ad
3 changed files with 43 additions and 7 deletions

View file

@ -58,6 +58,34 @@ impl Location {
self.row += 1;
self.column = 0;
}
pub fn with_col_offset<T: TryInto<isize>>(&self, offset: T) -> Self
where
<T as TryInto<isize>>::Error: std::fmt::Debug,
{
let column = (self.column as isize
+ offset
.try_into()
.expect("offset should be able to convert to isize")) as u32;
Self {
row: self.row,
column,
}
}
pub fn with_row_offset<T: TryInto<isize>>(&self, offset: T) -> Self
where
<T as TryInto<isize>>::Error: std::fmt::Debug,
{
let row = (self.row as isize
+ offset
.try_into()
.expect("offset should be able to convert to isize")) as u32;
Self {
row,
column: self.column,
}
}
}
#[cfg(test)]
@ -77,4 +105,16 @@ mod tests {
assert!(Location::new(1, 1) < Location::new(2, 1));
assert!(Location::new(1, 2) < Location::new(2, 1));
}
#[test]
fn test_with_col_offset() {
assert_eq!(Location::new(1, 1).with_col_offset(1), Location::new(1, 2));
assert_eq!(Location::new(1, 1).with_col_offset(-1), Location::new(1, 0));
}
#[test]
fn test_with_row_offset() {
assert_eq!(Location::new(1, 1).with_row_offset(1), Location::new(2, 1));
assert_eq!(Location::new(1, 1).with_row_offset(-1), Location::new(0, 1));
}
}

View file

@ -213,7 +213,7 @@ pub(crate) fn parse_error_from_lalrpop(
let expected = (expected.len() == 1).then(|| expected[0].clone());
ParseError {
error: ParseErrorType::UnrecognizedToken(token.1, expected),
location: Location::new(token.0.row(), token.0.column() + 1),
location: token.0.with_col_offset(1),
source_path,
}
}

View file

@ -32,7 +32,7 @@ impl<'a> StringParser<'a> {
kind,
str_start,
str_end,
location: Location::new(str_start.row(), str_start.column() + offset),
location: str_start.with_col_offset(offset),
}
}
@ -519,11 +519,7 @@ impl<'a> StringParser<'a> {
fn parse_fstring_expr(source: &str, location: Location) -> Result<Expr, ParseError> {
let fstring_body = format!("({source})");
parse_expression_located(
&fstring_body,
"<fstring>",
Location::new(location.row(), location.column() - 1),
)
parse_expression_located(&fstring_body, "<fstring>", location.with_col_offset(-1))
}
pub fn parse_string(