Usage fixes for imports.

This commit is contained in:
Dave Halter
2016-11-19 03:05:10 +01:00
parent b77fa58058
commit e79ebe3ee7
3 changed files with 32 additions and 29 deletions

View File

@@ -266,28 +266,22 @@ class Script(object):
if name is None: if name is None:
# Must be syntax # Must be syntax
return [] return []
self._evaluator
definition_names = [TreeNameDefinition(self._get_module(), name)] definition_names = [TreeNameDefinition(self._get_module(), name)]
if not definition_names: if not definition_names:
# Without a definition for a name we cannot find references. # Without a definition for a name we cannot find references.
return [] return []
if not isinstance(user_stmt, tree.Import) and False: definition_names = usages.resolve_potential_imports(self._evaluator,
# import case is looked at with add_import_name option
definition_names = usages.usages_add_import_modules(self._evaluator,
definition_names) definition_names)
modules = set([d.get_root_context() for d in definition_names]) modules = set([d.get_root_context() for d in definition_names])
modules.add(self._get_module()) modules.add(self._get_module())
names = usages.usages(self._evaluator, definition_names, modules) definitions = usages.usages(self._evaluator, definition_names, modules)
for d in set(definition_names):
names.append(classes.Definition(self._evaluator, d))
finally: finally:
settings.dynamic_flow_information = temp settings.dynamic_flow_information = temp
return helpers.sorted_definitions(set(names)) return helpers.sorted_definitions(set(definitions))
def call_signatures(self): def call_signatures(self):
""" """

View File

@@ -1,8 +1,8 @@
from jedi._compatibility import unicode
from jedi.api import classes from jedi.api import classes
from jedi.parser import tree from jedi.parser import tree
from jedi.evaluate import imports from jedi.evaluate import imports
from jedi.evaluate.filters import TreeNameDefinition from jedi.evaluate.filters import TreeNameDefinition
from jedi.evaluate.representation import ModuleContext
def usages(evaluator, definition_names, mods): def usages(evaluator, definition_names, mods):
@@ -22,27 +22,31 @@ def usages(evaluator, definition_names, mods):
search_name = list(definition_names)[0].string_name search_name = list(definition_names)[0].string_name
compare_definitions = compare_array(definition_names) compare_definitions = compare_array(definition_names)
mods = mods | set([d.get_root_context() for d in definition_names]) mods = mods | set([d.get_root_context() for d in definition_names])
definitions = [] definition_names = set(definition_names)
for m in imports.get_modules_containing_name(evaluator, mods, search_name): for m in imports.get_modules_containing_name(evaluator, mods, search_name):
if isinstance(m, ModuleContext):
for name_node in m.module_node.used_names.get(search_name, []): for name_node in m.module_node.used_names.get(search_name, []):
context = evaluator.create_context(m, name_node) context = evaluator.create_context(m, name_node)
result = evaluator.goto(context, name_node) result = evaluator.goto(context, name_node)
if [c for c in compare_array(result) if c in compare_definitions]: if [c for c in compare_array(result) if c in compare_definitions]:
name = TreeNameDefinition(context, name_node) name = TreeNameDefinition(context, name_node)
definitions.append(classes.Definition(evaluator, name)) definition_names.add(name)
# Previous definitions might be imports, so include them # Previous definitions might be imports, so include them
# (because goto might return that import name). # (because goto might return that import name).
compare_definitions += compare_array([name]) compare_definitions += compare_array([name])
return definitions else:
definition_names.add(m.name)
return [classes.Definition(evaluator, n) for n in definition_names]
def usages_add_import_modules(evaluator, definitions): def resolve_potential_imports(evaluator, definitions):
""" Adds the modules of the imports """ """ Adds the modules of the imports """
new = set() new = set()
for d in definitions: for d in definitions:
print(d) if isinstance(d, TreeNameDefinition):
imp_or_stmt = d.get_definition() imp_or_stmt = d.tree_name.get_definition()
if isinstance(imp_or_stmt, tree.Import): if isinstance(imp_or_stmt, tree.Import):
s = imports.ImportWrapper(context, d) s = imports.ImportWrapper(d.parent_context, d.tree_name)
new |= set(s.follow(is_goto=True)) new |= resolve_potential_imports(evaluator, set(s.follow(is_goto=True)))
return set(definitions) | new return set(definitions) | new

View File

@@ -501,7 +501,12 @@ def get_modules_containing_name(evaluator, modules, name):
# skip non python modules # skip non python modules
used_mod_paths = set() used_mod_paths = set()
for m in modules: for m in modules:
used_mod_paths.add(m.py__file__()) try:
path = m.py__file__()
except AttributeError:
pass
else:
used_mod_paths.add(path)
yield m yield m
if not settings.dynamic_params_for_other_modules: if not settings.dynamic_params_for_other_modules: