You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-02 16:44:46 +08:00
Better const key sorting
This commit is contained in:
@@ -44,7 +44,7 @@ maxint = sys.maxsize
|
||||
# children. For example, "call" has precedence 2 so we don't get
|
||||
# additional the additional parenthesis of: ".. op (call())". However
|
||||
# for call's children, it parameters, we set the the precedence high,
|
||||
# say to 100, to make sure we avoid additional prenthesis in
|
||||
# say to 100, to make sure we avoid additional parenthesis in
|
||||
# call((.. op ..)).
|
||||
|
||||
NO_PARENTHESIS_EVER = 100
|
||||
@@ -130,7 +130,7 @@ LINE_LENGTH = 80
|
||||
# Some parse trees created below are used for comparing code
|
||||
# fragments (like "return None" at the end of functions).
|
||||
|
||||
ASSIGN_DOC_STRING = lambda doc_string, doc_load: SyntaxTree(
|
||||
ASSIGN_DOC_STRING = lambda doc_string, doc_load: SyntaxTree( # noqa
|
||||
"assign",
|
||||
[
|
||||
SyntaxTree(
|
||||
@@ -247,12 +247,17 @@ TABLE_DIRECT = {
|
||||
"assert_expr_or": ("%c or %c", 0, 2),
|
||||
"assert_expr_and": ("%c and %c", 0, 2),
|
||||
|
||||
"assign": (
|
||||
"%|%c = %p\n",
|
||||
-1,
|
||||
(0, ("expr", "branch_op"), PRECEDENCE["tuple_list_starred"] + 1)
|
||||
),
|
||||
|
||||
"attribute": ("%c.%[1]{pattr}", (0, "expr")),
|
||||
|
||||
# This nonterminal we create on the fly in semantic routines
|
||||
"attribute_w_parens": ("(%c).%[1]{pattr}", (0, "expr")),
|
||||
|
||||
"assign": ("%|%c = %p\n", -1, (0, 200)),
|
||||
# The 2nd parameter should have a = suffix.
|
||||
# There is a rule with a 4th parameter "store"
|
||||
# which we don't use here.
|
||||
@@ -268,6 +273,15 @@ TABLE_DIRECT = {
|
||||
(0, -1, ", ", NO_PARENTHESIS_EVER)
|
||||
),
|
||||
|
||||
"call_stmt": ( "%|%p\n",
|
||||
# When a call statement contains only a named_expr (:=)
|
||||
# the named_expr should have parenthesis around it.
|
||||
(0, PRECEDENCE["named_expr"]-1)),
|
||||
|
||||
# "classdef": (), # handled by n_classdef()
|
||||
# A custom rule in n_function def distinguishes whether to call this or
|
||||
# function_def_async
|
||||
|
||||
"classdefdeco": ("\n\n%c", 0),
|
||||
"classdefdeco1": ("%|@%c\n%c", 0, 1),
|
||||
|
||||
@@ -283,20 +297,30 @@ TABLE_DIRECT = {
|
||||
|
||||
"continue": ("%|continue\n",),
|
||||
|
||||
# "classdef": (), # handled by n_classdef()
|
||||
# A custom rule in n_function def distinguishes whether to call this or
|
||||
# function_def_async
|
||||
|
||||
"delete_subscript": (
|
||||
"%|del %p[%c]\n",
|
||||
(0, "expr", PRECEDENCE["subscript"]),
|
||||
(1, "expr"),
|
||||
),
|
||||
"designList": ("%c = %c", 0, -1),
|
||||
"dict_comp_body": ("%c: %c", 1, 0),
|
||||
|
||||
"elifelifstmt": ("%|elif %c:\n%+%c%-%c", 0, 1, 3),
|
||||
"elifelsestmt": ("%|elif %c:\n%+%c%-%|else:\n%+%c%-", 0, 1, 3),
|
||||
"elifelsestmtr": ("%|elif %c:\n%+%c%-%|else:\n%+%c%-\n\n", 0, 1, 2),
|
||||
"elifelsestmtr2": (
|
||||
"%|elif %c:\n%+%c%-%|else:\n%+%c%-\n\n",
|
||||
0,
|
||||
1,
|
||||
3,
|
||||
), # has COME_FROM
|
||||
"elifstmt": ("%|elif %c:\n%+%c%-", 0, 1),
|
||||
|
||||
"except": ("%|except:\n%+%c%-", 3),
|
||||
"except_cond1": ("%|except %c:\n", 1),
|
||||
"except_cond2": ("%|except %c as %c:\n", (1, "expr"), (5, "store")),
|
||||
"except_suite": ("%+%c%-%C", 0, (1, maxint, "")),
|
||||
|
||||
# In Python 3.6+, this is more complicated in the presence of "returns"
|
||||
"except_suite_finalize": ("%+%c%-%C", 1, (3, maxint, "")),
|
||||
|
||||
@@ -332,15 +356,12 @@ TABLE_DIRECT = {
|
||||
-2,
|
||||
),
|
||||
|
||||
"function_def": ("\n\n%|def %c\n", -2), # -2 to handle closures
|
||||
"function_def_deco": ("\n\n%c", 0),
|
||||
|
||||
"gen_comp_body": ("%c", 0),
|
||||
"get_iter": ("iter(%c)", (0, "expr"),),
|
||||
|
||||
"set_comp_body": ("%c", 0),
|
||||
"gen_comp_body": ("%c", 0),
|
||||
"dict_comp_body": ("%c: %c", 1, 0),
|
||||
"designList": ("%c = %c", 0, -1),
|
||||
"ret_and": ("%c and %c", 0, 2),
|
||||
"or": ("%p or %p", (0, PRECEDENCE["or"]), (1, PRECEDENCE["or"])),
|
||||
"ret_or": ("%c or %c", 0, 2),
|
||||
"if_exp": ("%p if %c else %c", (2, "expr", 27), 0, 4),
|
||||
"if_exp_lambda": ("%p if %c else %c", (2, "expr", 27), (0, "expr"), 4),
|
||||
"if_exp_true": ("%p if 1 else %c", (0, "expr", 27), 2),
|
||||
@@ -353,28 +374,6 @@ TABLE_DIRECT = {
|
||||
),
|
||||
"if_exp_not_lambda": ("%p if not %c else %c", (2, "expr", 27), 0, 4),
|
||||
|
||||
"function_def": ("\n\n%|def %c\n", -2), # -2 to handle closures
|
||||
"function_def_deco": ("\n\n%c", 0),
|
||||
|
||||
# This is only generated by transform
|
||||
# it is a string at the beginning of a function that is *not* a docstring
|
||||
# 3.7 test_fstring.py tests for this kind of crap.
|
||||
# For compatibility with older Python, we'll use "%" instead of
|
||||
# a format string.
|
||||
"string_at_beginning": ('%|"%%s" %% %c\n', 0),
|
||||
"call_stmt": ( "%|%p\n",
|
||||
# When a call statement contains only a named_expr (:=)
|
||||
# the named_expr should have parenthesis around it.
|
||||
(0, PRECEDENCE["named_expr"]-1)),
|
||||
|
||||
"ifstmt": (
|
||||
"%|if %c:\n%+%c%-",
|
||||
0, # "testexpr" or "testexpr_then"
|
||||
1, # "_ifstmts_jump" or "return_stmts"
|
||||
),
|
||||
"iflaststmt": ("%|if %c:\n%+%c%-", 0, 1),
|
||||
"iflaststmtl": ("%|if %c:\n%+%c%-", 0, 1),
|
||||
"testtrue": ("not %p", (0, PRECEDENCE["unary_not"])),
|
||||
# Generally the args here are 0: (some sort of) "testexpr",
|
||||
# 1: (some sort of) "cstmts_opt",
|
||||
# 2 or 3: "else_suite"
|
||||
@@ -384,20 +383,21 @@ TABLE_DIRECT = {
|
||||
"ifelsestmt": ("%|if %c:\n%+%c%-%|else:\n%+%c%-", 0, 1, 3),
|
||||
"ifelsestmtc": ("%|if %c:\n%+%c%-%|else:\n%+%c%-", 0, 1, 3),
|
||||
"ifelsestmtl": ("%|if %c:\n%+%c%-%|else:\n%+%c%-", 0, 1, 3),
|
||||
# These are created only via transformation
|
||||
|
||||
# This is created only via transformation
|
||||
"ifelifstmt": ("%|if %c:\n%+%c%-%c", 0, 1, 3), # "testexpr" or "testexpr_then"
|
||||
"elifelifstmt": ("%|elif %c:\n%+%c%-%c", 0, 1, 3),
|
||||
"elifstmt": ("%|elif %c:\n%+%c%-", 0, 1),
|
||||
"elifelsestmt": ("%|elif %c:\n%+%c%-%|else:\n%+%c%-", 0, 1, 3),
|
||||
|
||||
"ifelsestmtr": ("%|if %c:\n%+%c%-%|else:\n%+%c%-", 0, 1, 2),
|
||||
"ifelsestmtr2": ("%|if %c:\n%+%c%-%|else:\n%+%c%-\n\n", 0, 1, 3), # has COME_FROM
|
||||
"elifelsestmtr": ("%|elif %c:\n%+%c%-%|else:\n%+%c%-\n\n", 0, 1, 2),
|
||||
"elifelsestmtr2": (
|
||||
"%|elif %c:\n%+%c%-%|else:\n%+%c%-\n\n",
|
||||
0,
|
||||
1,
|
||||
3,
|
||||
), # has COME_FROM
|
||||
"iflaststmt": ("%|if %c:\n%+%c%-", 0, 1),
|
||||
|
||||
"iflaststmtl": ("%|if %c:\n%+%c%-", 0, 1),
|
||||
|
||||
"ifstmt": (
|
||||
"%|if %c:\n%+%c%-",
|
||||
0, # "testexpr" or "testexpr_then"
|
||||
1, # "_ifstmts_jump" or "return_stmts"
|
||||
),
|
||||
|
||||
"import": ("%|import %c\n", 2),
|
||||
"importlist": ("%C", (0, maxint, ", ")),
|
||||
@@ -415,6 +415,7 @@ TABLE_DIRECT = {
|
||||
|
||||
"kv": ("%c: %c", 3, 1),
|
||||
"kv2": ("%c: %c", 1, 2),
|
||||
|
||||
"kwarg": ("%[0]{pattr}=%c", 1), # Change when Python 2 does LOAD_STR
|
||||
"kwargs": ("%D", (0, maxint, ", ")),
|
||||
"kwargs1": ("%D", (0, maxint, ", ")),
|
||||
@@ -436,6 +437,10 @@ TABLE_DIRECT = {
|
||||
# and this is added, as a transformation rule.
|
||||
"newline": ("\n"),
|
||||
|
||||
"or": ("%p or %p", (0, PRECEDENCE["or"]), (1, PRECEDENCE["or"])),
|
||||
|
||||
"pass": ("%|pass\n",),
|
||||
|
||||
"print_item": (", %c", 0),
|
||||
"print_items_nl_stmt": ("%|print %c%c\n", 0, 2),
|
||||
"print_items_stmt": ("%|print %c%c,\n", 0, 2), # Python 2 only
|
||||
@@ -445,16 +450,19 @@ TABLE_DIRECT = {
|
||||
"print_to_items": ("%C", (0, 2, ", ")),
|
||||
"print_to_nl": ("%|print >> %c, %c\n", 0, 1),
|
||||
|
||||
"pass": ("%|pass\n",),
|
||||
|
||||
"raise_stmt0": ("%|raise\n",),
|
||||
"raise_stmt1": ("%|raise %c\n", 0),
|
||||
"raise_stmt3": ("%|raise %c, %c, %c\n", 0, 1, 2),
|
||||
|
||||
"ret_and": ("%c and %c", 0, 2),
|
||||
"ret_or": ("%c or %c", 0, 2),
|
||||
|
||||
# Note: we have a custom rule, which calls when we don't
|
||||
# have "return None"
|
||||
"return": ( "%|return %c\n", 0),
|
||||
|
||||
"set_comp_body": ("%c", 0),
|
||||
|
||||
"set_iter": ( "%c", 0 ),
|
||||
|
||||
"return_if_stmt": ("return %c\n", 0),
|
||||
@@ -491,6 +499,13 @@ TABLE_DIRECT = {
|
||||
(0, "expr")
|
||||
),
|
||||
|
||||
# This is only generated by transform
|
||||
# it is a string at the beginning of a function that is *not* a docstring
|
||||
# 3.7 test_fstring.py tests for this kind of crap.
|
||||
# For compatibility with older Python, we'll use "%" instead of
|
||||
# a format string.
|
||||
"string_at_beginning": ('%|"%%s" %% %c\n', 0),
|
||||
|
||||
"subscript": (
|
||||
"%p[%p]",
|
||||
(0, "expr", PRECEDENCE["subscript"]),
|
||||
@@ -503,13 +518,16 @@ TABLE_DIRECT = {
|
||||
(1, "expr", NO_PARENTHESIS_EVER)
|
||||
),
|
||||
|
||||
"testtrue": ("not %p", (0, PRECEDENCE["unary_not"])),
|
||||
|
||||
# Note: this is generated generated by grammar rules but in this phase.
|
||||
"tf_try_except": ("%c%-%c%+", 1, 3),
|
||||
"tf_tryelsestmt": ("%c%-%c%|else:\n%+%c", 1, 3, 4),
|
||||
|
||||
"try_except": ("%|try:\n%+%c%-%c\n\n", 1, 3),
|
||||
"tryelsestmt": ("%|try:\n%+%c%-%c%|else:\n%+%c%-\n\n", 1, 3, 4),
|
||||
"tryelsestmtc": ("%|try:\n%+%c%-%c%|else:\n%+%c%-", 1, 3, 4),
|
||||
"tryelsestmtl": ("%|try:\n%+%c%-%c%|else:\n%+%c%-", 1, 3, 4),
|
||||
# Note: this is generated generated by grammar rules but in this phase.
|
||||
"tf_try_except": ("%c%-%c%+", 1, 3),
|
||||
"tf_tryelsestmt": ("%c%-%c%|else:\n%+%c", 1, 3, 4),
|
||||
"tryfinallystmt": ("%|try:\n%+%c%-%|finally:\n%+%c%-\n\n", 1, 5),
|
||||
|
||||
# unary_op (formerly "unary_expr") is the Python AST UnaryOp
|
||||
|
Reference in New Issue
Block a user