From 9a713bc36f0a952ca9c822a7c2b90f54c97c9592 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Fri, 31 May 2019 00:21:35 +0200 Subject: [PATCH] Fix create_context for param default arguments/annotations --- jedi/api/__init__.py | 3 +-- jedi/evaluate/__init__.py | 10 ++++++---- jedi/evaluate/dynamic.py | 3 ++- test/completion/dynamic_params.py | 9 +++++++++ 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 615d2248..b77d35c9 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -499,9 +499,8 @@ def names(source=None, path=None, encoding='utf-8', all_scopes=False, cls = ParamName else: cls = TreeNameDefinition - is_module = name.parent.type == 'file_input' return cls( - module_context.create_context(name if is_module else name.parent), + module_context.create_context(name), name ) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 34c4a03a..7e29f910 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -461,11 +461,13 @@ class Evaluator(object): if node_is_context and parser_utils.is_scope(node): scope_node = node else: - if node.parent.type in ('funcdef', 'classdef') and node.parent.name == node: - # When we're on class/function names/leafs that define the - # object itself and not its contents. - node = node.parent scope_node = parent_scope(node) + if scope_node.type in ('funcdef', 'classdef'): + colon = scope_node.children[scope_node.children.index(':')] + if node.start_pos < colon.start_pos: + parent = node.parent + if not (parent.type == 'param' and parent.name == node): + scope_node = parent_scope(scope_node) return from_scope_node(scope_node, is_nested=True, node_is_object=node_is_object) def parse_and_get_code(self, code=None, path=None, encoding='utf-8', diff --git a/jedi/evaluate/dynamic.py b/jedi/evaluate/dynamic.py index 6b10014c..1f48968a 100644 --- a/jedi/evaluate/dynamic.py +++ b/jedi/evaluate/dynamic.py @@ -102,7 +102,8 @@ def search_params(evaluator, execution_context, funcdef): function_execution.get_executed_params_and_issues()[0] for function_execution in function_executions )) - params = [DynamicExecutedParams(evaluator, executed_params) for executed_params in zipped_params] + params = [DynamicExecutedParams(evaluator, executed_params) + for executed_params in zipped_params] # Evaluate the ExecutedParams to types. else: return create_default_params(execution_context, funcdef) diff --git a/test/completion/dynamic_params.py b/test/completion/dynamic_params.py index 6d513f44..1a48468a 100644 --- a/test/completion/dynamic_params.py +++ b/test/completion/dynamic_params.py @@ -122,6 +122,15 @@ A(3).test(2.0) A(3).test2() +def from_class(x): + #? + x + +from UNDEFINED import from_class + +class Foo(from_class(1),): + pass + # ----------------- # comprehensions # -----------------