3.8 needs call_stmt -> call

Simplify/regularize how "return" works
This commit is contained in:
rocky
2020-05-18 22:26:18 -04:00
parent 3fb8d90407
commit d7c3b8454b
4 changed files with 15 additions and 6 deletions

View File

@@ -47,8 +47,9 @@ class Python38Parser(Python37Parser):
stmt ::= try_except38 stmt ::= try_except38
stmt ::= whilestmt38 stmt ::= whilestmt38
stmt ::= whileTruestmt38 stmt ::= whileTruestmt38
stmt ::= call stmt ::= call_stmt
call_stmt ::= call
break ::= POP_BLOCK BREAK_LOOP break ::= POP_BLOCK BREAK_LOOP
break ::= POP_BLOCK POP_TOP BREAK_LOOP break ::= POP_BLOCK POP_TOP BREAK_LOOP
break ::= POP_TOP BREAK_LOOP break ::= POP_TOP BREAK_LOOP

View File

@@ -339,7 +339,11 @@ TABLE_DIRECT = {
"raise_stmt1": ("%|raise %c\n", 0), "raise_stmt1": ("%|raise %c\n", 0),
"raise_stmt3": ("%|raise %c, %c, %c\n", 0, 1, 2), "raise_stmt3": ("%|raise %c, %c, %c\n", 0, 1, 2),
# "yield": ( "yield %c", 0), # "yield": ( "yield %c", 0),
# "return": ( "%|return %c\n", 0),
# Note: we have a custom rule, which calls when we don't
# have "return None"
"return": ( "%|return %c\n", 0),
"return_if_stmt": ("return %c\n", 0), "return_if_stmt": ("return %c\n", 0),
"ifstmt": ( "ifstmt": (
"%|if %c:\n%+%c%-", "%|if %c:\n%+%c%-",

View File

@@ -46,6 +46,10 @@ def customize_for_version38(self, version):
(0, 'expr'), (6, 'store'), (0, 'expr'), (6, 'store'),
(7, 'suite_stmts') ), (7, 'suite_stmts') ),
"call_stmt": (
"%|%c\n", 0
),
'except_handler38': ( 'except_handler38': (
'%c', (2, 'except_stmts') ), '%c', (2, 'except_stmts') ),

View File

@@ -510,14 +510,14 @@ class SourceWalker(GenericASTTraversal, object):
self.preorder(node[0]) self.preorder(node[0])
self.prune() self.prune()
else: else:
self.write(self.indent, "return")
# One reason we worry over whether we use "return None" or "return" # One reason we worry over whether we use "return None" or "return"
# is that inside a generator, "return None" is illegal. # is that inside a generator, "return None" is illegal.
# Thank you, Python! # Thank you, Python!
if self.return_none or not self.is_return_none(node): if self.return_none or not self.is_return_none(node):
self.write(" ") self.default(node)
self.preorder(node[0]) else:
self.println() self.template_engine(("return\n"), node)
self.prune() # stop recursing self.prune() # stop recursing
def n_return_if_stmt(self, node): def n_return_if_stmt(self, node):