Return annotations for compiled objects now help to infer

However only if it's a type, if it's a string, it doesn't work, yet

Fixes #1347
This commit is contained in:
Dave Halter
2019-06-22 00:15:20 +02:00
parent a62ba86d7b
commit aa2dc6be09
3 changed files with 20 additions and 1 deletions

View File

@@ -448,6 +448,17 @@ class DirectObjectAccess(object):
# the signature. In that case we just want a simple escape for now. # the signature. In that case we just want a simple escape for now.
raise ValueError raise ValueError
def get_return_annotation(self):
try:
o = self._obj.__annotations__.get('return')
except AttributeError:
return None
if o is None:
return None
return self._create_access_path(o)
def negate(self): def negate(self):
return self._create_access_path(-self._obj) return self._create_access_path(-self._obj)

View File

@@ -46,6 +46,11 @@ class CompiledObject(Context):
self.access_handle = access_handle self.access_handle = access_handle
def py__call__(self, arguments): def py__call__(self, arguments):
return_annotation = self.access_handle.get_return_annotation()
if return_annotation is not None:
# TODO the return annotation may also be a string.
return create_from_access_path(self.evaluator, return_annotation).execute_annotation()
try: try:
self.access_handle.getattr_paths(u'__call__') self.access_handle.getattr_paths(u'__call__')
except AttributeError: except AttributeError:

View File

@@ -262,7 +262,7 @@ def test_completion_params():
def test_completion_param_annotations(): def test_completion_param_annotations():
# Need to define this function not directly in Python. Otherwise Jedi is to # Need to define this function not directly in Python. Otherwise Jedi is to
# clever and uses the Python code instead of the signature object. # clever and uses the Python code instead of the signature object.
code = 'def foo(a: 1, b: str, c: int = 1.0): pass' code = 'def foo(a: 1, b: str, c: int = 1.0) -> bytes: pass'
exec_(code, locals()) exec_(code, locals())
script = jedi.Interpreter('foo', [locals()]) script = jedi.Interpreter('foo', [locals()])
c, = script.completions() c, = script.completions()
@@ -271,6 +271,9 @@ def test_completion_param_annotations():
assert [d.name for d in b.infer()] == ['str'] assert [d.name for d in b.infer()] == ['str']
assert {d.name for d in c.infer()} == {'int', 'float'} assert {d.name for d in c.infer()} == {'int', 'float'}
d, = jedi.Interpreter('foo()', [locals()]).goto_definitions()
assert d.name == 'bytes'
def test_keyword_argument(): def test_keyword_argument():
def f(some_keyword_argument): def f(some_keyword_argument):