From 164518b993727d19b5a273a5cb26c00f9155a95e Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 20 Nov 2014 02:19:01 +0100 Subject: [PATCH] Get docstrings working. --- jedi/evaluate/__init__.py | 3 +++ jedi/evaluate/docstrings.py | 11 ++++------- jedi/evaluate/iterable.py | 7 ++++++- jedi/parser/representation.py | 4 +--- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 4fda12db..6d0db5e9 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -166,6 +166,9 @@ class Evaluator(object): @memoize_default(evaluator_is_first_arg=True) def eval_element(self, element): + if isinstance(element, iterable.AlreadyEvaluated): + return element + debug.dbg('eval_element %s@%s', element, element.start_pos) if isinstance(element, (pr.Name, pr.Literal)) or pr.is_node(element, 'atom'): return self._eval_atom(element) diff --git a/jedi/evaluate/docstrings.py b/jedi/evaluate/docstrings.py index 257ea34f..78e9d885 100644 --- a/jedi/evaluate/docstrings.py +++ b/jedi/evaluate/docstrings.py @@ -22,8 +22,7 @@ from textwrap import dedent from jedi.evaluate.cache import memoize_default from jedi.parser import Parser from jedi.common import indent_block -from jedi.evaluate.iterable import Array -from jedi.evaluate import helpers +from jedi.evaluate.iterable import Array, FakeSequence, AlreadyEvaluated DOCSTRING_PARAM_PATTERNS = [ @@ -117,7 +116,7 @@ def _strip_rst_role(type_str): def _evaluate_for_statement_string(evaluator, string, module): code = dedent(""" def pseudo_docstring_stuff(): - '''Create a pseudo function for docstring statements.''' + # Create a pseudo function for docstring statements. %s """) if string is None: @@ -162,10 +161,8 @@ def _execute_array_values(evaluator, array): values = [] for typ in array.values(): objects = _execute_array_values(evaluator, typ) - values.append(helpers.FakeStatement(objects)) - arr = helpers.FakeArray(values, array.parent, array.type) - # Wrap it, because that's what the evaluator knows. - return [Array(evaluator, arr)] + values.append([AlreadyEvaluated(objects)]) + return [FakeSequence(evaluator, values, array.type)] else: return evaluator.execute(array) diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index 35971bd0..28375f06 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -293,7 +293,7 @@ class Array(IterableWrapper): return iter(self._items()) def __repr__(self): - return "" % (type(self).__name__, self._atom) + return "<%s of %s>" % (type(self).__name__, self._atom) class _FakeArray(Array): @@ -325,6 +325,11 @@ class FakeSequence(_FakeArray): for v in self._sequence_values[index])) +class AlreadyEvaluated(frozenset): + """A simple container to add already evaluated objects to an array.""" + pass + + class FakeDict(_FakeArray): def __init__(self, evaluator, dct): super(FakeDict, self).__init__(evaluator, dct, pr.Array.DICT) diff --git a/jedi/parser/representation.py b/jedi/parser/representation.py index 7eafe05d..fa49386a 100644 --- a/jedi/parser/representation.py +++ b/jedi/parser/representation.py @@ -543,9 +543,7 @@ class Scope(Simple, DocstringMixin): @property def statements(self): - return [s for c in self.children if is_node(c, 'simple_stmt') - for s in c.children if isinstance(s, (ExprStmt, Import, - KeywordStatement))] + return self._search_in_scope((ExprStmt, Import, KeywordStatement)) def is_scope(self): return True