Fix find_only_token_in_range with expression parentheses (#5645)
## Summary
Fix an oversight in `find_only_token_in_range` where the following code
would panic due do the closing and opening parentheses being in the
range we scan:
```python
d1 = [
("a") if # 1
("b") else # 2
("c")
]
```
Closing and opening parentheses respectively are now correctly skipped.
## Test Plan
I added a regression test
This commit is contained in:
@@ -31,3 +31,11 @@ c2 = (
|
||||
# 8
|
||||
"b" # 9
|
||||
)
|
||||
|
||||
# regression test: parentheses outside the expression ranges interfering with finding
|
||||
# the `if` and `else` token finding
|
||||
d1 = [
|
||||
("a") if # 1
|
||||
("b") else # 2
|
||||
("c")
|
||||
]
|
||||
|
||||
@@ -1215,11 +1215,15 @@ fn handle_expr_if_comment<'a>(
|
||||
CommentPlacement::Default(comment)
|
||||
}
|
||||
|
||||
/// Looks for a token in the range that contains no other tokens.
|
||||
/// Looks for a token in the range that contains no other tokens except for parentheses outside
|
||||
/// the expression ranges
|
||||
fn find_only_token_in_range(range: TextRange, locator: &Locator, token_kind: TokenKind) -> Token {
|
||||
let mut tokens = SimpleTokenizer::new(locator.contents(), range).skip_trivia();
|
||||
let mut tokens = SimpleTokenizer::new(locator.contents(), range)
|
||||
.skip_trivia()
|
||||
.skip_while(|token| token.kind == TokenKind::RParen);
|
||||
let token = tokens.next().expect("Expected a token");
|
||||
debug_assert_eq!(token.kind(), token_kind);
|
||||
let mut tokens = tokens.skip_while(|token| token.kind == TokenKind::LParen);
|
||||
debug_assert_eq!(tokens.next(), None);
|
||||
token
|
||||
}
|
||||
|
||||
@@ -37,6 +37,14 @@ c2 = (
|
||||
# 8
|
||||
"b" # 9
|
||||
)
|
||||
|
||||
# regression test: parentheses outside the expression ranges interfering with finding
|
||||
# the `if` and `else` token finding
|
||||
d1 = [
|
||||
("a") if # 1
|
||||
("b") else # 2
|
||||
("c")
|
||||
]
|
||||
```
|
||||
|
||||
## Output
|
||||
@@ -78,6 +86,16 @@ c2 = (
|
||||
# 8
|
||||
else "b" # 9
|
||||
)
|
||||
|
||||
# regression test: parentheses outside the expression ranges interfering with finding
|
||||
# the `if` and `else` token finding
|
||||
d1 = [
|
||||
("a")
|
||||
# 1
|
||||
if ("b")
|
||||
# 2
|
||||
else ("c")
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user