1
0
forked from VimPlug/jedi

Merge master into linter.

This commit is contained in:
Dave Halter
2015-12-15 12:28:38 +01:00
11 changed files with 144 additions and 19 deletions

View File

@@ -76,8 +76,8 @@ class Script(object):
:type source: str
:param line: The line to perform actions on (starting with 1).
:type line: int
:param col: The column of the cursor (starting with 0).
:type col: int
:param column: The column of the cursor (starting with 0).
:type column: int
:param path: The path of the file in the file system, or ``''`` if
it hasn't been saved yet.
:type path: str or None
@@ -179,7 +179,7 @@ class Script(object):
if unfinished_dotted:
return completion_names
else:
return keywords.keyword_names(self._evaluator, 'import')
return set([keywords.keyword(self._evaluator, 'import').name])
if isinstance(user_stmt, tree.Import):
module = self._parser.module()
@@ -190,7 +190,11 @@ class Script(object):
if names is None and not isinstance(user_stmt, tree.Import):
if not path and not dot:
# add keywords
completion_names += keywords.keyword_names(self._evaluator, all=True)
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)

View File

@@ -4,7 +4,7 @@ import keyword
from jedi._compatibility import is_py3
from jedi import common
from jedi.evaluate.helpers import FakeName
from jedi.parser.tree import Leaf
try:
from pydoc_data import topics as pydoc_topics
except ImportError:
@@ -17,22 +17,50 @@ else:
keys = keyword.kwlist + ['None', 'False', 'True']
def keywords(evaluator, string='', pos=(0, 0), all=False):
if all:
return set([Keyword(evaluator, k, pos) for k in keys])
def has_inappropriate_leaf_keyword(pos, module):
relevant_errors = filter(
lambda error: error.first_pos[0] == pos[0],
module.error_statement_stacks)
for error in relevant_errors:
if error.next_token in keys:
return True
return False
def completion_names(evaluator, stmt, pos, module):
keyword_list = all_keywords(evaluator)
if not isinstance(stmt, Leaf) or has_inappropriate_leaf_keyword(pos, module):
keyword_list = filter(
lambda keyword: not keyword.only_valid_as_leaf,
keyword_list
)
return [keyword.name for keyword in keyword_list]
def all_keywords(evaluator, pos=(0, 0)):
return set([Keyword(evaluator, k, pos) for k in keys])
def keyword(evaluator, string, pos=(0, 0)):
if string in keys:
return set([Keyword(evaluator, string, pos)])
return set()
def keyword_names(evaluator, *args, **kwargs):
return [k.name for k in keywords(evaluator, *args, **kwargs)]
return Keyword(evaluator, string, pos)
else:
return None
def get_operator(evaluator, string, pos):
return Keyword(evaluator, string, pos)
keywords_only_valid_as_leaf = (
'continue',
'break',
)
class Keyword(object):
def __init__(self, evaluator, name, pos):
self.name = FakeName(name, self, pos)
@@ -42,6 +70,10 @@ class Keyword(object):
def get_parent_until(self):
return self.parent
@property
def only_valid_as_leaf(self):
return self.name.value in keywords_only_valid_as_leaf
@property
def names(self):
""" For a `parsing.Name` like comparision """