Reverted 10f5e1 --- needed some more work to get it working again

This commit is contained in:
Claude
2016-01-17 16:12:43 +01:00
parent ae701b2f9a
commit b499906398
2 changed files with 32 additions and 36 deletions
+28 -36
View File
@@ -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:
+4
View File
@@ -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