From f355c04cae5e432e67a97779b67b6c1b6eb9177e Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sat, 3 Dec 2016 13:37:51 +0100 Subject: [PATCH] Finally fixed all black box tests in python 2. --- jedi/evaluate/__init__.py | 17 ++++++++++++++++- jedi/evaluate/compiled/fake.py | 10 +++++++++- jedi/evaluate/compiled/fake/_weakref.pym | 3 ++- test/completion/dynamic_params.py | 2 +- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index e51eb769..68e68701 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -540,6 +540,21 @@ class Evaluator(object): return element def create_context(self, base_context, node): + def parent_scope(node): + while True: + node = node.parent + + if node.is_scope(): + return node + elif node.type in ('argument', 'testlist_comp'): + if node.children[1].type == 'comp_for': + return node.children[1] + elif node.type == 'dictorsetmaker': + for n in node.children[1:4]: + # In dictionaries it can be pretty much anything. + if node.children[1].type == 'comp_for': + return node + def from_scope_node(scope_node, child_is_funcdef=None): if scope_node == base_node: return base_context @@ -573,5 +588,5 @@ class Evaluator(object): if node.is_scope(): scope_node = node else: - scope_node = node.get_parent_scope() + scope_node = parent_scope(node) return from_scope_node(scope_node) diff --git a/jedi/evaluate/compiled/fake.py b/jedi/evaluate/compiled/fake.py index 4441efb5..37c9ced1 100644 --- a/jedi/evaluate/compiled/fake.py +++ b/jedi/evaluate/compiled/fake.py @@ -77,7 +77,7 @@ def _load_faked_module(module): def _search_scope(scope, obj_name): for s in scope.subscopes: - if str(s.name) == obj_name: + if s.name.value == obj_name: return s @@ -191,6 +191,14 @@ def _get_faked(module, obj, name=None): def get_faked(evaluator, module, obj, name=None, parent_context=None): + if parent_context and parent_context.classdef is not None: + # Try to search in already clearly defined stuff. + found = _search_scope(parent_context.classdef, name) + if found is not None: + return found + else: + raise FakeDoesNotExist + faked, fake_module = _get_faked(module and module.obj, obj, name) if module is not None: module.used_names = fake_module.used_names diff --git a/jedi/evaluate/compiled/fake/_weakref.pym b/jedi/evaluate/compiled/fake/_weakref.pym index 8d21a2c4..298d0b0d 100644 --- a/jedi/evaluate/compiled/fake/_weakref.pym +++ b/jedi/evaluate/compiled/fake/_weakref.pym @@ -1,8 +1,9 @@ def proxy(object, callback=None): return object -class weakref(): +class ref(): def __init__(self, object, callback=None): self.__object = object + def __call__(self): return self.__object diff --git a/test/completion/dynamic_params.py b/test/completion/dynamic_params.py index f9de0286..8af1730c 100644 --- a/test/completion/dynamic_params.py +++ b/test/completion/dynamic_params.py @@ -123,7 +123,7 @@ A(3).test2() # ----------------- -# list comprehensions +# comprehensions # ----------------- def from_comprehension(foo):