forked from VimPlug/jedi
A lot of small improvements.
This commit is contained in:
@@ -137,7 +137,7 @@ class Script(object):
|
||||
parser = FastParser(self._grammar, self._source, self.path)
|
||||
save_parser(self.path, parser, pickling=False)
|
||||
|
||||
module = self._evaluator.wrap(parser.module)
|
||||
module = self._evaluator.wrap(parser.module, parent_context=None)
|
||||
imports.add_module(self._evaluator, unicode(module.name), module)
|
||||
return parser.module
|
||||
|
||||
@@ -188,7 +188,9 @@ class Script(object):
|
||||
leaf = self._get_module().get_leaf_for_position(self._pos)
|
||||
if leaf is None:
|
||||
return []
|
||||
definitions = helpers.evaluate_goto_definition(self._evaluator, leaf)
|
||||
|
||||
context = self._evaluator.create_context(leaf)
|
||||
definitions = helpers.evaluate_goto_definition(self._evaluator, context, leaf)
|
||||
|
||||
names = [s.name for s in definitions]
|
||||
defs = [classes.Definition(self._evaluator, name) for name in names]
|
||||
@@ -299,9 +301,11 @@ class Script(object):
|
||||
if call_signature_details is None:
|
||||
return []
|
||||
|
||||
context = self._evaluator.create_context(call_signature_details.bracket_leaf)
|
||||
with common.scale_speed_settings(settings.scale_call_signatures):
|
||||
definitions = helpers.cache_call_signatures(
|
||||
self._evaluator,
|
||||
context,
|
||||
call_signature_details.bracket_leaf,
|
||||
self._code_lines,
|
||||
self._pos
|
||||
|
||||
@@ -65,6 +65,7 @@ class BaseDefinition(object):
|
||||
"""
|
||||
#self._definition = list(self._name.infer())[0]
|
||||
#self.is_keyword = isinstance(self._definition, keywords.Keyword)
|
||||
self._definition = None
|
||||
|
||||
# generate a path to the definition
|
||||
self._module = name.parent_context.get_root_context()
|
||||
@@ -83,7 +84,7 @@ class BaseDefinition(object):
|
||||
|
||||
:rtype: str or None
|
||||
"""
|
||||
return unicode(self._name)
|
||||
return self._name.string_name
|
||||
|
||||
@property
|
||||
def start_pos(self):
|
||||
@@ -198,7 +199,7 @@ class BaseDefinition(object):
|
||||
>>> print(d.module_name) # doctest: +ELLIPSIS
|
||||
json
|
||||
"""
|
||||
return str(self._module.name)
|
||||
return self._module.name.string_name
|
||||
|
||||
def in_builtin_module(self):
|
||||
"""Whether this is a builtin module."""
|
||||
@@ -417,7 +418,7 @@ class Completion(BaseDefinition):
|
||||
if 'trailer' in node_names and 'argument' not in node_names:
|
||||
append += '='
|
||||
|
||||
name = str(self._name)
|
||||
name = self._name.string_name
|
||||
if like_name:
|
||||
name = name[self._like_name_length:]
|
||||
return name + append
|
||||
@@ -450,7 +451,8 @@ class Completion(BaseDefinition):
|
||||
def description(self):
|
||||
"""Provide a description of the completion object."""
|
||||
if self._definition is None:
|
||||
return ''
|
||||
return self._name.string_name
|
||||
|
||||
t = self.type
|
||||
if t == 'statement' or t == 'import':
|
||||
desc = self._definition.get_code()
|
||||
@@ -577,7 +579,7 @@ class Definition(use_metaclass(CachedMetaClass, BaseDefinition)):
|
||||
d = typ + ' ' + d.name.get_code()
|
||||
elif isinstance(d, iterable.Array):
|
||||
d = 'class ' + d.type
|
||||
elif isinstance(d, (tree.Class, er.Class, er.Instance)):
|
||||
elif isinstance(d, (tree.Class, er.ClassContext, er.Instance)):
|
||||
d = 'class ' + unicode(d.name)
|
||||
elif isinstance(d, (er.Function, tree.Function)):
|
||||
d = 'def ' + unicode(d.name)
|
||||
@@ -589,6 +591,7 @@ class Definition(use_metaclass(CachedMetaClass, BaseDefinition)):
|
||||
if d.endswith(','):
|
||||
d = d[:-1] # Remove the comma.
|
||||
else: # ExprStmt
|
||||
return self._name.string_name
|
||||
try:
|
||||
first_leaf = d.first_leaf()
|
||||
except AttributeError:
|
||||
|
||||
@@ -33,7 +33,6 @@ def filter_names(evaluator, completion_names, stack, like_name):
|
||||
and name.string_name.lower().startswith(like_name.lower()) \
|
||||
or name.string_name.startswith(like_name):
|
||||
|
||||
print(name, name.infer())
|
||||
new = classes.Completion(
|
||||
evaluator,
|
||||
name,
|
||||
@@ -71,7 +70,7 @@ def get_user_scope(module, position):
|
||||
class Completion:
|
||||
def __init__(self, evaluator, module, code_lines, position, call_signatures_method):
|
||||
self._evaluator = evaluator
|
||||
self._module = evaluator.wrap(module)
|
||||
self._module = evaluator.wrap(module, parent_context=None)
|
||||
self._code_lines = code_lines
|
||||
|
||||
# The first step of completions is to get the name
|
||||
@@ -175,7 +174,7 @@ class Completion:
|
||||
scope = get_user_scope(self._module, self._position)
|
||||
if not scope.is_scope(): # Might be a flow (if/while/etc).
|
||||
scope = scope.get_parent_scope()
|
||||
scope = self._evaluator.wrap(scope)
|
||||
scope = self._evaluator.create_context(scope)
|
||||
debug.dbg('global completion scope: %s', scope)
|
||||
filters = get_global_filters(
|
||||
self._evaluator,
|
||||
@@ -222,6 +221,7 @@ class Completion:
|
||||
"""
|
||||
Autocomplete inherited methods when overriding in child class.
|
||||
"""
|
||||
return
|
||||
leaf = self._module.get_leaf_for_position(self._position, include_prefixes=True)
|
||||
cls = leaf.get_parent_until(tree.Class)
|
||||
if isinstance(cls, (tree.Class, tree.Function)):
|
||||
|
||||
@@ -192,7 +192,7 @@ def get_possible_completion_types(grammar, stack):
|
||||
return keywords, grammar_labels
|
||||
|
||||
|
||||
def evaluate_goto_definition(evaluator, leaf):
|
||||
def evaluate_goto_definition(evaluator, context, leaf):
|
||||
if leaf.type == 'name':
|
||||
# In case of a name we can just use goto_definition which does all the
|
||||
# magic itself.
|
||||
@@ -207,7 +207,7 @@ def evaluate_goto_definition(evaluator, leaf):
|
||||
|
||||
if node is None:
|
||||
return []
|
||||
return evaluator.eval_element(node)
|
||||
return evaluator.eval_element(context, node)
|
||||
|
||||
|
||||
CallSignatureDetails = namedtuple(
|
||||
@@ -288,7 +288,7 @@ def get_call_signature_details(module, position):
|
||||
|
||||
|
||||
@time_cache("call_signatures_validity")
|
||||
def cache_call_signatures(evaluator, bracket_leaf, code_lines, user_pos):
|
||||
def cache_call_signatures(evaluator, context, bracket_leaf, code_lines, user_pos):
|
||||
"""This function calculates the cache key."""
|
||||
index = user_pos[0] - 1
|
||||
|
||||
@@ -304,5 +304,6 @@ def cache_call_signatures(evaluator, bracket_leaf, code_lines, user_pos):
|
||||
yield (module_path, before_bracket, bracket_leaf.start_pos)
|
||||
yield evaluate_goto_definition(
|
||||
evaluator,
|
||||
context,
|
||||
bracket_leaf.get_previous_leaf()
|
||||
)
|
||||
|
||||
@@ -3,7 +3,7 @@ import keyword
|
||||
|
||||
from jedi._compatibility import is_py3, is_py35
|
||||
from jedi import common
|
||||
from jedi.evaluate.helpers import FakeName
|
||||
from jedi.evaluate.filters import AbstractNameDefinition
|
||||
from jedi.parser.tree import Leaf
|
||||
try:
|
||||
from pydoc_data import topics as pydoc_topics
|
||||
@@ -66,11 +66,17 @@ keywords_only_valid_as_leaf = (
|
||||
)
|
||||
|
||||
|
||||
class KeywordName(AbstractNameDefinition):
|
||||
def __init__(self, evaluator, name):
|
||||
self.string_name = name
|
||||
self.parent_context = evaluator.BUILTINS
|
||||
|
||||
|
||||
class Keyword(object):
|
||||
type = 'completion_keyword'
|
||||
|
||||
def __init__(self, evaluator, name, pos):
|
||||
self.name = FakeName(name, self, pos)
|
||||
self.name = KeywordName(evaluator, name)
|
||||
self.start_pos = pos
|
||||
self.parent = evaluator.BUILTINS
|
||||
|
||||
|
||||
Reference in New Issue
Block a user