1
0
forked from VimPlug/jedi

Preparing for an eventual replacement of using expr_stmt for all nodes.

This commit is contained in:
Dave Halter
2015-03-05 00:07:50 +01:00
parent aea38ca9aa
commit f273e314b6
3 changed files with 14 additions and 10 deletions
+5 -4
View File
@@ -285,7 +285,7 @@ class Script(object):
i = imports.get_importer(self._evaluator, names, module, level) i = imports.get_importer(self._evaluator, names, module, level)
return i.follow(self._evaluator) return i.follow(self._evaluator)
scopes = self._evaluator.eval_statement(eval_stmt) scopes = self._evaluator.eval_element(eval_stmt)
return scopes return scopes
@@ -294,9 +294,10 @@ class Script(object):
tokenizer = source_tokens(cursor_txt) tokenizer = source_tokens(cursor_txt)
r = Parser(self._grammar, cursor_txt, tokenizer=tokenizer) r = Parser(self._grammar, cursor_txt, tokenizer=tokenizer)
try: try:
# Take the last statement available. # Take the last statement available that is not an endmarker.
stmt = r.module.statements[-1] # And because it's a simple_stmt, we need to get the first child.
except IndexError: stmt = r.module.children[-2].children[0]
except (AttributeError, IndexError):
return None return None
user_stmt = self._parser.user_stmt() user_stmt = self._parser.user_stmt()
+2
View File
@@ -159,6 +159,8 @@ class Evaluator(object):
return [er.LambdaWrapper(self, element)] return [er.LambdaWrapper(self, element)]
elif element.isinstance(er.LambdaWrapper): elif element.isinstance(er.LambdaWrapper):
return [element] # TODO this is no real evaluation. return [element] # TODO this is no real evaluation.
elif element.type == 'expr_stmt':
return self.eval_statement(element)
elif element.type == 'power': elif element.type == 'power':
types = self._eval_atom(element.children[0]) types = self._eval_atom(element.children[0])
for trailer in element.children[1:]: for trailer in element.children[1:]:
+7 -6
View File
@@ -173,6 +173,10 @@ class Leaf(Base):
return (self._start_pos[0] + self.position_modifier.line, return (self._start_pos[0] + self.position_modifier.line,
self._start_pos[1] + len(self.value)) 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): def get_previous(self):
""" """
Returns the previous leaf in the parser tree. Returns the previous leaf in the parser tree.
@@ -427,11 +431,7 @@ class BaseNode(Base):
Move the Node's start_pos. Move the Node's start_pos.
""" """
for c in self.children: for c in self.children:
if isinstance(c, Leaf): c.move(line_offset, column_offset)
c.start_pos = (c.start_pos[0] + line_offset,
c.start_pos[1] + column_offset)
else:
c.move(line_offset, column_offset)
@property @property
def start_pos(self): def start_pos(self):
@@ -460,7 +460,8 @@ class BaseNode(Base):
def get_statement_for_position(self, pos): def get_statement_for_position(self, pos):
for c in self.children: for c in self.children:
if c.start_pos <= pos <= c.end_pos: 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 return c
else: else:
try: try: