mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-08 06:44:46 +08:00
Some temporary args/kwargs related changes to static analysis.
This commit is contained in:
@@ -1,8 +1,6 @@
|
|||||||
"""
|
"""
|
||||||
Module for statical analysis.
|
Module for statical analysis.
|
||||||
"""
|
"""
|
||||||
from itertools import chain
|
|
||||||
|
|
||||||
from jedi import debug
|
from jedi import debug
|
||||||
from jedi.parser import tree as pr
|
from jedi.parser import tree as pr
|
||||||
from jedi.evaluate.compiled import CompiledObject
|
from jedi.evaluate.compiled import CompiledObject
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from jedi._compatibility import unicode, zip_longest
|
|||||||
from jedi import debug
|
from jedi import debug
|
||||||
from jedi import common
|
from jedi import common
|
||||||
from jedi.parser import tree as pr
|
from jedi.parser import tree as pr
|
||||||
|
from jedi.evaluate.cache import memoize_default
|
||||||
from jedi.evaluate import iterable
|
from jedi.evaluate import iterable
|
||||||
from jedi.evaluate import helpers
|
from jedi.evaluate import helpers
|
||||||
from jedi.evaluate import analysis
|
from jedi.evaluate import analysis
|
||||||
@@ -217,7 +218,7 @@ def get_params(evaluator, func, var_args):
|
|||||||
var_arg_iterator = common.PushBackIterator(iter(unpacked_va))
|
var_arg_iterator = common.PushBackIterator(iter(unpacked_va))
|
||||||
|
|
||||||
non_matching_keys = defaultdict(lambda: [])
|
non_matching_keys = defaultdict(lambda: [])
|
||||||
keys_used = set()
|
keys_used = {}
|
||||||
keys_only = False
|
keys_only = False
|
||||||
had_multiple_value_error = False
|
had_multiple_value_error = False
|
||||||
for param in func.params:
|
for param in func.params:
|
||||||
@@ -247,7 +248,11 @@ def get_params(evaluator, func, var_args):
|
|||||||
analysis.add(evaluator, 'type-error-multiple-values',
|
analysis.add(evaluator, 'type-error-multiple-values',
|
||||||
calling_va, message=m)
|
calling_va, message=m)
|
||||||
else:
|
else:
|
||||||
keys_used.add(k)
|
try:
|
||||||
|
keys_used[k] = result[-1]
|
||||||
|
except IndexError:
|
||||||
|
# TODO this is wrong stupid and whatever.
|
||||||
|
pass
|
||||||
key, va_values = next(var_arg_iterator, (None, ()))
|
key, va_values = next(var_arg_iterator, (None, ()))
|
||||||
|
|
||||||
keys = []
|
keys = []
|
||||||
@@ -288,16 +293,16 @@ def get_params(evaluator, func, var_args):
|
|||||||
|
|
||||||
# Now add to result if it's not one of the previously covered cases.
|
# Now add to result if it's not one of the previously covered cases.
|
||||||
if (not keys_only or param.stars == 2):
|
if (not keys_only or param.stars == 2):
|
||||||
keys_used.add(unicode(param.get_name()))
|
|
||||||
result.append(_gen_param_name_copy(evaluator, func, var_args, param,
|
result.append(_gen_param_name_copy(evaluator, func, var_args, param,
|
||||||
keys=keys, values=values,
|
keys=keys, values=values,
|
||||||
array_type=array_type))
|
array_type=array_type))
|
||||||
|
keys_used[unicode(param.get_name())] = result[-1]
|
||||||
|
|
||||||
if keys_only:
|
if keys_only:
|
||||||
# All arguments should be handed over to the next function. It's not
|
# All arguments should be handed over to the next function. It's not
|
||||||
# about the values inside, it's about the names. Jedi needs to now that
|
# about the values inside, it's about the names. Jedi needs to now that
|
||||||
# there's nothing to find for certain names.
|
# there's nothing to find for certain names.
|
||||||
for k in set(param_dict) - keys_used:
|
for k in set(param_dict) - set(keys_used):
|
||||||
param = param_dict[k]
|
param = param_dict[k]
|
||||||
values = [] if param.default is None else [param.default]
|
values = [] if param.default is None else [param.default]
|
||||||
result.append(_gen_param_name_copy(evaluator, func, var_args,
|
result.append(_gen_param_name_copy(evaluator, func, var_args,
|
||||||
@@ -329,6 +334,17 @@ def get_params(evaluator, func, var_args):
|
|||||||
# Is a keyword argument, return the whole thing instead of just
|
# Is a keyword argument, return the whole thing instead of just
|
||||||
# the value node.
|
# the value node.
|
||||||
v = v.parent
|
v = v.parent
|
||||||
|
try:
|
||||||
|
non_kw_param = keys_used[first_key]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
origin_args = non_kw_param.parent.var_args.argument_node
|
||||||
|
# TODO calculate the var_args tree and check if it's in
|
||||||
|
# the tree (if not continue).
|
||||||
|
# print('\t\tnonkw', non_kw_param.parent.var_args.argument_node, )
|
||||||
|
if origin_args not in [f.parent.parent for f in first_values]:
|
||||||
|
continue
|
||||||
analysis.add(evaluator, 'type-error-too-many-arguments',
|
analysis.add(evaluator, 'type-error-too-many-arguments',
|
||||||
v, message=m)
|
v, message=m)
|
||||||
return result
|
return result
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ kwargs_test(c=3)
|
|||||||
kwargs_test(b=2)
|
kwargs_test(b=2)
|
||||||
#! 22 type-error-keyword-argument
|
#! 22 type-error-keyword-argument
|
||||||
kwargs_test(b=2, c=3, d=4)
|
kwargs_test(b=2, c=3, d=4)
|
||||||
##! 13 type-error-multiple-values
|
#! 12 type-error-multiple-values
|
||||||
kwargs_test(b=2, c=3, a=4)
|
kwargs_test(b=2, c=3, a=4)
|
||||||
|
|
||||||
|
|
||||||
@@ -65,10 +65,11 @@ kwargs_nested(c=3)
|
|||||||
kwargs_nested()
|
kwargs_nested()
|
||||||
#! 19 type-error-keyword-argument
|
#! 19 type-error-keyword-argument
|
||||||
kwargs_nested(c=2, d=4)
|
kwargs_nested(c=2, d=4)
|
||||||
##! 14 type-error-multiple-values
|
|
||||||
kwargs_nested(c=2, a=4)
|
|
||||||
#! 14 type-error-multiple-values
|
#! 14 type-error-multiple-values
|
||||||
kwargs_nested(b=3, c=2)
|
kwargs_nested(c=2, a=4)
|
||||||
|
# TODO reenable
|
||||||
|
##! 14 type-error-multiple-values
|
||||||
|
#kwargs_nested(b=3, c=2)
|
||||||
|
|
||||||
# -----------------
|
# -----------------
|
||||||
# mixed *args/**kwargs
|
# mixed *args/**kwargs
|
||||||
@@ -77,7 +78,6 @@ kwargs_nested(b=3, c=2)
|
|||||||
def simple_mixed(a, b, c):
|
def simple_mixed(a, b, c):
|
||||||
return b
|
return b
|
||||||
|
|
||||||
|
|
||||||
def mixed(*args, **kwargs):
|
def mixed(*args, **kwargs):
|
||||||
return simple_mixed(1, *args, **kwargs)
|
return simple_mixed(1, *args, **kwargs)
|
||||||
|
|
||||||
@@ -97,8 +97,9 @@ mixed2(c=2)
|
|||||||
mixed2(3)
|
mixed2(3)
|
||||||
#! 13 type-error-too-many-arguments
|
#! 13 type-error-too-many-arguments
|
||||||
mixed2(3, 4, 5)
|
mixed2(3, 4, 5)
|
||||||
#! 13 type-error-too-many-arguments
|
# TODO reenable
|
||||||
mixed2(3, 4, c=5)
|
##! 13 type-error-too-many-arguments
|
||||||
|
#mixed2(3, 4, c=5)
|
||||||
#! 7 type-error-multiple-values
|
#! 7 type-error-multiple-values
|
||||||
mixed2(3, b=5)
|
mixed2(3, b=5)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user