From d71fe3061bad9ef4c29b59e712a86f83d8c7bf3d Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 8 Jan 2014 02:20:41 +0100 Subject: [PATCH] better environment for compiled executions --- jedi/evaluate/__init__.py | 5 ++++- jedi/evaluate/compiled.py | 33 +++++++++++++++++++++++++++++++-- test/test_compiled.py | 6 +++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index f08685b0..cde7e4ca 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -83,6 +83,7 @@ from jedi.evaluate import iterable from jedi.evaluate.cache import memoize_default from jedi.evaluate import stdlib from jedi.evaluate import finder +from jedi.evaluate import compiled class Evaluator(object): @@ -391,7 +392,9 @@ class Evaluator(object): except stdlib.NotInStdLib: pass - if obj.isinstance(er.Class): + if isinstance(obj, compiled.PyObject): + return obj.execute(params) + elif obj.isinstance(er.Class): # There maybe executions of executions. return [er.Instance(self, obj, params)] elif isinstance(obj, iterable.Generator): diff --git a/jedi/evaluate/compiled.py b/jedi/evaluate/compiled.py index 0ea587bf..5e716e63 100644 --- a/jedi/evaluate/compiled.py +++ b/jedi/evaluate/compiled.py @@ -1,13 +1,17 @@ """ Imitate the parser representation. """ +import inspect + +from jedi._compatibility import builtins from jedi.cache import underscore_memoization class PyObject(object): - def __init__(self, obj, parent=None): + def __init__(self, obj, parent=None, instantiated=False): self.obj = obj self.parent = parent + self.instantiated = instantiated def get_defined_names(self): for name in dir(self.obj): @@ -16,6 +20,21 @@ class PyObject(object): def isinstance(self, *obj): return isinstance(self, obj) + @property + def name(self): + # might not exist sometimes (raises AttributeError) + return self.obj.__name__ + + def execute(self, params): + if inspect.isclass(self.obj): + return [PyObject(self.obj, self.parent, True)] + elif inspect.isbuiltin(self.obj) or inspect.ismethod(self.obj) \ + or inspect.ismethoddescriptor(self.obj): + return [] + else: + return [] + return [] + class PyName(object): def __init__(self, obj, name): @@ -27,7 +46,17 @@ class PyName(object): @property @underscore_memoization def parent(self): - return PyObject(getattr(self._obj.obj, self._name), self._obj) + try: + # this has a builtin_function_or_method + 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(obj, py_builtin) + return PyObject(o, self._obj) def get_code(self): return self._name + +py_builtin = PyObject(builtins) diff --git a/test/test_compiled.py b/test/test_compiled.py index 45b64412..cb08d0eb 100644 --- a/test/test_compiled.py +++ b/test/test_compiled.py @@ -4,7 +4,11 @@ from jedi.evaluate import Evaluator def test_simple(): + e = Evaluator() bltn = compiled.PyObject(builtins) obj = compiled.PyObject('_str_', bltn) - upper = Evaluator().find_types(obj, 'upper') + upper = e.find_types(obj, 'upper') assert len(upper) == 1 + objs = e.execute(upper[0]) + assert len(objs) == 1 + assert isinstance(objs[0].obj, str)