forked from VimPlug/jedi
Move the type inference call of the api to inference.py
This commit is contained in:
@@ -13,7 +13,7 @@ import sys
|
|||||||
import collections
|
import collections
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
|
|
||||||
from jedi._compatibility import unicode, builtins
|
from jedi._compatibility import unicode
|
||||||
from jedi.parser import load_grammar
|
from jedi.parser import load_grammar
|
||||||
from jedi.parser import tree
|
from jedi.parser import tree
|
||||||
from jedi.parser.user_context import UserContext, UserContextParser
|
from jedi.parser.user_context import UserContext, UserContextParser
|
||||||
@@ -32,7 +32,7 @@ from jedi.evaluate import representation as er
|
|||||||
from jedi.evaluate import compiled
|
from jedi.evaluate import compiled
|
||||||
from jedi.evaluate import imports
|
from jedi.evaluate import imports
|
||||||
from jedi.evaluate.param import try_iter_content
|
from jedi.evaluate.param import try_iter_content
|
||||||
from jedi.evaluate.helpers import FakeName, get_module_names
|
from jedi.evaluate.helpers import get_module_names
|
||||||
from jedi.evaluate.finder import global_names_dict_generator, filter_definition_names
|
from jedi.evaluate.finder import global_names_dict_generator, filter_definition_names
|
||||||
from jedi.evaluate.sys_path import get_venv_path
|
from jedi.evaluate.sys_path import get_venv_path
|
||||||
from jedi.evaluate.iterable import unpack_tuple_to_dict
|
from jedi.evaluate.iterable import unpack_tuple_to_dict
|
||||||
@@ -273,7 +273,10 @@ class Script(object):
|
|||||||
path, self._pos) is None:
|
path, self._pos) is None:
|
||||||
return []
|
return []
|
||||||
else:
|
else:
|
||||||
scopes = list(self._type_inference(path, True))
|
scopes = list(inference.type_inference(
|
||||||
|
self._evaluator, self._parser, self._user_context,
|
||||||
|
self._pos, path, is_completion=True
|
||||||
|
))
|
||||||
completion_names = []
|
completion_names = []
|
||||||
debug.dbg('possible completion scopes: %s', scopes)
|
debug.dbg('possible completion scopes: %s', scopes)
|
||||||
for s in scopes:
|
for s in scopes:
|
||||||
@@ -284,44 +287,6 @@ class Script(object):
|
|||||||
completion_names += filter_definition_names(names, self._parser.user_stmt())
|
completion_names += filter_definition_names(names, self._parser.user_stmt())
|
||||||
return completion_names
|
return completion_names
|
||||||
|
|
||||||
def _type_inference(self, dotted_path, is_completion=False):
|
|
||||||
"""
|
|
||||||
Base for completions/goto. Basically it returns the resolved scopes
|
|
||||||
under cursor.
|
|
||||||
"""
|
|
||||||
debug.dbg('start: %s in %s', dotted_path, self._parser.user_scope())
|
|
||||||
|
|
||||||
user_stmt = self._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.
|
|
||||||
return []
|
|
||||||
|
|
||||||
if isinstance(user_stmt, tree.Import):
|
|
||||||
i, _ = helpers.get_on_import_stmt(self._evaluator, self._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 = inference.get_under_cursor_stmt(self._evaluator,
|
|
||||||
self._parser, dotted_path, self._pos)
|
|
||||||
if eval_stmt is None:
|
|
||||||
return []
|
|
||||||
|
|
||||||
module = self._evaluator.wrap(self._parser.module())
|
|
||||||
names, level, _, _ = helpers.check_error_statements(module, self._pos)
|
|
||||||
if names:
|
|
||||||
names = [str(n) for n in names]
|
|
||||||
i = imports.Importer(self._evaluator, names, module, level)
|
|
||||||
return i.follow()
|
|
||||||
|
|
||||||
scopes = self._evaluator.eval_element(eval_stmt)
|
|
||||||
|
|
||||||
return scopes
|
|
||||||
|
|
||||||
def goto_definitions(self):
|
def goto_definitions(self):
|
||||||
"""
|
"""
|
||||||
Return the definitions of a the path under the cursor. goto function!
|
Return the definitions of a the path under the cursor. goto function!
|
||||||
@@ -363,7 +328,10 @@ class Script(object):
|
|||||||
definitions = self._evaluator.goto_definition(name)
|
definitions = self._evaluator.goto_definition(name)
|
||||||
|
|
||||||
if not definitions and goto_path:
|
if not definitions and goto_path:
|
||||||
definitions = self._type_inference(goto_path)
|
definitions = inference.type_inference(
|
||||||
|
self._evaluator, self._parser, self._user_context,
|
||||||
|
self._pos, goto_path
|
||||||
|
)
|
||||||
|
|
||||||
definitions = resolve_import_paths(definitions)
|
definitions = resolve_import_paths(definitions)
|
||||||
names = [s.name for s in definitions]
|
names = [s.name for s in definitions]
|
||||||
|
|||||||
@@ -2,12 +2,50 @@
|
|||||||
This module has helpers for doing type inference on strings. It is needed,
|
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.
|
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.parser import Parser, ParseError
|
||||||
|
from jedi.evaluate import imports
|
||||||
from jedi.evaluate.cache import memoize_default
|
from jedi.evaluate.cache import memoize_default
|
||||||
|
|
||||||
|
|
||||||
def type_inference(evaluator, parser, user_context, position, dotted_path, is_completion=False):
|
def type_inference(evaluator, parser, user_context, position, dotted_path, is_completion=False):
|
||||||
pass
|
"""
|
||||||
|
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.
|
||||||
|
return []
|
||||||
|
|
||||||
|
if isinstance(user_stmt, tree.Import):
|
||||||
|
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 []
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
@memoize_default(evaluator_is_first_arg=True)
|
@memoize_default(evaluator_is_first_arg=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user