mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-07 14:34:31 +08:00
import completion fully working
This commit is contained in:
@@ -647,7 +647,7 @@ class Generator(object):
|
|||||||
content of a generator.
|
content of a generator.
|
||||||
"""
|
"""
|
||||||
names = []
|
names = []
|
||||||
none_pos = (None,None)
|
none_pos = (0, 0)
|
||||||
executes_generator = ('__next__', 'send')
|
executes_generator = ('__next__', 'send')
|
||||||
for n in ('close', 'throw') + executes_generator:
|
for n in ('close', 'throw') + executes_generator:
|
||||||
name = parsing.Name([n], none_pos, none_pos)
|
name = parsing.Name([n], none_pos, none_pos)
|
||||||
|
|||||||
@@ -162,7 +162,6 @@ def complete(source, line, column, source_path):
|
|||||||
if not isinstance(s, evaluate.Function):
|
if not isinstance(s, evaluate.Function):
|
||||||
completions += s.get_defined_names()
|
completions += s.get_defined_names()
|
||||||
|
|
||||||
#completions[0].
|
|
||||||
completions = [c for c in completions
|
completions = [c for c in completions
|
||||||
if c.names[-1].lower().startswith(like.lower())]
|
if c.names[-1].lower().startswith(like.lower())]
|
||||||
|
|
||||||
|
|||||||
17
imports.py
17
imports.py
@@ -14,7 +14,9 @@ class ModuleNotFound(Exception):
|
|||||||
|
|
||||||
|
|
||||||
class ImportPath(object):
|
class ImportPath(object):
|
||||||
global_namespace = object()
|
class GlobalNamespace(object):
|
||||||
|
pass
|
||||||
|
|
||||||
def __init__(self, import_stmt, is_like_search=False):
|
def __init__(self, import_stmt, is_like_search=False):
|
||||||
""" replace """
|
""" replace """
|
||||||
#print import_stmt
|
#print import_stmt
|
||||||
@@ -24,6 +26,7 @@ class ImportPath(object):
|
|||||||
if import_stmt.namespace:
|
if import_stmt.namespace:
|
||||||
self.import_path += import_stmt.namespace.names
|
self.import_path += import_stmt.namespace.names
|
||||||
|
|
||||||
|
self.is_like_search = is_like_search
|
||||||
if is_like_search:
|
if is_like_search:
|
||||||
# drop one path part, because that is used by the like search
|
# drop one path part, because that is used by the like search
|
||||||
self.import_path.pop()
|
self.import_path.pop()
|
||||||
@@ -33,7 +36,7 @@ class ImportPath(object):
|
|||||||
def get_defined_names(self):
|
def get_defined_names(self):
|
||||||
names = []
|
names = []
|
||||||
for scope in self.follow():
|
for scope in self.follow():
|
||||||
if scope is ImportPath.global_namespace:
|
if scope is ImportPath.GlobalNamespace:
|
||||||
names += self.get_module_names()
|
names += self.get_module_names()
|
||||||
names += self.get_module_names([self.file_path])
|
names += self.get_module_names([self.file_path])
|
||||||
else:
|
else:
|
||||||
@@ -49,8 +52,8 @@ class ImportPath(object):
|
|||||||
def get_module_names(self, search_path=None):
|
def get_module_names(self, search_path=None):
|
||||||
names = []
|
names = []
|
||||||
for module_loader, name, is_pkg in pkgutil.iter_modules(search_path):
|
for module_loader, name, is_pkg in pkgutil.iter_modules(search_path):
|
||||||
names.append(parsing.Name([name], (float('inf'), float('inf')),
|
inf = float('inf')
|
||||||
(float('inf'), float('inf'))))
|
names.append(parsing.Name([name], (inf, inf), (inf, inf)))
|
||||||
return names
|
return names
|
||||||
|
|
||||||
def follow(self):
|
def follow(self):
|
||||||
@@ -58,7 +61,9 @@ class ImportPath(object):
|
|||||||
"""
|
"""
|
||||||
if self.import_path:
|
if self.import_path:
|
||||||
scope, rest = self.follow_file_system()
|
scope, rest = self.follow_file_system()
|
||||||
if rest:
|
if len(rest) > 1 or rest and self.is_like_search:
|
||||||
|
scopes = []
|
||||||
|
elif rest:
|
||||||
scopes = evaluate.follow_path(iter(rest), scope)
|
scopes = evaluate.follow_path(iter(rest), scope)
|
||||||
else:
|
else:
|
||||||
scopes = [scope]
|
scopes = [scope]
|
||||||
@@ -68,7 +73,7 @@ class ImportPath(object):
|
|||||||
new += remove_star_imports(scope)
|
new += remove_star_imports(scope)
|
||||||
scopes += new
|
scopes += new
|
||||||
else:
|
else:
|
||||||
scopes = [ImportPath.global_namespace]
|
scopes = [ImportPath.GlobalNamespace]
|
||||||
debug.dbg('after import', scopes)
|
debug.dbg('after import', scopes)
|
||||||
return scopes
|
return scopes
|
||||||
|
|
||||||
|
|||||||
19
parsing.py
19
parsing.py
@@ -934,7 +934,7 @@ class PyFuzzyParser(object):
|
|||||||
:param user_position: The line/column, the user is currently on.
|
:param user_position: The line/column, the user is currently on.
|
||||||
:type user_position: tuple(int, int)
|
:type user_position: tuple(int, int)
|
||||||
"""
|
"""
|
||||||
def __init__(self, code, module_path=None, user_position=(None,None)):
|
def __init__(self, code, module_path=None, user_position=None):
|
||||||
self.user_position = user_position
|
self.user_position = user_position
|
||||||
self.user_stmt = None
|
self.user_stmt = None
|
||||||
self.code = code + '\n' # end with \n, because the parser needs it
|
self.code = code + '\n' # end with \n, because the parser needs it
|
||||||
@@ -969,18 +969,19 @@ class PyFuzzyParser(object):
|
|||||||
return (self._line_of_tokenize_restart + self._tokenize_end_pos[0],
|
return (self._line_of_tokenize_restart + self._tokenize_end_pos[0],
|
||||||
self._tokenize_end_pos[1])
|
self._tokenize_end_pos[1])
|
||||||
|
|
||||||
def check_user_stmt(self, i):
|
def check_user_stmt(self, simple):
|
||||||
|
if not self.user_position:
|
||||||
|
return
|
||||||
# the position is right
|
# the position is right
|
||||||
if i.start_pos < self.user_position <= i.end_pos:
|
if simple.start_pos < self.user_position <= simple.end_pos:
|
||||||
if self.user_stmt is not None:
|
if self.user_stmt is not None:
|
||||||
# if there is already a user position (another import, because
|
# if there is already a user position (another import, because
|
||||||
# imports are splitted) the names are checked.
|
# imports are splitted) the names are checked.
|
||||||
for n in i.get_defined_names():
|
for n in simple.get_defined_names():
|
||||||
if n.start_pos < self.user_position <= n.end_pos:
|
if n.start_pos < self.user_position <= n.end_pos:
|
||||||
self.user_stmt = i
|
self.user_stmt = simple
|
||||||
else:
|
else:
|
||||||
self.user_stmt = i
|
self.user_stmt = simple
|
||||||
#print 'up', self.user_stmt
|
|
||||||
|
|
||||||
|
|
||||||
def _parsedotname(self, pre_used_token=None):
|
def _parsedotname(self, pre_used_token=None):
|
||||||
@@ -1246,6 +1247,7 @@ class PyFuzzyParser(object):
|
|||||||
if self.freshscope and len(tok_list) > 1 \
|
if self.freshscope and len(tok_list) > 1 \
|
||||||
and self.last_token[1] == tokenize.STRING:
|
and self.last_token[1] == tokenize.STRING:
|
||||||
self.scope.add_docstr(self.last_token[1])
|
self.scope.add_docstr(self.last_token[1])
|
||||||
|
print('i want to see you')
|
||||||
else:
|
else:
|
||||||
stmt = stmt_class(string, set_vars, used_funcs, used_vars, \
|
stmt = stmt_class(string, set_vars, used_funcs, used_vars, \
|
||||||
tok_list, first_pos, self.end_pos)
|
tok_list, first_pos, self.end_pos)
|
||||||
@@ -1265,7 +1267,7 @@ class PyFuzzyParser(object):
|
|||||||
""" Generate the next tokenize pattern. """
|
""" Generate the next tokenize pattern. """
|
||||||
type, tok, self._tokenize_start_pos, self._tokenize_end_pos, \
|
type, tok, self._tokenize_start_pos, self._tokenize_end_pos, \
|
||||||
self.parserline = next(self.gen)
|
self.parserline = next(self.gen)
|
||||||
if self.start_pos[0] == self.user_position[0]:
|
if self.user_position and self.start_pos[0] == self.user_position[0]:
|
||||||
debug.dbg('user scope found [%s] =%s' % \
|
debug.dbg('user scope found [%s] =%s' % \
|
||||||
(self.parserline.replace('\n', ''), repr(self.scope)))
|
(self.parserline.replace('\n', ''), repr(self.scope)))
|
||||||
self.user_scope = self.scope
|
self.user_scope = self.scope
|
||||||
@@ -1344,7 +1346,6 @@ class PyFuzzyParser(object):
|
|||||||
i = Import(first_pos, self.end_pos, m, alias,
|
i = Import(first_pos, self.end_pos, m, alias,
|
||||||
defunct=defunct)
|
defunct=defunct)
|
||||||
self.check_user_stmt(i)
|
self.check_user_stmt(i)
|
||||||
self.user_stmt = i
|
|
||||||
self.scope.add_import(i)
|
self.scope.add_import(i)
|
||||||
debug.dbg("new import: %s" % (i), self.current)
|
debug.dbg("new import: %s" % (i), self.current)
|
||||||
if not imports:
|
if not imports:
|
||||||
|
|||||||
@@ -64,7 +64,13 @@ import sqlite
|
|||||||
import classes
|
import classes
|
||||||
|
|
||||||
#? ['timedelta']
|
#? ['timedelta']
|
||||||
from datetime import timedelta
|
from datetime import timedel
|
||||||
|
|
||||||
|
# should not be possible, because names can only be looked up 1 level deep.
|
||||||
|
#? []
|
||||||
|
from datetime.timedelta import resolution
|
||||||
|
#? []
|
||||||
|
from datetime.timedelta import
|
||||||
|
|
||||||
#? ['Cursor']
|
#? ['Cursor']
|
||||||
from sqlite3 import Cursor
|
from sqlite3 import Cursor
|
||||||
|
|||||||
Reference in New Issue
Block a user