diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 0f7eddce..5a633146 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -106,12 +106,12 @@ class Script(object): source = f.read() self._source = common.source_to_unicode(source, encoding) - lines = common.splitlines(self._source) - line = max(len(lines), 1) if line is None else line - if not (0 < line <= len(lines)): + self._code_lines = common.splitlines(self._source) + line = max(len(self._code_lines), 1) if line is None else line + if not (0 < line <= len(self._code_lines)): raise ValueError('`line` parameter is not in a valid range.') - line_len = len(lines[line - 1]) + line_len = len(self._code_lines[line - 1]) column = line_len if column is None else column if not (0 <= column <= line_len): raise ValueError('`column` parameter is not in a valid range.') @@ -162,7 +162,7 @@ class Script(object): debug.speed('completions start') path = self._user_context.get_path_until_cursor() completion = Completion( - self._evaluator, self._parser, self._user_context, + self._evaluator, self._parser, self._code_lines, self._pos, self.call_signatures ) completions = completion.completions(path) diff --git a/jedi/api/completion.py b/jedi/api/completion.py index 0c58aa63..9d621b89 100644 --- a/jedi/api/completion.py +++ b/jedi/api/completion.py @@ -53,11 +53,11 @@ def filter_names(evaluator, completion_names, like_name): class Completion: - def __init__(self, evaluator, parser, user_context, position, call_signatures_method): + def __init__(self, evaluator, parser, code_lines, position, call_signatures_method): self._evaluator = evaluator self._parser = parser self._module = evaluator.wrap(parser.module()) - self._source = user_context.source + self._code_lines = code_lines self._pos = position self._call_signatures_method = call_signatures_method @@ -97,7 +97,7 @@ class Completion: pos = pos[0], pos[1] - len(completion_parts.name) try: - stack = helpers.get_stack_at_position(grammar, self._source, self._module, pos) + stack = helpers.get_stack_at_position(grammar, self._code_lines, self._module, pos) except helpers.OnErrorLeaf as e: if e.error_leaf.value == '.': # After ErrorLeaf's that are dots, we will not do any diff --git a/jedi/api/helpers.py b/jedi/api/helpers.py index 5fcf3362..9111c873 100644 --- a/jedi/api/helpers.py +++ b/jedi/api/helpers.py @@ -4,7 +4,6 @@ Helpers for the API import re from collections import namedtuple -from jedi import common from jedi.evaluate.helpers import call_of_leaf from jedi import parser from jedi.parser import tokenize, token @@ -28,13 +27,12 @@ def sorted_definitions(defs): return sorted(defs, key=lambda x: (x.module_path or '', x.line or 0, x.column or 0)) -def _get_code(code, start_pos, end_pos): +def _get_code(code_lines, start_pos, end_pos): """ :param code_start_pos: is where the code starts. """ - lines = common.splitlines(code) # Get relevant lines. - lines = lines[start_pos[0] - 1:end_pos[0]] + lines = code_lines[start_pos[0] - 1:end_pos[0]] # Remove the parts at the end of the line. lines[-1] = lines[-1][:end_pos[1]] # Remove first line indentation. @@ -48,7 +46,7 @@ class OnErrorLeaf(Exception): return self.args[0] -def get_stack_at_position(grammar, source, module, pos): +def get_stack_at_position(grammar, code_lines, module, pos): """ Returns the possible node names (e.g. import_from, xor_test or yield_stmt). """ @@ -72,7 +70,7 @@ def get_stack_at_position(grammar, source, module, pos): # impossible. raise OnErrorLeaf(user_stmt) - code = _get_code(source, user_stmt.start_pos, pos) + code = _get_code(code_lines, user_stmt.start_pos, pos) if code == ';': # ; cannot be parsed. code = ''