mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-07 22:44:27 +08:00
Add a execute_annotation option to infer_annotation
This commit is contained in:
@@ -664,9 +664,13 @@ class ParamDefinition(Definition):
|
|||||||
def infer_default(self):
|
def infer_default(self):
|
||||||
return [Definition(self._evaluator, d.name) for d in self._name.infer_default()]
|
return [Definition(self._evaluator, d.name) for d in self._name.infer_default()]
|
||||||
|
|
||||||
def infer_annotation(self):
|
def infer_annotation(self, **kwargs):
|
||||||
|
"""
|
||||||
|
:param execute_annotation: If False, the values are not executed and
|
||||||
|
you get classes instead of instances.
|
||||||
|
"""
|
||||||
return [Definition(self._evaluator, d.name)
|
return [Definition(self._evaluator, d.name)
|
||||||
for d in self._name.infer_annotation().execute_annotation()]
|
for d in self._name.infer_annotation(**kwargs)]
|
||||||
|
|
||||||
def to_string(self):
|
def to_string(self):
|
||||||
return self._name.to_string()
|
return self._name.to_string()
|
||||||
|
|||||||
@@ -220,11 +220,14 @@ class ParamName(BaseTreeParamName):
|
|||||||
def annotation_node(self):
|
def annotation_node(self):
|
||||||
return self._get_param_node().annotation
|
return self._get_param_node().annotation
|
||||||
|
|
||||||
def infer_annotation(self):
|
def infer_annotation(self, execute_annotation=True):
|
||||||
node = self.annotation_node
|
node = self.annotation_node
|
||||||
if node is None:
|
if node is None:
|
||||||
return NO_CONTEXTS
|
return NO_CONTEXTS
|
||||||
return self.parent_context.parent_context.eval_node(node)
|
contexts = self.parent_context.parent_context.eval_node(node)
|
||||||
|
if execute_annotation:
|
||||||
|
contexts = contexts.execute_annotation()
|
||||||
|
return contexts
|
||||||
|
|
||||||
def infer_default(self):
|
def infer_default(self):
|
||||||
node = self.default_node
|
node = self.default_node
|
||||||
|
|||||||
@@ -1,21 +1,27 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
_tuple_code = 'from typing import Tuple\ndef f(x: Tuple[int]): ...\nf'
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
'code, expected_params', [
|
'code, expected_params, execute_annotation', [
|
||||||
('def f(x: 1, y): ...\nf', [None, None]),
|
('def f(x: 1, y): ...\nf', [None, None], True),
|
||||||
('def f(x: int): ...\nf', ['instance int']),
|
('def f(x: 1, y): ...\nf', ['instance int', None], False),
|
||||||
('from typing import List\ndef f(x: List[int]): ...\nf', ['instance list']),
|
('def f(x: int): ...\nf', ['instance int'], True),
|
||||||
('from typing import Tuple\ndef f(x: Tuple[int]): ...\nf', ['Tuple: _SpecialForm = ...']),
|
('from typing import List\ndef f(x: List[int]): ...\nf', ['instance list'], True),
|
||||||
('x=str\ndef f(p: x): ...\nx=int\nf', ['instance int']),
|
('from typing import List\ndef f(x: List[int]): ...\nf', ['class list'], False),
|
||||||
|
(_tuple_code, ['Tuple: _SpecialForm = ...'], True),
|
||||||
|
(_tuple_code, ['Tuple: _SpecialForm = ...'], False),
|
||||||
|
('x=str\ndef f(p: x): ...\nx=int\nf', ['instance int'], True),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
def test_param_annotation(Script, code, expected_params):
|
def test_param_annotation(Script, code, expected_params, execute_annotation):
|
||||||
func, = Script(code).goto_assignments()
|
func, = Script(code).goto_assignments()
|
||||||
sig, = func.get_signatures()
|
sig, = func.get_signatures()
|
||||||
for p, expected in zip(sig.params, expected_params):
|
for p, expected in zip(sig.params, expected_params):
|
||||||
|
annotations = p.infer_annotation(execute_annotation=execute_annotation)
|
||||||
if expected is None:
|
if expected is None:
|
||||||
assert not p.infer_annotation()
|
assert not annotations
|
||||||
else:
|
else:
|
||||||
annotation, = p.infer_annotation()
|
annotation, = annotations
|
||||||
assert annotation.description == expected
|
assert annotation.description == expected
|
||||||
|
|||||||
Reference in New Issue
Block a user