1
0
forked from VimPlug/jedi

Make goto_definitions a lot simpler.

This commit is contained in:
Dave Halter
2016-06-11 23:13:04 +02:00
parent 9930ab5056
commit c82691a12b
12 changed files with 107 additions and 80 deletions

View File

@@ -3,50 +3,29 @@ This module has helpers for doing type inference on strings. It is needed,
because we still want to infer types where the syntax is invalid.
"""
from jedi import debug
from jedi.api import helpers
from jedi.parser import tree
from jedi.parser import Parser, ParseError
from jedi.evaluate import imports
from jedi.evaluate.cache import memoize_default
from jedi.api import helpers
def type_inference(evaluator, parser, user_context, position, dotted_path, is_completion=False):
def goto_checks(evaluator, parser, user_context, position, dotted_path, follow_types=False):
module = evaluator.wrap(parser.module())
stack = helpers.get_stack_at_position(evaluator.grammar, self._source, module, position)
stack
def type_inference(evaluator, parser, user_context, position, dotted_path):
"""
Base for completions/goto. Basically it returns the resolved scopes
under cursor.
"""
debug.dbg('start: %s in %s', dotted_path, parser.user_scope())
user_stmt = parser.user_stmt_with_whitespace()
if not user_stmt and len(dotted_path.split('\n')) > 1:
# If the user_stmt is not defined and the dotted_path is multi line,
# something's strange. Most probably the backwards tokenizer
# matched to much.
# Just parse one statement, take it and evaluate it.
eval_stmt = get_under_cursor_stmt(evaluator, parser, dotted_path, position)
if eval_stmt is None:
return []
if isinstance(user_stmt, tree.Import) and not is_completion:
i, _ = helpers.get_on_import_stmt(evaluator, user_context,
user_stmt, is_completion)
if i is None:
return []
scopes = [i]
else:
# Just parse one statement, take it and evaluate it.
eval_stmt = get_under_cursor_stmt(evaluator, parser, dotted_path, position)
if eval_stmt is None:
return []
if not is_completion:
module = evaluator.wrap(parser.module())
names, level, _, _ = helpers.check_error_statements(module, position)
if names:
names = [str(n) for n in names]
i = imports.Importer(evaluator, names, module, level)
return i.follow()
scopes = evaluator.eval_element(eval_stmt)
return scopes
return evaluator.eval_element(eval_stmt)
@memoize_default(evaluator_is_first_arg=True)