mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-08 06:44:46 +08:00
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:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user