diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 512cbb89..948a1330 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -154,10 +154,10 @@ class Evaluator(object): c_node = ContextualizedName(context, seek_name) types = finder.check_tuple_assignments(self, c_node, types) - first_operation = stmt.first_operation() - if first_operation not in ('=', None) and first_operation.type == 'operator': + first_operator = next(stmt.yield_operators(), None) + if first_operator not in ('=', None) and first_operator.type == 'operator': # `=` is always the last character in aug assignments -> -1 - operator = copy.copy(first_operation) + operator = copy.copy(first_operator) operator.value = operator.value[:-1] name = str(stmt.get_defined_names()[0]) left = context.py__getattribute__( diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index a18e63e4..2be77fb9 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -312,7 +312,7 @@ def _check_flow_information(context, flow, search_name, pos): for name in names: ass = tree.search_ancestor(name, 'assert_stmt') if ass is not None: - result = _check_isinstance_type(context, ass.assertion(), search_name) + result = _check_isinstance_type(context, ass.assertion, search_name) if result is not None: return result diff --git a/jedi/parser/python/tree.py b/jedi/parser/python/tree.py index 01a50adf..e2fb4b7b 100644 --- a/jedi/parser/python/tree.py +++ b/jedi/parser/python/tree.py @@ -965,6 +965,7 @@ class KeywordStatement(PythonBaseNode): class AssertStmt(KeywordStatement): __slots__ = () + @property def assertion(self): return self.children[1] @@ -972,9 +973,6 @@ class AssertStmt(KeywordStatement): class GlobalStmt(KeywordStatement): __slots__ = () - def get_defined_names(self): - return [] - def get_global_names(self): return self.children[1::2] @@ -984,12 +982,9 @@ class ReturnStmt(KeywordStatement): class YieldExpr(PythonBaseNode): + type = 'yield_expr' __slots__ = () - @property - def type(self): - return 'yield_expr' - def _defined_names(current): """ @@ -1030,14 +1025,20 @@ class ExprStmt(PythonBaseNode, DocstringMixin): """Returns the right-hand-side of the equals.""" return self.children[-1] - def first_operation(self): + def yield_operators(self): """ - Returns `+=`, `=`, etc or None if there is no operation. + Returns a generator of `+=`, `=`, etc. or None if there is no operation. """ - try: - return self.children[1] - except IndexError: - return None + first = self.children[1] + if first.type == 'annassign': + if len(first.children) <= 2: + return # No operator is available, it's just PEP 484. + + first = first.children[2] + yield first + + for operator in self.children[3::2]: + yield operator class Param(PythonBaseNode): @@ -1109,6 +1110,7 @@ class Param(PythonBaseNode): return search_ancestor(self, ('funcdef', 'lambda')) def get_description(self): + # TODO Remove? children = self.children if children[-1] == ',': children = children[:-1]