From d9c6b9907390ca73130df1d8253481505eb2bce7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C5=81ukasz=20Langa?= Date: Tue, 20 Mar 2018 18:05:20 -0700 Subject: [PATCH] Restore ability to format code with legacy usage of `async` as a name Fixes #20 Fixes #42 --- README.md | 4 ++ black.py | 5 +- blib2to3/Grammar.txt | 10 ++-- blib2to3/Grammar3.6.4.final.0.pickle | Bin 33148 -> 33114 bytes blib2to3/README | 2 + blib2to3/pgen2/token.py | 6 ++- blib2to3/pgen2/tokenize.py | 76 ++++++++++++++++++++++++++- 7 files changed, 91 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index a124429..1b83308 100644 --- a/README.md +++ b/README.md @@ -261,6 +261,10 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md). * added ability to pipe formatting from stdin to stdin (#25) +* restored ability to format code with legacy usage of `async` as + a name (#20, #42) + + ### 18.3a2 * changed positioning of binary operators to occur at beginning of lines diff --git a/black.py b/black.py index 6bfef50..74329d2 100644 --- a/black.py +++ b/black.py @@ -486,8 +486,7 @@ class Line: return ( (first_leaf.type == token.NAME and first_leaf.value == 'def') or ( - first_leaf.type == token.NAME - and first_leaf.value == 'async' + first_leaf.type == token.ASYNC and second_leaf is not None and second_leaf.type == token.NAME and second_leaf.value == 'def' @@ -816,7 +815,7 @@ class LineGenerator(Visitor[Line]): for child in children: yield from self.visit(child) - if child.type == token.NAME and child.value == 'async': # type: ignore + if child.type == token.ASYNC: break internal_stmt = next(children) diff --git a/blib2to3/Grammar.txt b/blib2to3/Grammar.txt index b19b4a2..4905c91 100644 --- a/blib2to3/Grammar.txt +++ b/blib2to3/Grammar.txt @@ -15,7 +15,7 @@ eval_input: testlist NEWLINE* ENDMARKER decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE decorators: decorator+ decorated: decorators (classdef | funcdef | async_funcdef) -async_funcdef: 'async' funcdef +async_funcdef: ASYNC funcdef funcdef: 'def' NAME parameters ['->' test] ':' suite parameters: '(' [typedargslist] ')' typedargslist: ((tfpdef ['=' test] ',')* @@ -66,7 +66,7 @@ exec_stmt: 'exec' expr ['in' test [',' test]] assert_stmt: 'assert' test [',' test] compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated | async_stmt -async_stmt: 'async' (funcdef | with_stmt | for_stmt) +async_stmt: ASYNC (funcdef | with_stmt | for_stmt) if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] while_stmt: 'while' test ':' suite ['else' ':' suite] for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] @@ -105,7 +105,7 @@ shift_expr: arith_expr (('<<'|'>>') arith_expr)* arith_expr: term (('+'|'-') term)* term: factor (('*'|'@'|'/'|'%'|'//') factor)* factor: ('+'|'-'|'~') factor | power -power: ['await'] atom trailer* ['**' factor] +power: [AWAIT] atom trailer* ['**' factor] atom: ('(' [yield_expr|testlist_gexp] ')' | '[' [listmaker] ']' | '{' [dictsetmaker] '}' | @@ -142,7 +142,7 @@ argument: ( test [comp_for] | star_expr ) comp_iter: comp_for | comp_if -comp_for: ['async'] 'for' exprlist 'in' or_test [comp_iter] +comp_for: [ASYNC] 'for' exprlist 'in' or_test [comp_iter] comp_if: 'if' old_test [comp_iter] # As noted above, testlist_safe extends the syntax allowed in list @@ -161,7 +161,7 @@ comp_if: 'if' old_test [comp_iter] # # See https://bugs.python.org/issue27494 old_comp_iter: old_comp_for | old_comp_if -old_comp_for: ['async'] 'for' exprlist 'in' testlist_safe [old_comp_iter] +old_comp_for: [ASYNC] 'for' exprlist 'in' testlist_safe [old_comp_iter] old_comp_if: 'if' old_test [old_comp_iter] testlist1: test (',' test)* diff --git a/blib2to3/Grammar3.6.4.final.0.pickle b/blib2to3/Grammar3.6.4.final.0.pickle index da228142c52b22d4e8d48b206b6741e972af18fd..4d1922bffc279845707eb71d7bd30ba0aa2ff81a 100644 GIT binary patch literal 33114 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 IX=$(j1z+1zoB#j- literal 33148 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 V_hCmuU$X4Sj)OtrfyKo={}+PRSQG#N diff --git a/blib2to3/README b/blib2to3/README index 9a9cf61..773aaf6 100644 --- a/blib2to3/README +++ b/blib2to3/README @@ -5,5 +5,7 @@ Reasons for forking: - consistent handling of f-strings for users of Python < 3.6.2 - backport of BPO-33064 that fixes parsing files with trailing commas after *args and **kwargs +- backport of GH-6143 that restores the ability to reformat legacy usage of + `async` - better ability to debug (better reprs for starters) - ability to Cythonize diff --git a/blib2to3/pgen2/token.py b/blib2to3/pgen2/token.py index 7599396..1a67955 100755 --- a/blib2to3/pgen2/token.py +++ b/blib2to3/pgen2/token.py @@ -62,8 +62,10 @@ OP = 52 COMMENT = 53 NL = 54 RARROW = 55 -ERRORTOKEN = 56 -N_TOKENS = 57 +AWAIT = 56 +ASYNC = 57 +ERRORTOKEN = 58 +N_TOKENS = 59 NT_OFFSET = 256 #--end constants-- diff --git a/blib2to3/pgen2/tokenize.py b/blib2to3/pgen2/tokenize.py index 14560e4..45afc5f 100644 --- a/blib2to3/pgen2/tokenize.py +++ b/blib2to3/pgen2/tokenize.py @@ -234,7 +234,7 @@ class Untokenizer: for tok in iterable: toknum, tokval = tok[:2] - if toknum in (NAME, NUMBER): + if toknum in (NAME, NUMBER, ASYNC, AWAIT): tokval += ' ' if toknum == INDENT: @@ -380,6 +380,12 @@ def generate_tokens(readline): contline = None indents = [0] + # 'stashed' and 'async_*' are used for async/await parsing + stashed = None + async_def = False + async_def_indent = 0 + async_def_nl = False + while 1: # loop over lines in stream try: line = readline() @@ -420,6 +426,10 @@ def generate_tokens(readline): pos = pos + 1 if pos == max: break + if stashed: + yield stashed + stashed = None + if line[pos] in '#\r\n': # skip comments or blank lines if line[pos] == '#': comment_token = line[pos:].rstrip('\r\n') @@ -443,8 +453,18 @@ def generate_tokens(readline): ("", lnum, pos, line)) indents = indents[:-1] + if async_def and async_def_indent >= indents[-1]: + async_def = False + async_def_nl = False + async_def_indent = 0 + yield (DEDENT, '', (lnum, pos), (lnum, pos), line) + if async_def and async_def_nl and async_def_indent >= indents[-1]: + async_def = False + async_def_nl = False + async_def_indent = 0 + else: # continued statement if not line: raise TokenError("EOF in multi-line statement", (lnum, 0)) @@ -464,10 +484,18 @@ def generate_tokens(readline): newline = NEWLINE if parenlev > 0: newline = NL + elif async_def: + async_def_nl = True + if stashed: + yield stashed + stashed = None yield (newline, token, spos, epos, line) elif initial == '#': assert not token.endswith("\n") + if stashed: + yield stashed + stashed = None yield (COMMENT, token, spos, epos, line) elif token in triple_quoted: endprog = endprogs[token] @@ -475,6 +503,9 @@ def generate_tokens(readline): if endmatch: # all on one line pos = endmatch.end(0) token = line[start:pos] + if stashed: + yield stashed + stashed = None yield (STRING, token, spos, (lnum, pos), line) else: strstart = (lnum, start) # multiple lines @@ -492,22 +523,63 @@ def generate_tokens(readline): contline = line break else: # ordinary string + if stashed: + yield stashed + stashed = None yield (STRING, token, spos, epos, line) elif initial in namechars: # ordinary name - yield (NAME, token, spos, epos, line) + if token in ('async', 'await'): + if async_def: + yield (ASYNC if token == 'async' else AWAIT, + token, spos, epos, line) + continue + + tok = (NAME, token, spos, epos, line) + if token == 'async' and not stashed: + stashed = tok + continue + + if token == 'def': + if (stashed + and stashed[0] == NAME + and stashed[1] == 'async'): + + async_def = True + async_def_indent = indents[-1] + + yield (ASYNC, stashed[1], + stashed[2], stashed[3], + stashed[4]) + stashed = None + + if stashed: + yield stashed + stashed = None + + yield tok elif initial == '\\': # continued stmt # This yield is new; needed for better idempotency: + if stashed: + yield stashed + stashed = None yield (NL, token, spos, (lnum, pos), line) continued = 1 else: if initial in '([{': parenlev = parenlev + 1 elif initial in ')]}': parenlev = parenlev - 1 + if stashed: + yield stashed + stashed = None yield (OP, token, spos, epos, line) else: yield (ERRORTOKEN, line[pos], (lnum, pos), (lnum, pos+1), line) pos = pos + 1 + if stashed: + yield stashed + stashed = None + for indent in indents[1:]: # pop remaining indent levels yield (DEDENT, '', (lnum, 0), (lnum, 0), '') yield (ENDMARKER, '', (lnum, 0), (lnum, 0), '') -- 2.39.5