From f273e314b6862a2bcef492361cdcf32b62305738 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 5 Mar 2015 00:07:50 +0100 Subject: [PATCH] Preparing for an eventual replacement of using expr_stmt for all nodes. --- jedi/api/__init__.py | 9 +++++---- jedi/evaluate/__init__.py | 2 ++ jedi/parser/tree.py | 13 +++++++------ 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index ab2ad25e..47e1eb3c 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -285,7 +285,7 @@ class Script(object): i = imports.get_importer(self._evaluator, names, module, level) return i.follow(self._evaluator) - scopes = self._evaluator.eval_statement(eval_stmt) + scopes = self._evaluator.eval_element(eval_stmt) return scopes @@ -294,9 +294,10 @@ class Script(object): tokenizer = source_tokens(cursor_txt) r = Parser(self._grammar, cursor_txt, tokenizer=tokenizer) try: - # Take the last statement available. - stmt = r.module.statements[-1] - except IndexError: + # Take the last statement available that is not an endmarker. + # And because it's a simple_stmt, we need to get the first child. + stmt = r.module.children[-2].children[0] + except (AttributeError, IndexError): return None user_stmt = self._parser.user_stmt() diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index b9e3ce68..bfa26493 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -159,6 +159,8 @@ class Evaluator(object): return [er.LambdaWrapper(self, element)] elif element.isinstance(er.LambdaWrapper): return [element] # TODO this is no real evaluation. + elif element.type == 'expr_stmt': + return self.eval_statement(element) elif element.type == 'power': types = self._eval_atom(element.children[0]) for trailer in element.children[1:]: diff --git a/jedi/parser/tree.py b/jedi/parser/tree.py index 30d6ada7..7654c2ac 100644 --- a/jedi/parser/tree.py +++ b/jedi/parser/tree.py @@ -173,6 +173,10 @@ class Leaf(Base): return (self._start_pos[0] + self.position_modifier.line, self._start_pos[1] + len(self.value)) + def move(self, line_offset, column_offset): + self._start_pos = (self._start_pos[0] + line_offset, + self._start_pos[1] + column_offset) + def get_previous(self): """ Returns the previous leaf in the parser tree. @@ -427,11 +431,7 @@ class BaseNode(Base): Move the Node's start_pos. """ for c in self.children: - if isinstance(c, Leaf): - c.start_pos = (c.start_pos[0] + line_offset, - c.start_pos[1] + column_offset) - else: - c.move(line_offset, column_offset) + c.move(line_offset, column_offset) @property def start_pos(self): @@ -460,7 +460,8 @@ class BaseNode(Base): def get_statement_for_position(self, pos): for c in self.children: if c.start_pos <= pos <= c.end_pos: - if c.type in ('expr_stmt', 'import_from', 'import_name'): + if c.type not in ('decorated', 'simple_stmt', 'suite') \ + and not isinstance(c, (Flow, ClassOrFunc)): return c else: try: