Don't use goto_definitions anymore, use infer

This commit is contained in:
Dave Halter
2019-12-20 19:02:18 +01:00
parent 4bbaec68e8
commit d7d9c9642a
30 changed files with 131 additions and 137 deletions

View File

@@ -18,7 +18,7 @@ def test_simple_annotations(Script, environment):
annot('')""")
assert [d.name for d in Script(source).goto_definitions()] == ['str']
assert [d.name for d in Script(source).infer()] == ['str']
source = dedent("""\
@@ -26,7 +26,7 @@ def test_simple_annotations(Script, environment):
return a
annot_ret('')""")
assert [d.name for d in Script(source).goto_definitions()] == ['str']
assert [d.name for d in Script(source).infer()] == ['str']
source = dedent("""\
def annot(a:int):
@@ -34,7 +34,7 @@ def test_simple_annotations(Script, environment):
annot('')""")
assert [d.name for d in Script(source).goto_definitions()] == ['int']
assert [d.name for d in Script(source).infer()] == ['int']
@pytest.mark.parametrize('reference', [
@@ -50,7 +50,7 @@ def test_illegal_forward_references(Script, environment, reference):
source = 'def foo(bar: "%s"): bar' % reference
assert not Script(source).goto_definitions()
assert not Script(source).infer()
def test_lambda_forward_references(Script, environment):
@@ -61,4 +61,4 @@ def test_lambda_forward_references(Script, environment):
# For now just receiving the 3 is ok. I'm doubting that this is what we
# want. We also execute functions. Should we only execute classes?
assert Script(source).goto_definitions()
assert Script(source).infer()

View File

@@ -61,7 +61,7 @@ def test_doc(inference_state):
def test_string_literals(Script, environment):
def typ(string):
d = Script("a = %s; a" % string).goto_definitions()[0]
d = Script("a = %s; a" % string).infer()[0]
return d.name
assert typ('""') == 'str'
@@ -98,12 +98,12 @@ def test_dict_values(Script, environment):
if environment.version_info.major == 2:
# It looks like typeshed for Python 2 returns Any.
pytest.skip()
assert Script('import sys\nsys.modules["alshdb;lasdhf"]').goto_definitions()
assert Script('import sys\nsys.modules["alshdb;lasdhf"]').infer()
def test_getitem_on_none(Script):
script = Script('None[1j]')
assert not script.goto_definitions()
assert not script.infer()
issue, = script._inference_state.analysis
assert issue.name == 'type-error-not-subscriptable'

View File

@@ -11,11 +11,11 @@ def test_module_attributes(Script):
def test_module__file__(Script, environment):
assert not Script('__file__').goto_definitions()
def_, = Script('__file__', path='example.py').goto_definitions()
assert not Script('__file__').infer()
def_, = Script('__file__', path='example.py').infer()
value = force_unicode(def_._name._value.get_safe_value())
assert value.endswith('example.py')
def_, = Script('import antigravity; antigravity.__file__').goto_definitions()
def_, = Script('import antigravity; antigravity.__file__').infer()
value = force_unicode(def_._name._value.get_safe_value())
assert value.endswith('.py')

View File

@@ -32,7 +32,7 @@ def test_function_doc(Script):
defs = Script("""
def func():
'''Docstring of `func`.'''
func""").goto_definitions()
func""").infer()
assert defs[0].docstring() == 'func()\n\nDocstring of `func`.'
@@ -40,7 +40,7 @@ def test_class_doc(Script):
defs = Script("""
class TestClass():
'''Docstring of `TestClass`.'''
TestClass""").goto_definitions()
TestClass""").infer()
expected = 'Docstring of `TestClass`.'
assert defs[0].docstring(raw=True) == expected
@@ -52,7 +52,7 @@ def test_class_doc_with_init(Script):
class TestClass():
'''Docstring'''
def __init__(self, foo, bar=3): pass
TestClass""").goto_definitions()
TestClass""").infer()
assert d.docstring() == 'TestClass(foo, bar=3)\n\nDocstring'
@@ -62,7 +62,7 @@ def test_instance_doc(Script):
class TestClass():
'''Docstring of `TestClass`.'''
tc = TestClass()
tc""").goto_definitions()
tc""").infer()
assert defs[0].docstring() == 'Docstring of `TestClass`.'
@@ -71,7 +71,7 @@ def test_attribute_docstring(Script):
defs = Script("""
x = None
'''Docstring of `x`.'''
x""").goto_definitions()
x""").infer()
assert defs[0].docstring() == 'Docstring of `x`.'
@@ -82,7 +82,7 @@ def test_multiple_docstrings(Script):
'''Original docstring.'''
x = func
'''Docstring of `x`.'''
x""").goto_definitions()
x""").infer()
docs = [d.docstring() for d in defs]
assert docs == ['Original docstring.', 'Docstring of `x`.']
@@ -167,7 +167,7 @@ def test_docstring_params_formatting(Script):
param2,
param3):
pass
func""").goto_definitions()
func""").infer()
assert defs[0].docstring() == 'func(param1, param2, param3)'
@@ -412,7 +412,7 @@ def test_decorator(Script):
check_user''')
d, = Script(code).goto_definitions()
d, = Script(code).infer()
assert d.docstring(raw=True) == 'Nice docstring'

View File

@@ -7,18 +7,18 @@ from jedi.inference.gradual.conversion import convert_names
def test_sqlite3_conversion(Script):
script1 = Script('import sqlite3; sqlite3.Connection')
d, = script1.goto_definitions()
d, = script1.infer()
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)
d, = script1.infer(only_stubs=True)
assert d.is_stub()
assert d.full_name == 'sqlite3.dbapi2.Connection'
script2 = Script(path=d.module_path, line=d.line, column=d.column)
d, = script2.goto_definitions()
script2 = Script(path=d.module_path)
d, = script2.infer(line=d.line, column=d.column)
assert not d.is_stub()
assert d.full_name == 'sqlite3.Connection'
v, = d._name.infer()

View File

@@ -23,5 +23,5 @@ def ScriptInStubFolder(Script):
]
)
def test_find_stubs_infer(ScriptInStubFolder, code, expected):
defs = ScriptInStubFolder(code).goto_definitions()
defs = ScriptInStubFolder(code).infer()
assert [d.name for d in defs] == expected

View File

@@ -66,7 +66,7 @@ def test_infer_and_goto(Script, code, full_name, has_stub, has_python, way,
if type_ == 'goto':
defs = s.goto_assignments(follow_imports=True, **kwargs)
else:
defs = s.goto_definitions(**kwargs)
defs = s.infer(**kwargs)
else:
goto_defs = s.goto_assignments(
# Prefering stubs when we want to go to python and vice versa

View File

@@ -46,21 +46,21 @@ def test_get_stub_files():
def test_function(Script, environment):
code = 'import threading; threading.current_thread'
def_, = Script(code).goto_definitions()
def_, = Script(code).infer()
value = def_._name._value
assert isinstance(value, FunctionValue), value
def_, = Script(code + '()').goto_definitions()
def_, = Script(code + '()').infer()
value = def_._name._value
assert isinstance(value, TreeInstance)
def_, = Script('import threading; threading.Thread').goto_definitions()
def_, = Script('import threading; threading.Thread').infer()
assert isinstance(def_._name._value, ClassValue), def_
def test_keywords_variable(Script):
code = 'import keyword; keyword.kwlist'
for seq in Script(code).goto_definitions():
for seq in Script(code).infer():
assert seq.name == 'Sequence'
# This points towards the typeshed implementation
stub_seq, = seq.goto(only_stubs=True)
@@ -68,31 +68,31 @@ def test_keywords_variable(Script):
def test_class(Script):
def_, = Script('import threading; threading.Thread').goto_definitions()
def_, = Script('import threading; threading.Thread').infer()
value = def_._name._value
assert isinstance(value, ClassValue), value
def test_instance(Script):
def_, = Script('import threading; threading.Thread()').goto_definitions()
def_, = Script('import threading; threading.Thread()').infer()
value = def_._name._value
assert isinstance(value, TreeInstance)
def test_class_function(Script):
def_, = Script('import threading; threading.Thread.getName').goto_definitions()
def_, = Script('import threading; threading.Thread.getName').infer()
value = def_._name._value
assert isinstance(value, MethodValue), value
def test_method(Script):
code = 'import threading; threading.Thread().getName'
def_, = Script(code).goto_definitions()
def_, = Script(code).infer()
value = def_._name._value
assert isinstance(value, BoundMethod), value
assert isinstance(value._wrapped_value, MethodValue), value
def_, = Script(code + '()').goto_definitions()
def_, = Script(code + '()').infer()
value = def_._name._value
assert isinstance(value, TreeInstance)
assert value.class_value.py__name__() == 'str'
@@ -100,13 +100,13 @@ def test_method(Script):
def test_sys_exc_info(Script):
code = 'import sys; sys.exc_info()'
none, def_ = Script(code + '[1]').goto_definitions()
none, def_ = Script(code + '[1]').infer()
# It's an optional.
assert def_.name == 'BaseException'
assert def_.type == 'instance'
assert none.name == 'NoneType'
none, def_ = Script(code + '[0]').goto_definitions()
none, def_ = Script(code + '[0]').infer()
assert def_.name == 'BaseException'
assert def_.type == 'class'
@@ -114,7 +114,7 @@ def test_sys_exc_info(Script):
def test_sys_getwindowsversion(Script, environment):
# This should only exist on Windows, but type inference should happen
# everywhere.
definitions = Script('import sys; sys.getwindowsversion().major').goto_definitions()
definitions = Script('import sys; sys.getwindowsversion().major').infer()
if environment.version_info.major == 2:
assert not definitions
else:
@@ -127,19 +127,19 @@ def test_sys_hexversion(Script):
def_, = script.complete()
assert isinstance(def_._name, stub_value._StubName), def_._name
assert typeshed.TYPESHED_PATH in def_.module_path
def_, = script.goto_definitions()
def_, = script.infer()
assert def_.name == 'int'
def test_math(Script):
def_, = Script('import math; math.acos()').goto_definitions()
def_, = Script('import math; math.acos()').infer()
assert def_.name == 'float'
value = def_._name._value
assert value
def test_type_var(Script):
def_, = Script('import typing; T = typing.TypeVar("T1")').goto_definitions()
def_, = Script('import typing; T = typing.TypeVar("T1")').infer()
assert def_.name == 'TypeVar'
assert def_.description == 'TypeVar = object()'
@@ -152,7 +152,7 @@ def test_type_var(Script):
)
def test_math_is_stub(Script, code, full_name):
s = Script(code)
cos, = s.goto_definitions()
cos, = s.infer()
wanted = os.path.join('typeshed', 'stdlib', '2and3', 'math.pyi')
assert cos.module_path.endswith(wanted)
assert cos.is_stub() is True
@@ -168,7 +168,7 @@ def test_math_is_stub(Script, code, full_name):
def test_goto_stubs(Script):
s = Script('import os; os')
os_module, = s.goto_definitions()
os_module, = s.infer()
assert os_module.full_name == 'os'
assert os_module.is_stub() is False
stub, = os_module.goto(only_stubs=True)
@@ -199,20 +199,16 @@ def test_goto_stubs_on_itself(Script, code, type_):
"""
s = Script(code)
if type_ == 'infer':
def_, = s.goto_definitions()
def_, = s.infer()
else:
def_, = s.goto_assignments(follow_imports=True)
stub, = def_.goto(only_stubs=True)
script_on_source = Script(
path=def_.module_path,
line=def_.line,
column=def_.column
)
script_on_source = Script(path=def_.module_path)
if type_ == 'infer':
definition, = script_on_source.goto_definitions()
definition, = script_on_source.infer(def_.line, def_.column)
else:
definition, = script_on_source.goto_assignments()
definition, = script_on_source.goto(def_.line, def_.column)
same_stub, = definition.goto(only_stubs=True)
_assert_is_same(same_stub, stub)
_assert_is_same(definition, def_)
@@ -221,15 +217,13 @@ def test_goto_stubs_on_itself(Script, code, type_):
# And the reverse.
script_on_stub = Script(
path=same_stub.module_path,
line=same_stub.line,
column=same_stub.column
)
if type_ == 'infer':
same_definition, = script_on_stub.goto_definitions()
same_definition, = script_on_stub.infer(same_stub.line, same_stub.column)
same_definition2, = same_stub.infer()
else:
same_definition, = script_on_stub.goto_assignments()
same_definition, = script_on_stub.goto(same_stub.line, same_stub.column)
same_definition2, = same_stub.goto()
_assert_is_same(same_definition, definition)

View File

@@ -17,9 +17,9 @@ def test_implicit_namespace_package(Script):
return Script(sys_path=sys_path, *args, **kwargs)
# goto definition
assert script_with_path('from pkg import ns1_file').goto_definitions()
assert script_with_path('from pkg import ns2_file').goto_definitions()
assert not script_with_path('from pkg import ns3_file').goto_definitions()
assert script_with_path('from pkg import ns1_file').infer()
assert script_with_path('from pkg import ns2_file').infer()
assert not script_with_path('from pkg import ns3_file').infer()
# goto assignment
tests = {
@@ -57,11 +57,11 @@ def test_implicit_nested_namespace_package(Script):
script = Script(sys_path=sys_path, source=code, line=1, column=61)
result = script.goto_definitions()
result = script.infer()
assert len(result) == 1
implicit_pkg, = Script(code, column=10, sys_path=sys_path).goto_definitions()
implicit_pkg, = Script(code, sys_path=sys_path).infer(column=10)
assert implicit_pkg.type == 'module'
assert implicit_pkg.module_path is None
@@ -91,7 +91,7 @@ def test_namespace_package_in_multiple_directories_goto_definition(Script):
sys_path = [join(dirname(__file__), d)
for d in ['implicit_namespace_package/ns1', 'implicit_namespace_package/ns2']]
script = Script(sys_path=sys_path, source=CODE)
result = script.goto_definitions()
result = script.infer()
assert len(result) == 1

View File

@@ -87,7 +87,7 @@ def test_find_module_package_zipped(Script, inference_state, environment):
def test_correct_zip_package_behavior(Script, inference_state, environment, code,
file, package, path, skip_python2):
sys_path = environment.get_sys_path() + [pkg_zip_path]
pkg, = Script(code, sys_path=sys_path).goto_definitions()
pkg, = Script(code, sys_path=sys_path).infer()
value, = pkg._name.infer()
assert value.py__file__() == os.path.join(pkg_zip_path, 'pkg', file)
assert '.'.join(value.py__package__()) == package
@@ -118,12 +118,12 @@ def test_import_not_in_sys_path(Script):
This is in the end just a fallback.
"""
a = Script(path='module.py', line=5).goto_definitions()
a = Script(path='module.py').infer(line=5)
assert a[0].name == 'int'
a = Script(path='module.py', line=6).goto_definitions()
a = Script(path='module.py').infer(line=6)
assert a[0].name == 'str'
a = Script(path='module.py', line=7).goto_definitions()
a = Script(path='module.py').infer(line=7)
assert a[0].name == 'str'
@@ -157,7 +157,7 @@ def test_not_importable_file(Script):
def test_import_unique(Script):
src = "import os; os.path"
defs = Script(src, path='example.py').goto_definitions()
defs = Script(src, path='example.py').infer()
parent_contexts = [d._name._value for d in defs]
assert len(parent_contexts) == len(set(parent_contexts))
@@ -191,8 +191,8 @@ def test_import_completion_docstring(Script):
def test_goto_definition_on_import(Script):
assert Script("import sys_blabla", 1, 8).goto_definitions() == []
assert len(Script("import sys", 1, 8).goto_definitions()) == 1
assert Script("import sys_blabla").infer(1, 8) == []
assert len(Script("import sys").infer(1, 8)) == 1
@cwd_at('jedi')
@@ -237,8 +237,8 @@ def test_imports_on_global_namespace_without_path(Script):
def test_named_import(Script):
"""named import - jedi-vim issue #8"""
s = "import time as dt"
assert len(Script(s, 1, 15, '/').goto_definitions()) == 1
assert len(Script(s, 1, 10, '/').goto_definitions()) == 1
assert len(Script(s, path='/').infer(1, 15)) == 1
assert len(Script(s, path='/').infer(1, 10)) == 1
@pytest.mark.skipif('True', reason='The nested import stuff is still very messy.')
@@ -300,7 +300,7 @@ def test_compiled_import_none(monkeypatch, Script):
"""
script = Script('import sys')
monkeypatch.setattr(compiled, 'load_module', lambda *args, **kwargs: None)
def_, = script.goto_definitions()
def_, = script.infer()
assert def_.type == 'module'
value, = def_._name.infer()
assert not _stub_to_python_value_set(value)
@@ -403,7 +403,7 @@ def test_relative_import_out_of_file_system(Script):
assert import_.name == 'import'
script = Script("from " + '.' * 100 + 'abc import ABCMeta')
assert not script.goto_definitions()
assert not script.infer()
assert not script.complete()
@@ -456,7 +456,7 @@ def test_import_needed_modules_by_jedi(Script, environment, tmpdir, name):
path=tmpdir.join('something.py').strpath,
sys_path=[tmpdir.strpath] + environment.get_sys_path(),
)
module, = script.goto_definitions()
module, = script.infer()
assert module._inference_state.builtins_module.py__file__() != module_path
assert module._inference_state.typing_module.py__file__() != module_path

View File

@@ -3,7 +3,7 @@ from jedi.inference.value import TreeInstance
def _infer_literal(Script, code, is_fstring=False):
def_, = Script(code).goto_definitions()
def_, = Script(code).infer()
if is_fstring:
assert def_.name == 'str'
assert isinstance(def_._name._value, TreeInstance)

View File

@@ -14,7 +14,7 @@ def interpreter(code, namespace, *args, **kwargs):
def test_on_code():
from functools import wraps
i = interpreter("wraps.__code__", {'wraps': wraps})
assert i.goto_definitions()
assert i.infer()
@pytest.mark.skipif('sys.version_info < (3,5)')

View File

@@ -15,9 +15,9 @@ def script_with_path(Script, *args, **kwargs):
def test_goto_definition(Script):
assert script_with_path(Script, 'from pkg import ns1_file').goto_definitions()
assert script_with_path(Script, 'from pkg import ns2_file').goto_definitions()
assert not script_with_path(Script, 'from pkg import ns3_file').goto_definitions()
assert script_with_path(Script, 'from pkg import ns1_file').infer()
assert script_with_path(Script, 'from pkg import ns2_file').infer()
assert not script_with_path(Script, 'from pkg import ns3_file').infer()
@pytest.mark.parametrize(
@@ -31,7 +31,7 @@ def test_goto_definition(Script):
]
)
def test_goto_assignment(Script, source, solution):
ass = script_with_path(Script, source).goto_assignments()
ass = script_with_path(Script, source).goto()
assert len(ass) == 1
assert ass[0].description == "foo = '%s'" % solution
@@ -70,9 +70,9 @@ def test_nested_namespace_package(Script):
sys_path = [dirname(__file__)]
script = Script(sys_path=sys_path, source=code, line=1, column=45)
script = Script(sys_path=sys_path, source=code)
result = script.goto_definitions()
result = script.infer(line=1, column=45)
assert len(result) == 1
@@ -88,9 +88,9 @@ def test_relative_import(Script, environment, tmpdir):
# Need to copy the content in a directory where there's no __init__.py.
py.path.local(directory).copy(tmpdir)
file_path = join(tmpdir.strpath, "rel1.py")
script = Script(path=file_path, line=1)
d, = script.goto_definitions()
script = Script(path=file_path)
d, = script.infer(line=1)
assert d.name == 'int'
d, = script.goto_assignments()
d, = script.goto(line=1)
assert d.name == 'name'
assert d.module_name == 'rel2'

View File

@@ -2,7 +2,7 @@ from textwrap import dedent
def get_definition_and_inference_state(Script, source):
first, = Script(dedent(source)).goto_definitions()
first, = Script(dedent(source)).infer()
return first._name._value, first._inference_state

View File

@@ -32,7 +32,7 @@ def test_compiled_signature(Script, environment, code, sig, names, op, version):
if not op(environment.version_info, version):
return # The test right next to it should take over.
d, = Script(code).goto_definitions()
d, = Script(code).infer()
value, = d._name.infer()
compiled, = _stub_to_python_value_set(value)
signature, = compiled.get_signatures()

View File

@@ -42,7 +42,7 @@ def test_namedtuple_content(Script):
""")
def d(source):
x, = Script(source).goto_definitions()
x, = Script(source).infer()
return x.name
assert d(source + 'unnamed.bar') == 'int'
@@ -65,7 +65,7 @@ def test_nested_namedtuples(Script):
assert 'data' in [c.name for c in s.complete()]
def test_namedtuple_goto_definitions(Script):
def test_namedtuple_infer(Script):
source = dedent("""
from collections import namedtuple
@@ -74,7 +74,7 @@ def test_namedtuple_goto_definitions(Script):
from jedi.api import Script
d1, = Script(source).goto_definitions()
d1, = Script(source).infer()
assert d1.get_line_code() == "class Foo(tuple):\n"
assert d1.module_path is None
@@ -86,7 +86,7 @@ def test_re_sub(Script, environment):
version differences.
"""
def run(code):
defs = Script(code).goto_definitions()
defs = Script(code).infer()
return {d.name for d in defs}
names = run("import re; re.sub('a', 'a', 'f')")