1
0
forked from VimPlug/jedi

A lot of small improvements.

This commit is contained in:
Dave Halter
2016-10-22 17:40:42 +02:00
parent 4ccfbb4962
commit 2e6603cc2e
16 changed files with 174 additions and 149 deletions

View File

@@ -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

View File

@@ -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:

View File

@@ -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)):

View File

@@ -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()
)

View File

@@ -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