mirror of
https://github.com/davidhalter/jedi.git
synced 2026-05-19 23:09:43 +08:00
Reverted 10f5e1 --- needed some more work to get it working again
This commit is contained in:
+28
-36
@@ -31,45 +31,36 @@ from jedi import debug
|
|||||||
|
|
||||||
def _evaluate_for_annotation(evaluator, annotation):
|
def _evaluate_for_annotation(evaluator, annotation):
|
||||||
if annotation is not None:
|
if annotation is not None:
|
||||||
dereferenced_annotation = _fix_forward_reference(evaluator, annotation)
|
definitions = evaluator.eval_element(
|
||||||
definitions = evaluator.eval_element(dereferenced_annotation)
|
_fix_forward_reference(evaluator, annotation))
|
||||||
return list(itertools.chain.from_iterable(
|
return list(itertools.chain.from_iterable(
|
||||||
evaluator.execute(d) for d in definitions))
|
evaluator.execute(d) for d in definitions))
|
||||||
else:
|
else:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
|
||||||
def _fix_forward_reference(evaluator, item):
|
def _fix_forward_reference(evaluator, node):
|
||||||
"""
|
evaled_nodes = evaluator.eval_element(node)
|
||||||
Gets something from the parse tree, and replaces any string literal
|
if len(evaled_nodes) != 1:
|
||||||
in there with the result of evaluating that string at the bottom of the
|
debug.warning("Eval'ed typing index %s should lead to 1 object, "
|
||||||
module
|
" not %s" % (node, evaled_nodes))
|
||||||
"""
|
return node
|
||||||
if isinstance(item, tree.String):
|
evaled_node = list(evaled_nodes)[0]
|
||||||
compiledobjects = evaluator.eval_element(item)
|
if isinstance(evaled_node, compiled.CompiledObject) and \
|
||||||
assert len(compiledobjects) == 1
|
isinstance(evaled_node.obj, str):
|
||||||
compiledobject = list(compiledobjects)[0]
|
|
||||||
try:
|
try:
|
||||||
p = Parser(load_grammar(), compiledobject.obj, start='eval_input')
|
p = Parser(load_grammar(), evaled_node.obj, start='eval_input')
|
||||||
element = p.get_parsed_node()
|
newnode = p.get_parsed_node()
|
||||||
except ParseError:
|
except ParseError:
|
||||||
debug.warning('Annotation not parsed: %s' % compiledobject.obj)
|
debug.warning('Annotation not parsed: %s' % evaled_node.obj)
|
||||||
return item
|
return node
|
||||||
else:
|
else:
|
||||||
module = item.get_parent_until()
|
module = node.get_parent_until()
|
||||||
p.position_modifier.line = module.end_pos[0]
|
p.position_modifier.line = module.end_pos[0]
|
||||||
element.parent = module
|
newnode.parent = module
|
||||||
dereferenced = _fix_forward_reference(evaluator, element)
|
return newnode
|
||||||
return dereferenced
|
else:
|
||||||
if isinstance(item, tree.Node):
|
return node
|
||||||
newnode = tree.Node(item.type, [])
|
|
||||||
for child in item.children:
|
|
||||||
newchild = _fix_forward_reference(evaluator, child)
|
|
||||||
newchild.parent = newnode
|
|
||||||
newnode.children.append(newchild)
|
|
||||||
newnode.parent = item.parent
|
|
||||||
return newnode
|
|
||||||
return item
|
|
||||||
|
|
||||||
|
|
||||||
@memoize_default(None, evaluator_is_first_arg=True)
|
@memoize_default(None, evaluator_is_first_arg=True)
|
||||||
@@ -113,6 +104,8 @@ def get_types_for_typing_module(evaluator, typ, node):
|
|||||||
nodes = [node]
|
nodes = [node]
|
||||||
del node
|
del node
|
||||||
|
|
||||||
|
nodes = [_fix_forward_reference(evaluator, node) for node in nodes]
|
||||||
|
|
||||||
# hacked in Union and Optional, since it's hard to do nicely in parsed code
|
# hacked in Union and Optional, since it's hard to do nicely in parsed code
|
||||||
if typ.name.value == "Union":
|
if typ.name.value == "Union":
|
||||||
return unite(evaluator.eval_element(node) for node in nodes)
|
return unite(evaluator.eval_element(node) for node in nodes)
|
||||||
@@ -132,25 +125,24 @@ def get_types_for_typing_module(evaluator, typ, node):
|
|||||||
return None
|
return None
|
||||||
compiled_classname = compiled.create(evaluator, typ.name.value)
|
compiled_classname = compiled.create(evaluator, typ.name.value)
|
||||||
|
|
||||||
result = set()
|
|
||||||
args = FakeSequence(evaluator, nodes, "tuple")
|
args = FakeSequence(evaluator, nodes, "tuple")
|
||||||
|
|
||||||
result |= evaluator.execute_evaluated(factory, compiled_classname, args)
|
result = evaluator.execute_evaluated(factory, compiled_classname, args)
|
||||||
human_nodes = []
|
human_nodes = []
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
evalled_node = evaluator.eval_element(node)
|
evaled_node = evaluator.eval_element(node)
|
||||||
if len(evalled_node) != 1:
|
if len(evaled_node) != 1:
|
||||||
human_nodes.append("???")
|
human_nodes.append("???")
|
||||||
continue
|
continue
|
||||||
evalled_node = list(evalled_node)[0]
|
evaled_node = list(evaled_node)[0]
|
||||||
try:
|
try:
|
||||||
human_nodes.append(str(evalled_node.name))
|
human_nodes.append(str(evaled_node.name))
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
try:
|
try:
|
||||||
human_nodes.append(evalled_node.obj.__name__)
|
human_nodes.append(evaled_node.obj.__name__)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -153,3 +153,7 @@ def function_with_assined_class_in_reference(x: X, y: "Y"):
|
|||||||
#? int()
|
#? int()
|
||||||
y
|
y
|
||||||
Y = int
|
Y = int
|
||||||
|
|
||||||
|
def just_because_we_can(x: "flo" + "at"):
|
||||||
|
#? float()
|
||||||
|
x
|
||||||
|
|||||||
Reference in New Issue
Block a user