mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-12 22:59:30 +00:00
Raise syntax error for mixing except
and except*
(#14895)
This PR adds a syntax error if the parser encounters a `TryStmt` that has except clauses both with and without a star. The displayed error points to each except clause that contradicts the original except clause kind. So, for example, ```python try: .... except: #<-- we assume this is the desired except kind .... except*: #<--- error will point here .... except*: #<--- and here .... ``` Closes #14860
This commit is contained in:
parent
d4126f6049
commit
a3bb0cd5ec
3 changed files with 301 additions and 4 deletions
|
@ -1332,14 +1332,12 @@ impl<'src> Parser<'src> {
|
|||
self.bump(TokenKind::Try);
|
||||
self.expect(TokenKind::Colon);
|
||||
|
||||
let mut is_star = false;
|
||||
let mut is_star: Option<bool> = None;
|
||||
|
||||
let try_body = self.parse_body(Clause::Try);
|
||||
|
||||
let has_except = self.at(TokenKind::Except);
|
||||
|
||||
// TODO(dhruvmanila): Raise syntax error if there are both 'except' and 'except*'
|
||||
// on the same 'try'
|
||||
// test_err try_stmt_mixed_except_kind
|
||||
// try:
|
||||
// pass
|
||||
|
@ -1353,11 +1351,36 @@ impl<'src> Parser<'src> {
|
|||
// pass
|
||||
// except:
|
||||
// pass
|
||||
// try:
|
||||
// pass
|
||||
// except:
|
||||
// pass
|
||||
// except:
|
||||
// pass
|
||||
// except* ExceptionGroup:
|
||||
// pass
|
||||
// except* ExceptionGroup:
|
||||
// pass
|
||||
let mut mixed_except_ranges = Vec::new();
|
||||
let handlers = self.parse_clauses(Clause::Except, |p| {
|
||||
let (handler, kind) = p.parse_except_clause();
|
||||
is_star |= kind.is_star();
|
||||
if is_star.is_none() {
|
||||
is_star = Some(kind.is_star());
|
||||
} else if is_star != Some(kind.is_star()) {
|
||||
mixed_except_ranges.push(handler.range());
|
||||
}
|
||||
handler
|
||||
});
|
||||
// Empty handler has `is_star` false.
|
||||
let is_star = is_star.unwrap_or_default();
|
||||
for handler_err_range in mixed_except_ranges {
|
||||
self.add_error(
|
||||
ParseErrorType::OtherError(
|
||||
"Cannot have both 'except' and 'except*' on the same 'try'".to_string(),
|
||||
),
|
||||
handler_err_range,
|
||||
);
|
||||
}
|
||||
|
||||
// test_err try_stmt_misspelled_except
|
||||
// try:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue