1
0
forked from VimPlug/jedi

moved another method away from dynamic

This commit is contained in:
Dave Halter
2014-01-07 15:01:59 +01:00
parent 8a9453872f
commit a5fa739960
3 changed files with 51 additions and 52 deletions

View File

@@ -745,7 +745,7 @@ def usages(evaluator, definitions, search_name, mods):
compare_definitions = compare_array(definitions)
mods |= set([d.get_parent_until() for d in definitions])
names = []
for m in dynamic.get_directory_modules_for_name(mods, search_name):
for m in helpers.get_modules_containing_name(mods, search_name):
try:
stmts = m.used_names[search_name]
except KeyError:

View File

@@ -51,12 +51,9 @@ would check whether a flow has the form of ``if isinstance(a, type_or_tuple)``.
Unfortunately every other thing is being ignored (e.g. a == '' would be easy to
check for -> a is a string). There's big potential in these checks.
"""
import os
from jedi import cache
from jedi.common import source_to_unicode
from jedi.parser import representation as pr
from jedi import settings
from jedi.evaluate import helpers
from jedi.evaluate.cache import memoize_default
# This is something like the sys.path, but only for searching params. It means
@@ -64,50 +61,6 @@ from jedi.evaluate.cache import memoize_default
search_param_modules = ['.']
def get_directory_modules_for_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
class ParamListener(object):
"""
This listener is used to get the params for a function.
@@ -220,7 +173,7 @@ def search_params(evaluator, param):
result = []
# This is like backtracking: Get the first possible result.
for mod in get_directory_modules_for_name([current_module], func_name):
for mod in helpers.get_modules_containing_name([current_module], func_name):
result = get_params_for_module(mod)
if result:
break

View File

@@ -1,9 +1,55 @@
from __future__ import with_statement
import os
import copy
from jedi import cache
from jedi import common
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):