mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-06 22:14:27 +08:00
Fix names selection and params, fixes #1283
This commit is contained in:
@@ -172,7 +172,7 @@ def get_module_names(module, all_scopes):
|
||||
# parent_scope. There's None as a parent, because nodes in the module
|
||||
# node have the parent module and not suite as all the others.
|
||||
# Therefore it's important to catch that case.
|
||||
names = [n for n in names if get_parent_scope(n).parent in (module, None)]
|
||||
names = [n for n in names if get_parent_scope(n) == module]
|
||||
return names
|
||||
|
||||
|
||||
|
||||
@@ -527,8 +527,6 @@ def tree_name_to_contexts(evaluator, context, tree_name):
|
||||
# which means the function itself.
|
||||
filters = [next(filters)]
|
||||
return finder.find(filters, attribute_lookup=False)
|
||||
elif node.type == 'param':
|
||||
raise NotImplementedError
|
||||
elif node.type not in ('import_from', 'import_name'):
|
||||
context = evaluator.create_context(context, tree_name)
|
||||
return eval_atom(context, tree_name)
|
||||
@@ -571,6 +569,8 @@ def tree_name_to_contexts(evaluator, context, tree_name):
|
||||
# the static analysis report.
|
||||
exceptions = context.eval_node(tree_name.get_previous_sibling().get_previous_sibling())
|
||||
types = exceptions.execute_evaluated()
|
||||
elif node.type == 'param':
|
||||
types = NO_CONTEXTS
|
||||
else:
|
||||
raise ValueError("Should not happen. type: %s" % typ)
|
||||
return types
|
||||
|
||||
@@ -243,6 +243,9 @@ def get_parent_scope(node, include_flows=False):
|
||||
Returns the underlying scope.
|
||||
"""
|
||||
scope = node.parent
|
||||
if scope.type in ('funcdef', 'classdef') and scope.name == node:
|
||||
scope = scope.parent
|
||||
|
||||
while scope is not None:
|
||||
if include_flows and isinstance(scope, tree.Flow):
|
||||
return scope
|
||||
|
||||
@@ -101,3 +101,20 @@ def test_names_twice(environment):
|
||||
def test_simple_name(environment):
|
||||
defs = names('foo', references=True, environment=environment)
|
||||
assert not defs[0]._name.infer()
|
||||
|
||||
|
||||
def test_no_error(environment):
|
||||
code = dedent("""
|
||||
def foo(a, b):
|
||||
if a == 10:
|
||||
if b is None:
|
||||
print("foo")
|
||||
a = 20
|
||||
""")
|
||||
func_name, = names(code)
|
||||
print(func_name.defined_names())
|
||||
a, b, a20 = func_name.defined_names()
|
||||
assert a.name == 'a'
|
||||
assert b.name == 'b'
|
||||
assert a20.name == 'a'
|
||||
assert a20.goto_assignments() == [a20]
|
||||
|
||||
Reference in New Issue
Block a user