You've already forked python-uncompyle6
mirror of
https://github.com/rocky/python-uncompyle6.git
synced 2025-08-03 08:49:51 +08:00
Merge pull request #257 from rocky/annotation-types-3.6
Annotation types 3.6
This commit is contained in:
@@ -135,6 +135,10 @@ def make_function3_annotate(self, node, is_lambda, nested=1,
|
||||
indent = ' ' * l
|
||||
line_number = self.line_number
|
||||
|
||||
if code_has_star_arg(code):
|
||||
self.write('*%s' % code.co_varnames[argc + kw_pairs])
|
||||
argc += 1
|
||||
|
||||
i = len(paramnames) - len(defparams)
|
||||
suffix = ''
|
||||
|
||||
@@ -144,7 +148,7 @@ def make_function3_annotate(self, node, is_lambda, nested=1,
|
||||
self.write(suffix, param)
|
||||
suffix = ', '
|
||||
if param in annotate_tuple[0].attr:
|
||||
p = annotate_tuple[0].attr.index(param) + pos_args
|
||||
p = annotate_tuple[0].attr.index(param)
|
||||
self.write(': ')
|
||||
self.preorder(node[p])
|
||||
if (line_number != self.line_number):
|
||||
@@ -183,17 +187,7 @@ def make_function3_annotate(self, node, is_lambda, nested=1,
|
||||
suffix = ', '
|
||||
|
||||
|
||||
if code_has_star_arg(code):
|
||||
star_arg = code.co_varnames[argc + kw_pairs]
|
||||
self.write(suffix, '*%s' % star_arg)
|
||||
if star_arg in annotate_tuple[0].attr:
|
||||
p = annotate_tuple[0].attr.index(star_arg) + pos_args + kw_args
|
||||
self.write(': ')
|
||||
self.preorder(node[p])
|
||||
argc += 1
|
||||
|
||||
# self.println(indent, '#flags:\t', int(code.co_flags))
|
||||
ends_in_comma = False
|
||||
if kw_args + annotate_argc > 0:
|
||||
if no_paramnames:
|
||||
if not code_has_star_arg(code):
|
||||
@@ -204,47 +198,49 @@ def make_function3_annotate(self, node, is_lambda, nested=1,
|
||||
pass
|
||||
else:
|
||||
self.write(", ")
|
||||
ends_in_comma = True
|
||||
|
||||
kwargs = node[1]
|
||||
last = len(kwargs)-1
|
||||
i = 0
|
||||
for n in node[1]:
|
||||
if n == 'kwarg':
|
||||
if argc > 0 and not ends_in_comma:
|
||||
self.write(', ')
|
||||
if (line_number != self.line_number):
|
||||
self.write("\n" + indent)
|
||||
line_number = self.line_number
|
||||
kn = n[0].attr
|
||||
if kn in annotate_tuple[0].attr:
|
||||
p = annotate_tuple[0].attr.index(star_arg) + pos_args + kw_args
|
||||
self.write('%s: ' % kn)
|
||||
self.preorder(node[p])
|
||||
self.write('=')
|
||||
else:
|
||||
self.write('%s=' % kn)
|
||||
self.preorder(n[1])
|
||||
if i < last:
|
||||
self.write(', ')
|
||||
ends_in_comma = True
|
||||
else:
|
||||
ends_in_comma = False
|
||||
i += 1
|
||||
kwargs = node[0]
|
||||
last = len(kwargs)-1
|
||||
i = 0
|
||||
for n in node[0]:
|
||||
if n == 'kwarg':
|
||||
if (line_number != self.line_number):
|
||||
self.write("\n" + indent)
|
||||
line_number = self.line_number
|
||||
self.write('%s=' % n[0].pattr)
|
||||
self.preorder(n[1])
|
||||
if i < last:
|
||||
self.write(', ')
|
||||
i += 1
|
||||
pass
|
||||
pass
|
||||
annotate_args = []
|
||||
for n in node:
|
||||
if n == 'annotate_arg':
|
||||
annotate_args.append(n[0])
|
||||
elif n == 'annotate_tuple':
|
||||
t = n[0].attr
|
||||
if t[-1] == 'return':
|
||||
t = t[0:-1]
|
||||
annotate_args = annotate_args[:-1]
|
||||
pass
|
||||
last = len(annotate_args) - 1
|
||||
for i in range(len(annotate_args)):
|
||||
self.write("%s: " % (t[i]))
|
||||
self.preorder(annotate_args[i])
|
||||
if i < last:
|
||||
self.write(', ')
|
||||
pass
|
||||
pass
|
||||
break
|
||||
pass
|
||||
pass
|
||||
pass
|
||||
|
||||
|
||||
if code_has_star_star_arg(code):
|
||||
if argc > 0 and not ends_in_comma:
|
||||
if argc > 0:
|
||||
self.write(', ')
|
||||
star_star_arg = code.co_varnames[argc + kw_pairs]
|
||||
self.write('**%s' % star_star_arg)
|
||||
if star_star_arg in annotate_tuple[0].attr:
|
||||
p = annotate_tuple[0].attr.index(star_star_arg) + pos_args + kw_args
|
||||
self.write(': ')
|
||||
self.preorder(node[p])
|
||||
self.write('**%s' % code.co_varnames[argc + kw_pairs])
|
||||
|
||||
if is_lambda:
|
||||
self.write(": ")
|
||||
@@ -480,7 +476,7 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
|
||||
|
||||
# Thank you, Python.
|
||||
|
||||
def build_param(ast, name, default, annotation=None):
|
||||
def build_param(ast, name, default):
|
||||
"""build parameters:
|
||||
- handle defaults
|
||||
- handle format tuple parameters
|
||||
@@ -490,10 +486,7 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
|
||||
else:
|
||||
value = self.traverse(default, indent='')
|
||||
maybe_show_tree_param_default(self.showast, name, value)
|
||||
if annotation:
|
||||
result = '%s: %s=%s' % (name, annotation, value)
|
||||
else:
|
||||
result = '%s=%s' % (name, value)
|
||||
result = '%s=%s' % (name, value)
|
||||
|
||||
# The below can probably be removed. This is probably
|
||||
# a holdover from days when LOAD_CONST erroneously
|
||||
@@ -688,30 +681,17 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
|
||||
params = []
|
||||
if defparams:
|
||||
for i, defparam in enumerate(defparams):
|
||||
params.append(build_param(ast, paramnames[i], defparam,
|
||||
annotate_dict.get(paramnames[i])))
|
||||
params.append(build_param(ast, paramnames[i], defparam))
|
||||
|
||||
for param in paramnames[i+1:]:
|
||||
if param in annotate_dict:
|
||||
params.append("%s: %s" % (param, annotate_dict[param]))
|
||||
else:
|
||||
params.append(param)
|
||||
params += paramnames[i+1:]
|
||||
else:
|
||||
for param in paramnames:
|
||||
if param in annotate_dict:
|
||||
params.append("%s: %s" % (param, annotate_dict[param]))
|
||||
else:
|
||||
params.append(param)
|
||||
params = paramnames
|
||||
|
||||
params.reverse() # back to correct order
|
||||
|
||||
if code_has_star_arg(code):
|
||||
if self.version > 3.0:
|
||||
star_arg = code.co_varnames[argc + kw_pairs]
|
||||
if star_arg in annotate_dict:
|
||||
params.append('*%s: %s' %(star_arg, annotate_dict[star_arg]))
|
||||
else:
|
||||
params.append('*%s' % star_arg)
|
||||
params.append('*%s' % code.co_varnames[argc + kw_pairs])
|
||||
else:
|
||||
params.append('*%s' % code.co_varnames[argc])
|
||||
argc += 1
|
||||
@@ -736,11 +716,14 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
|
||||
ast[-1] = ast_expr
|
||||
pass
|
||||
else:
|
||||
# FIXME: add annotations here
|
||||
self.write("(", ", ".join(params))
|
||||
# self.println(indent, '#flags:\t', int(code.co_flags))
|
||||
|
||||
kwonlyargcount = 0
|
||||
|
||||
ends_in_comma = False
|
||||
if kw_args > 0:
|
||||
if kw_args + annotate_argc > 0:
|
||||
if not (4 & code.co_flags):
|
||||
if argc > 0:
|
||||
self.write(", *, ")
|
||||
@@ -784,11 +767,11 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
|
||||
break
|
||||
elif self.version >= 3.6:
|
||||
# argc = node[-1].attr
|
||||
# co = node[-3].attr
|
||||
co = node[-3].attr
|
||||
# argcount = co.co_argcount
|
||||
# kwonlyargcount = co.co_kwonlyargcount
|
||||
kwcount = kwonlyargcount = co.co_kwonlyargcount
|
||||
|
||||
free_tup = annotate_dict = kw_dict = default_tup = None
|
||||
free_tup = ann_dict = kw_dict = default_tup = None
|
||||
fn_bits = node[-1].attr
|
||||
index = -4 # Skip over:
|
||||
# MAKE_FUNCTION,
|
||||
@@ -798,7 +781,7 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
|
||||
free_tup = node[index]
|
||||
index -= 1
|
||||
if fn_bits[-2]:
|
||||
annotate_dict = node[index]
|
||||
ann_dict = node[index]
|
||||
index -= 1
|
||||
if fn_bits[-3]:
|
||||
kw_dict = node[index]
|
||||
@@ -819,19 +802,39 @@ def make_function3(self, node, is_lambda, nested=1, code_node=None):
|
||||
# FIXME: possibly handle line breaks
|
||||
for i, n in enumerate(names):
|
||||
self.write(sep)
|
||||
self.write("%s=%s" % (n, defaults[i]))
|
||||
if annotate_dict and n in annotate_dict:
|
||||
self.write("%s: %s=%s" % (n, annotate_dict[n], defaults[i]))
|
||||
else:
|
||||
self.write("%s=%s" % (n, defaults[i]))
|
||||
sep = ', '
|
||||
ends_in_comma = False
|
||||
kwcount -= 1
|
||||
pass
|
||||
pass
|
||||
if ann_dict:
|
||||
annotate_args = ann_dict[0][-2].attr
|
||||
if annotate_args[-1] == 'return':
|
||||
annotate_args = annotate_args[:-1]
|
||||
|
||||
sep = ''
|
||||
if not ends_in_comma:
|
||||
sep = ', '
|
||||
for n in annotate_args:
|
||||
if kwcount == 0:
|
||||
break
|
||||
self.write(sep)
|
||||
self.write('%s: %s' %(n, annotate_dict[n]))
|
||||
sep = ', '
|
||||
ends_in_comma = False
|
||||
kwcount -= 1
|
||||
pass
|
||||
|
||||
if code_has_star_star_arg(code):
|
||||
if argc > 0 and not ends_in_comma:
|
||||
if not ends_in_comma:
|
||||
self.write(', ')
|
||||
star_star_arg = code.co_varnames[argc + kw_pairs]
|
||||
if annotate_dict and star_star_arg and star_star_arg in annotate_dict:
|
||||
self.write('**%s: %s' %(star_star_arg, annotate_dict[star_star_arg]))
|
||||
star_star_arg = code.co_varnames[argc + kwonlyargcount]
|
||||
if annotate_dict and star_star_arg in annotate_dict:
|
||||
self.write('**%s: %s' % (star_star_arg, annotate_dict[star_star_arg]))
|
||||
else:
|
||||
self.write('**%s' % star_star_arg)
|
||||
|
||||
|
Reference in New Issue
Block a user