X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/c86fb362329a2b980ed94200e0652f9c74d56bbd..f8617f975d56e81cfb4070ce65584f7b29a77e7a:/blib2to3/pgen2/tokenize.py diff --git a/blib2to3/pgen2/tokenize.py b/blib2to3/pgen2/tokenize.py index 9a7664b..43e1d59 100644 --- a/blib2to3/pgen2/tokenize.py +++ b/blib2to3/pgen2/tokenize.py @@ -31,6 +31,7 @@ __credits__ = \ import re from codecs import BOM_UTF8, lookup +from attr import dataclass from blib2to3.pgen2.token import * from . import token @@ -137,6 +138,10 @@ single_quoted = ( tabsize = 8 +@dataclass(frozen=True) +class TokenizerConfig: + async_is_reserved_keyword: bool = False + class TokenError(Exception): pass class StopTokenizing(Exception): pass @@ -334,7 +339,7 @@ def untokenize(iterable): ut = Untokenizer() return ut.untokenize(iterable) -def generate_tokens(readline): +def generate_tokens(readline, config: TokenizerConfig = TokenizerConfig()): """ The generate_tokens() generator requires one argument, readline, which must be a callable object which provides the same interface as the @@ -356,6 +361,9 @@ def generate_tokens(readline): contline = None indents = [0] + # If we know we're parsing 3.7+, we can unconditionally parse `async` and + # `await` as keywords. + async_is_reserved_keyword = config.async_is_reserved_keyword # 'stashed' and 'async_*' are used for async/await parsing stashed = None async_def = False @@ -506,7 +514,7 @@ def generate_tokens(readline): yield (STRING, token, spos, epos, line) elif initial.isidentifier(): # ordinary name if token in ('async', 'await'): - if async_def: + if async_is_reserved_keyword or async_def: yield (ASYNC if token == 'async' else AWAIT, token, spos, epos, line) continue @@ -516,13 +524,14 @@ def generate_tokens(readline): stashed = tok continue - if token == 'def': + if token in ('def', 'for'): if (stashed and stashed[0] == NAME and stashed[1] == 'async'): - async_def = True - async_def_indent = indents[-1] + if token == 'def': + async_def = True + async_def_indent = indents[-1] yield (ASYNC, stashed[1], stashed[2], stashed[3],