diff --git a/jedi/inference/compiled/access.py b/jedi/inference/compiled/access.py index 79fa4341..54f01691 100644 --- a/jedi/inference/compiled/access.py +++ b/jedi/inference/compiled/access.py @@ -386,6 +386,21 @@ class DirectObjectAccess(object): if inspect.ismodule(return_obj): return [access] + try: + module = return_obj.__module__ + except AttributeError: + pass + else: + try: + __import__(module) + # For some modules like _sqlite3, the __module__ for classes is + # different, in this case it's sqlite3. So we have to try to + # load that "original" module, because it's not loaded yet. If + # we don't do that, we don't really have a "parent" module and + # we would fall back to builtins. + except ImportError: + pass + module = inspect.getmodule(return_obj) if module is None: module = inspect.getmodule(type(return_obj)) diff --git a/test/test_inference/test_gradual/test_conversion.py b/test/test_inference/test_gradual/test_conversion.py new file mode 100644 index 00000000..e2f2b9ed --- /dev/null +++ b/test/test_inference/test_gradual/test_conversion.py @@ -0,0 +1,16 @@ +from os.path import join + +from jedi.inference.gradual.conversion import convert_names + + +def test_sqlite3_conversion(Script): + script1 = Script('import sqlite3; sqlite3.Connection') + d, = script1.goto_definitions() + + assert not d.module_path + assert d.full_name == 'sqlite3.Connection' + assert convert_names([d._name], only_stubs=True) + + d, = script1.goto_definitions(only_stubs=True) + assert d.is_stub() + assert d.full_name == 'sqlite3.dbapi2.Connection'