From 28ab937ecaba980ab033eb00d39108b6571fad67 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sat, 11 Jan 2014 02:55:50 +0100 Subject: [PATCH] in the process... --- jedi/evaluate/__init__.py | 1 + jedi/evaluate/compiled/__init__.py | 11 ++++++----- jedi/evaluate/compiled/fake.py | 10 +++++++--- jedi/evaluate/representation.py | 7 +++++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index bee22970..0c67c28f 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -411,6 +411,7 @@ class Evaluator(object): debug.warning("no __call__ func available", obj) else: debug.warning("no execution possible", obj) + raise NotImplementedError() else: stmts = er.FunctionExecution(self, obj, params).get_return_types(evaluate_generator) diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index 390716e2..3c7e0fcf 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -34,7 +34,7 @@ class PyObject(Base): def get_parent_until(self, *args, **kwargs): # compiled modules only use functions and classes/methods (2 levels) - return getattr(self.parent, 'parent', self.parent) or self + return getattr(self.parent, 'parent', self.parent) or self.parent or self @underscore_memoization def _parse_function_doc(self): @@ -74,7 +74,8 @@ class PyObject(Base): def get_subscope_by_name(self, name): if name in dir(self._cls().obj): - return PyName(self._cls, name).parent + print PyName(self._cls(), name).parent + return PyName(self._cls(), name).parent else: raise KeyError("CompiledObject doesn't have an attribute '%s'." % name) @@ -116,14 +117,14 @@ class PyName(object): @underscore_memoization def parent(self): try: - # this has a builtin_function_or_method - return create(getattr(self._obj.obj, self._name), self._obj, - module=self._obj.get_parent_until()) + o = getattr(self._obj.obj, self._name) except AttributeError: # happens e.g. in properties of # PyQt4.QtGui.QStyleOptionComboBox.currentText # -> just set it to None return PyObject(None, builtin) + else: + return create(o, self._obj, module=self._obj.get_parent_until()) @property def names(self): diff --git a/jedi/evaluate/compiled/fake.py b/jedi/evaluate/compiled/fake.py index 61504159..2956d2f9 100644 --- a/jedi/evaluate/compiled/fake.py +++ b/jedi/evaluate/compiled/fake.py @@ -75,7 +75,7 @@ def _load_module(module): with open(os.path.join(path, 'fake', module_name) + '.pym') as f: source = f.read() except IOError: - return {} + return module = Parser(source, module_name).module modules[module_name] = module return module @@ -88,6 +88,8 @@ def get_faked(module, obj): return s mod = _load_module(module) + if mod is None: + return # Having the module as a `parser.representation.module`, we need to scan # for methods. @@ -97,8 +99,10 @@ def get_faked(module, obj): return from_scope(mod, obj) elif not inspect.isclass(obj): # object is a method or descriptor - cls = obj.__objclass__ - return from_scope(from_scope(mod, cls), obj) + cls = from_scope(mod, obj.__objclass__) + if cls is None: + return + return from_scope(cls, obj) def is_class_instance(obj): diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index 79916736..1c60a97d 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -122,6 +122,7 @@ class Instance(use_metaclass(CachedMetaClass, Executable)): def get_subscope_by_name(self, name): sub = self.base.get_subscope_by_name(name) + print sub return InstanceElement(self._evaluator, self, sub, True) def execute_subscope_by_name(self, name, args=()): @@ -199,11 +200,13 @@ class InstanceElement(use_metaclass(CachedMetaClass, pr.Base)): def parent(self): par = self.var.parent if isinstance(par, Class) and par == self.instance.base \ - or isinstance(par, pr.Class) \ + or isinstance(par, pr.Class) \ and par == self.instance.base.base: par = self.instance - elif not isinstance(par, pr.Module): + elif not isinstance(par, (pr.Module, compiled.PyObject)): + print 'HA', par, self.var par = InstanceElement(self.instance._evaluator, self.instance, par, self.is_class_var) + print 'H2A', par return par def get_parent_until(self, *args, **kwargs):