forked from VimPlug/jedi
Refactor the completion module.
This commit is contained in:
@@ -21,48 +21,48 @@ class Completion:
|
|||||||
self._pos = position
|
self._pos = position
|
||||||
self._call_signatures_method = call_signatures_method
|
self._call_signatures_method = call_signatures_method
|
||||||
|
|
||||||
def completions(self):
|
def get_completions(self, user_stmt, path, dot, like):
|
||||||
def get_completions(user_stmt, bs):
|
# TODO this closure is ugly. it also doesn't work with
|
||||||
# TODO this closure is ugly. it also doesn't work with
|
# simple_complete (used for Interpreter), somehow redo.
|
||||||
# simple_complete (used for Interpreter), somehow redo.
|
module = self._evaluator.wrap(self._parser.module())
|
||||||
module = self._evaluator.wrap(self._parser.module())
|
names, level, only_modules, unfinished_dotted = \
|
||||||
names, level, only_modules, unfinished_dotted = \
|
helpers.check_error_statements(module, self._pos)
|
||||||
helpers.check_error_statements(module, self._pos)
|
completion_names = []
|
||||||
completion_names = []
|
if names is not None:
|
||||||
if names is not None:
|
imp_names = tuple(str(n) for n in names if n.end_pos < self._pos)
|
||||||
imp_names = tuple(str(n) for n in names if n.end_pos < self._pos)
|
i = imports.Importer(self._evaluator, imp_names, module, level)
|
||||||
i = imports.Importer(self._evaluator, imp_names, module, level)
|
completion_names = i.completion_names(self._evaluator, only_modules)
|
||||||
completion_names = i.completion_names(self._evaluator, only_modules)
|
|
||||||
|
|
||||||
# TODO this paragraph is necessary, but not sure it works.
|
# TODO this paragraph is necessary, but not sure it works.
|
||||||
context = self._user_context.get_context()
|
context = self._user_context.get_context()
|
||||||
if not next(context).startswith('.'): # skip the path
|
if not next(context).startswith('.'): # skip the path
|
||||||
if next(context) == 'from':
|
if next(context) == 'from':
|
||||||
# completion is just "import" if before stands from ..
|
# completion is just "import" if before stands from ..
|
||||||
if unfinished_dotted:
|
if unfinished_dotted:
|
||||||
return completion_names
|
return completion_names
|
||||||
else:
|
else:
|
||||||
return set([keywords.keyword(self._evaluator, 'import').name])
|
return set([keywords.keyword(self._evaluator, 'import').name])
|
||||||
|
|
||||||
if isinstance(user_stmt, tree.Import):
|
if isinstance(user_stmt, tree.Import):
|
||||||
module = self._parser.module()
|
module = self._parser.module()
|
||||||
completion_names += imports.completion_names(self._evaluator,
|
completion_names += imports.completion_names(self._evaluator,
|
||||||
user_stmt, self._pos)
|
user_stmt, self._pos)
|
||||||
return completion_names
|
|
||||||
|
|
||||||
if names is None and not isinstance(user_stmt, tree.Import):
|
|
||||||
if not path and not dot:
|
|
||||||
# add keywords
|
|
||||||
completion_names += keywords.completion_names(
|
|
||||||
self._evaluator,
|
|
||||||
user_stmt,
|
|
||||||
self._pos,
|
|
||||||
module)
|
|
||||||
# TODO delete? We should search for valid parser
|
|
||||||
# transformations.
|
|
||||||
completion_names += self._simple_complete(path, dot, like)
|
|
||||||
return completion_names
|
return completion_names
|
||||||
|
|
||||||
|
if names is None and not isinstance(user_stmt, tree.Import):
|
||||||
|
if not path and not dot:
|
||||||
|
# add keywords
|
||||||
|
completion_names += keywords.completion_names(
|
||||||
|
self._evaluator,
|
||||||
|
user_stmt,
|
||||||
|
self._pos,
|
||||||
|
module)
|
||||||
|
# TODO delete? We should search for valid parser
|
||||||
|
# transformations.
|
||||||
|
completion_names += self._simple_complete(path, dot, like)
|
||||||
|
return completion_names
|
||||||
|
|
||||||
|
def completions(self):
|
||||||
debug.speed('completions start')
|
debug.speed('completions start')
|
||||||
path = self._user_context.get_path_until_cursor()
|
path = self._user_context.get_path_until_cursor()
|
||||||
# Dots following an int are not the start of a completion but a float
|
# Dots following an int are not the start of a completion but a float
|
||||||
@@ -73,7 +73,7 @@ class Completion:
|
|||||||
|
|
||||||
user_stmt = self._parser.user_stmt_with_whitespace()
|
user_stmt = self._parser.user_stmt_with_whitespace()
|
||||||
|
|
||||||
completion_names = get_completions(user_stmt, self._evaluator.BUILTINS)
|
completion_names = self.get_completions(user_stmt, path, dot, like)
|
||||||
|
|
||||||
if not dot:
|
if not dot:
|
||||||
# add named params
|
# add named params
|
||||||
@@ -131,7 +131,9 @@ class Completion:
|
|||||||
names = list(chain.from_iterable(names_dict.values()))
|
names = list(chain.from_iterable(names_dict.values()))
|
||||||
if not names:
|
if not names:
|
||||||
continue
|
continue
|
||||||
completion_names += filter_definition_names(names, self._parser.user_stmt(), pos)
|
completion_names += filter_definition_names(
|
||||||
|
names, self._parser.user_stmt(), pos
|
||||||
|
)
|
||||||
elif inference.get_under_cursor_stmt(self._evaluator, self._parser,
|
elif inference.get_under_cursor_stmt(self._evaluator, self._parser,
|
||||||
path, self._pos) is None:
|
path, self._pos) is None:
|
||||||
return []
|
return []
|
||||||
@@ -147,5 +149,7 @@ class Completion:
|
|||||||
for names_dict in s.names_dicts(search_global=False):
|
for names_dict in s.names_dicts(search_global=False):
|
||||||
names += chain.from_iterable(names_dict.values())
|
names += chain.from_iterable(names_dict.values())
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
Reference in New Issue
Block a user