1
0
forked from VimPlug/jedi

move module checking again - probably the last time (resolves an import issue)

This commit is contained in:
Dave Halter
2014-01-07 15:20:00 +01:00
parent a74b7299e2
commit 3126031ff2
4 changed files with 49 additions and 52 deletions

View File

@@ -744,7 +744,7 @@ def usages(evaluator, definitions, search_name, mods):
compare_definitions = compare_array(definitions) compare_definitions = compare_array(definitions)
mods |= set([d.get_parent_until() for d in definitions]) mods |= set([d.get_parent_until() for d in definitions])
names = [] names = []
for m in helpers.get_modules_containing_name(mods, search_name): for m in imports.get_modules_containing_name(mods, search_name):
try: try:
stmts = m.used_names[search_name] stmts = m.used_names[search_name]
except KeyError: except KeyError:
@@ -766,8 +766,7 @@ def usages(evaluator, definitions, search_name, mods):
if set(f) & set(definitions): if set(f) & set(definitions):
names.append(api_classes.Usage(evaluator, name_part, stmt)) names.append(api_classes.Usage(evaluator, name_part, stmt))
else: else:
for call in helpers.scan_statements(stmt, search_name, for call in helpers.scan_statement_for_calls(stmt, search_name, assignment_details=True):
assignment_details=True):
names += check_call(call) names += check_call(call)
return names return names

View File

@@ -55,6 +55,7 @@ from jedi.parser import representation as pr
from jedi import settings from jedi import settings
from jedi.evaluate import helpers from jedi.evaluate import helpers
from jedi.evaluate.cache import memoize_default from jedi.evaluate.cache import memoize_default
from jedi.evaluate import imports
# This is something like the sys.path, but only for searching params. It means # This is something like the sys.path, but only for searching params. It means
# that this is the order in which Jedi searches params. # that this is the order in which Jedi searches params.
@@ -173,7 +174,7 @@ def search_params(evaluator, param):
result = [] result = []
# This is like backtracking: Get the first possible result. # This is like backtracking: Get the first possible result.
for mod in helpers.get_modules_containing_name([current_module], func_name): for mod in imports.get_modules_containing_name([current_module], func_name):
result = get_params_for_module(mod) result = get_params_for_module(mod)
if result: if result:
break break

View File

@@ -1,55 +1,7 @@
import os
import copy import copy
from jedi import cache
from jedi import common from jedi import common
from jedi.parser import representation as pr from jedi.parser import representation as pr
from jedi.common import source_to_unicode
from jedi import settings
def get_modules_containing_name(mods, name):
"""
Search a name in the directories of modules.
"""
def check_python_file(path):
try:
return cache.parser_cache[path].parser.module
except KeyError:
try:
return check_fs(path)
except IOError:
return None
def check_fs(path):
with open(path) as f:
source = source_to_unicode(f.read())
if name in source:
from jedi.evaluate import imports
return imports.load_module(path, source)
# skip non python modules
mods = set(m for m in mods if m.path is None or m.path.endswith('.py'))
mod_paths = set()
for m in mods:
mod_paths.add(m.path)
yield m
if settings.dynamic_params_for_other_modules:
paths = set(settings.additional_dynamic_modules)
for p in mod_paths:
if p is not None:
d = os.path.dirname(p)
for entry in os.listdir(d):
if entry not in mod_paths:
if entry.endswith('.py'):
paths.add(d + os.path.sep + entry)
for p in sorted(paths):
# make testing easier, sort it - same results on every interpreter
c = check_python_file(p)
if c is not None and c not in mods:
yield c
def fast_parent_copy(obj): def fast_parent_copy(obj):

View File

@@ -25,6 +25,8 @@ from jedi import cache
from jedi.parser import fast from jedi.parser import fast
from jedi.parser import representation as pr from jedi.parser import representation as pr
from jedi.evaluate import sys_path from jedi.evaluate import sys_path
from jedi import settings
from jedi.common import source_to_unicode
class ModuleNotFound(Exception): class ModuleNotFound(Exception):
@@ -414,3 +416,46 @@ def load_module(path=None, source=None, name=None):
cached = cache.load_parser(path, name) cached = cache.load_parser(path, name)
return load(source) if cached is None else cached.module return load(source) if cached is None else cached.module
def get_modules_containing_name(mods, name):
"""
Search a name in the directories of modules.
"""
def check_python_file(path):
try:
return cache.parser_cache[path].parser.module
except KeyError:
try:
return check_fs(path)
except IOError:
return None
def check_fs(path):
with open(path) as f:
source = source_to_unicode(f.read())
if name in source:
return load_module(path, source)
# skip non python modules
mods = set(m for m in mods if m.path is None or m.path.endswith('.py'))
mod_paths = set()
for m in mods:
mod_paths.add(m.path)
yield m
if settings.dynamic_params_for_other_modules:
paths = set(settings.additional_dynamic_modules)
for p in mod_paths:
if p is not None:
d = os.path.dirname(p)
for entry in os.listdir(d):
if entry not in mod_paths:
if entry.endswith('.py'):
paths.add(d + os.path.sep + entry)
for p in sorted(paths):
# make testing easier, sort it - same results on every interpreter
c = check_python_file(p)
if c is not None and c not in mods:
yield c