Make imports stuff in API classes work. Now goto on imports follows even aliases.

This commit is contained in:
Dave Halter
2014-12-08 12:04:09 +01:00
parent 0ad6aeba6b
commit 8868b87d42
3 changed files with 12 additions and 16 deletions

View File

@@ -67,7 +67,7 @@ class BaseDefinition(object):
""" """
An instance of :class:`jedi.parser.reprsentation.Name` subclass. An instance of :class:`jedi.parser.reprsentation.Name` subclass.
""" """
self._definition = self._name.get_definition() self._definition = er.wrap(evaluator, self._name.get_definition())
self.is_keyword = isinstance(self._definition, keywords.Keyword) self.is_keyword = isinstance(self._definition, keywords.Keyword)
# generate a path to the definition # generate a path to the definition
@@ -162,7 +162,6 @@ class BaseDefinition(object):
return 'import' return 'import'
string = type(stripped).__name__.lower().replace('wrapper', '') string = type(stripped).__name__.lower().replace('wrapper', '')
print(stripped, string)
if string == 'exprstmt': if string == 'exprstmt':
return 'statement' return 'statement'
else: else:
@@ -485,7 +484,7 @@ class Completion(BaseDefinition):
""" """
definition = self._definition definition = self._definition
if isinstance(definition, pr.Import): if isinstance(definition, pr.Import):
i = imports.ImportWrapper(self._evaluator, definition) i = imports.ImportWrapper(self._evaluator, self._name)
if len(i.import_path) > 1 or not fast: if len(i.import_path) > 1 or not fast:
followed = self._follow_statements_imports() followed = self._follow_statements_imports()
if followed: if followed:
@@ -504,7 +503,7 @@ class Completion(BaseDefinition):
description, look at :attr:`jedi.api.classes.BaseDefinition.type`. description, look at :attr:`jedi.api.classes.BaseDefinition.type`.
""" """
if isinstance(self._definition, pr.Import): if isinstance(self._definition, pr.Import):
i = imports.ImportWrapper(self._evaluator, self._definition) i = imports.ImportWrapper(self._evaluator, self._name)
if len(i.import_path) <= 1: if len(i.import_path) <= 1:
return 'module' return 'module'
@@ -521,14 +520,9 @@ class Completion(BaseDefinition):
# imports completion is very complicated and needs to be treated # imports completion is very complicated and needs to be treated
# separately in Completion. # separately in Completion.
definition = self._definition definition = self._definition
if definition.isinstance(pr.Import) and definition.alias is None: if definition.isinstance(pr.Import):
i = imports.ImportWrapper(self._evaluator, definition, True) i = imports.ImportWrapper(self._evaluator, self._name)
import_path = i.import_path + (unicode(self._name),) return i.follow()
try:
return imports.get_importer(self._evaluator, import_path,
i._importer.module).follow(self._evaluator)
except imports.ModuleNotFound:
pass
return super(Completion, self)._follow_statements_imports() return super(Completion, self)._follow_statements_imports()
@memoize_default() @memoize_default()

View File

@@ -29,7 +29,6 @@ from jedi.common import source_to_unicode
from jedi.evaluate import compiled from jedi.evaluate import compiled
from jedi.evaluate import analysis from jedi.evaluate import analysis
from jedi.evaluate.cache import memoize_default, NO_DEFAULT from jedi.evaluate.cache import memoize_default, NO_DEFAULT
from jedi.evaluate.helpers import FakeSubModule
class ModuleNotFound(Exception): class ModuleNotFound(Exception):
@@ -599,7 +598,7 @@ class _Importer(object):
return _load_module(self._evaluator, name=path, sys_path=sys_path), rest return _load_module(self._evaluator, name=path, sys_path=sys_path), rest
def _generate_name(self, name): def _generate_name(self, name):
return helpers.FakeName(name, parent=FakeSubModule) return helpers.FakeName(name, parent=self.module)
def _get_module_names(self, search_path=None): def _get_module_names(self, search_path=None):
""" """

View File

@@ -95,7 +95,7 @@ def test_function_call_signature_in_doc():
pass pass
f""").goto_definitions() f""").goto_definitions()
doc = defs[0].doc doc = defs[0].doc
assert "f(x, y = 1, z = 'a')" in str(doc) assert "f(x, y=1, z='a')" in str(doc)
def test_class_call_signature(): def test_class_call_signature():
@@ -308,4 +308,7 @@ class TestGotoAssignments(TestCase):
assert nms[1].name == 'foo' assert nms[1].name == 'foo'
assert nms[1].type == 'import' assert nms[1].type == 'import'
assert [nms[1]] == nms[1].goto_assignments() ass = nms[1].goto_assignments()
assert len(ass) == 1
assert ass[0].name == 'json'
assert ass[0].type == 'module'