From a3c2108ecfe1b8ca9274c20ff6df223f0f4a9610 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Wed, 4 Mar 2015 12:15:43 +0100 Subject: [PATCH] Fix and test CallSignature.bracket_start. --- jedi/api/__init__.py | 13 +++++++------ jedi/api/classes.py | 9 +++------ jedi/parser/user_context.py | 6 +++--- test/test_api/test_call_signatures.py | 9 +++++++++ 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 42b1a43d..ab2ad25e 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -290,7 +290,7 @@ class Script(object): return scopes @memoize_default() - def _get_under_cursor_stmt(self, cursor_txt): + def _get_under_cursor_stmt(self, cursor_txt, start_pos=None): tokenizer = source_tokens(cursor_txt) r = Parser(self._grammar, cursor_txt, tokenizer=tokenizer) try: @@ -301,9 +301,10 @@ class Script(object): user_stmt = self._parser.user_stmt() if user_stmt is None: - # Set the start_pos to a pseudo position, that doesn't exist but works - # perfectly well (for both completions in docstrings and statements). - pos = self._pos + # Set the start_pos to a pseudo position, that doesn't exist but + # works perfectly well (for both completions in docstrings and + # statements). + pos = start_pos or self._pos else: pos = user_stmt.start_pos @@ -500,11 +501,11 @@ class Script(object): :rtype: list of :class:`classes.CallSignature` """ - call_txt, call_index, key_name = self._user_context.call_signature() + call_txt, call_index, key_name, start_pos = self._user_context.call_signature() if call_txt is None: return [] - stmt = self._get_under_cursor_stmt(call_txt) + stmt = self._get_under_cursor_stmt(call_txt, start_pos) if stmt is None: return [] diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 4910200c..1e3c042b 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -613,11 +613,11 @@ class CallSignature(Definition): It knows what functions you are currently in. e.g. `isinstance(` would return the `isinstance` function. without `(` it would return nothing. """ - def __init__(self, evaluator, executable_name, call, index, key_name): + def __init__(self, evaluator, executable_name, call_stmt, index, key_name): super(CallSignature, self).__init__(evaluator, executable_name) self._index = index self._key_name = key_name - self._call = call + self._call_stmt = call_stmt @property def index(self): @@ -649,10 +649,7 @@ class CallSignature(Definition): The indent of the bracket that is responsible for the last function call. """ - c = self._call - while c.next is not None: - c = c.next - return c.name.end_pos + return self._call_stmt.end_pos @property def call_name(self): diff --git a/jedi/parser/user_context.py b/jedi/parser/user_context.py index aec4a26c..c11f475d 100644 --- a/jedi/parser/user_context.py +++ b/jedi/parser/user_context.py @@ -187,8 +187,8 @@ class UserContext(object): elif next_must_be_name: if tok_type == tokenize.NAME: end_pos = start_pos[0], start_pos[1] + len(tok_str) - call, _ = self._calc_path_until_cursor(start_pos=end_pos) - return call, index, key_name + call, start_pos = self._calc_path_until_cursor(start_pos=end_pos) + return call, index, key_name, start_pos index = 0 next_must_be_name = False elif next_is_key: @@ -207,7 +207,7 @@ class UserContext(object): index += 1 elif tok_str == '=': next_is_key = True - return None, 0, None + return None, 0, None, (0, 0) def get_context(self, yield_positions=False): self.get_path_until_cursor() # In case _start_cursor_pos is undefined. diff --git a/test/test_api/test_call_signatures.py b/test/test_api/test_call_signatures.py index 30988b28..02467da7 100644 --- a/test/test_api/test_call_signatures.py +++ b/test/test_api/test_call_signatures.py @@ -301,3 +301,12 @@ def test_signature_index(): assert get(both + 'foo(a=2').index == 1 assert get(both + 'foo(a=2, b=2').index == 1 assert get(both + 'foo(a, b, c').index == 0 + + +def test_bracket_start(): + def bracket_start(src): + signatures = Script(src).call_signatures() + assert len(signatures) == 1 + return signatures[0].bracket_start + + assert bracket_start('str(') == (1, 3)