diff --git a/jedi/cache.py b/jedi/cache.py index 11c8f95e..ad73c082 100644 --- a/jedi/cache.py +++ b/jedi/cache.py @@ -243,7 +243,7 @@ def save_parser(path, name, parser, pickling=True): class ParserPickling(object): - version = 12 + version = 13 """ Version number (integer) for file system cache. diff --git a/jedi/evaluate/compiled/__init__.py b/jedi/evaluate/compiled/__init__.py index ed3d01ae..3ae14f7c 100644 --- a/jedi/evaluate/compiled/__init__.py +++ b/jedi/evaluate/compiled/__init__.py @@ -48,7 +48,7 @@ class CompiledObject(Base): for p in tokens: parts = [FakeName(part) for part in p.strip().split('=')] if len(parts) >= 2: - parts.insert(1, Operator('=', (0, 0))) + parts.insert(1, Operator(module, '=', module, (0, 0))) params.append(Param(module, parts, start_pos, end_pos, builtin)) return params diff --git a/jedi/evaluate/precedence.py b/jedi/evaluate/precedence.py index 76f13100..4cc075b3 100644 --- a/jedi/evaluate/precedence.py +++ b/jedi/evaluate/precedence.py @@ -123,8 +123,8 @@ class MergedOperator(pr.Operator): """ def __init__(self, first, second): string = first.string + ' ' + second.string - super(MergedOperator, self).__init__(string, first.start_pos) - + super(MergedOperator, self).__init__(first._sub_module, string, + first.parent, first.start_pos) self.first = first self.second = second @@ -278,7 +278,7 @@ def _element_calculate(evaluator, left, operator, right): # Static analysis, one is a number, the other one is not. elif l_is_num != r_is_num: message = "TypeError: unsupported operand type(s) for +: %s and %s" - analysis.add(evaluator, 'type-error-operation', right, + analysis.add(evaluator, 'type-error-operation', operator, message % (left, right)) elif operator == '-': if _is_number(left) and _is_number(right): diff --git a/jedi/parser/__init__.py b/jedi/parser/__init__.py index 43afe4cb..86a31249 100644 --- a/jedi/parser/__init__.py +++ b/jedi/parser/__init__.py @@ -325,7 +325,9 @@ class Parser(object): # print 'parse_stmt', tok, tokenize.tok_name[token_type] is_kw = tok.string in OPERATOR_KEYWORDS if tok.type == tokenize.OP or is_kw: - tok_list.append(pr.Operator(tok.string, tok.start_pos)) + tok_list.append( + pr.Operator(self.module, tok.string, self._scope, tok.start_pos) + ) else: tok_list.append(tok) diff --git a/jedi/parser/representation.py b/jedi/parser/representation.py index cbfa037d..b85f2fb3 100644 --- a/jedi/parser/representation.py +++ b/jedi/parser/representation.py @@ -918,7 +918,7 @@ class Statement(Simple, DocstringMixin): def get_code(self, new_line=True): def assemble(command_list, assignment=None): pieces = [c.get_code() if isinstance(c, Simple) else c.string if -isinstance(c, (tokenize.Token, Operator)) else unicode(c) +isinstance(c, tokenize.Token) else unicode(c) for c in command_list] if assignment is None: return ''.join(pieces) @@ -1565,26 +1565,21 @@ class ListComprehension(ForFlow): return "%s for %s in %s" % tuple(code) -class Operator(Base): - __slots__ = ('string', '_line', '_column') +class Operator(Simple): + __slots__ = ('string',) - def __init__(self, string, start_pos): - # TODO needs module param + def __init__(self, module, string, parent, start_pos): + end_pos = start_pos[0], start_pos[1] + len(string) + super(Operator, self).__init__(module, start_pos, end_pos) self.string = string - self._line = start_pos[0] - self._column = start_pos[1] + self.parent = parent + + def get_code(self): + return self.string def __repr__(self): return "<%s: `%s`>" % (type(self).__name__, self.string) - @property - def start_pos(self): - return self._line, self._column - - @property - def end_pos(self): - return self._line, self._column + len(self.string) - def __eq__(self, other): """Make comparisons easy. Improves the readability of the parser.""" return self.string == other