Python: Fix some more async parsing problems

Turns out we were not setting the `is_async` field on anything except
`async for` statements. This commit makes it so that we also do this for
`async def` and `async with`, and adds a test that this produces the
same behaviour as the old parser.
This commit is contained in:
Taus
2024-10-25 20:25:15 +00:00
parent e710c0a6bf
commit b4ecc7937d
2 changed files with 26 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
async def foo():
await bar() + await baz()
async with foo() as bar, baz() as quux:
pass
async for spam in eggs:
pass

View File

@@ -2650,6 +2650,14 @@
let @with.first = @first.node
}
; Async status
; NOTE: We only set the `is_async` field on the _first_ clause of the `with` statement,
; as this is the behaviour of the old parser.
(with_statement "async" "with" @with_keyword (with_clause . (with_item) @with))
{
attr (@with.node) is_async = #true
}
(with_item
value: (_) @value
) @with
@@ -3253,6 +3261,16 @@
}
}
; Async status
(function_definition "async" "def" @def_keyword) @funcdef
{
let start = (location-start @def_keyword)
attr (@funcdef.function) is_async = #true
attr (@funcdef.node) _location_start = start
attr (@funcdef.function) _location_start = start
attr (@funcdef.funcexpr) _location_start = start
}
;;; Decorators
(decorated_definition