Open
Description
In the following test case the forward reference to In
in the class body doesn't work:
[case testNewAnalyzerNamedTupleCallNested]
from typing import NamedTuple
o: C.Out
i: C.In
reveal_type(o) # E: Revealed type is 'Tuple[Tuple[builtins.str, __main__.C.Other, fallback=__main__.C.In], __main__.C.Other, fallback=__main__.C.Out]'
reveal_type(o.x) # E: Revealed type is 'Tuple[builtins.str, __main__.C.Other, fallback=__main__.C.In]'
reveal_type(o.y) # E: Revealed type is '__main__.C.Other'
reveal_type(o.x.t) # E: Revealed type is '__main__.C.Other'
reveal_type(i.t) # E: Revealed type is '__main__.C.Other'
class C:
Out = NamedTuple('Out', [('x', In), ('y', Other)]) # 'In' undefined <<--- should be ok?
In = NamedTuple('In', [('s', str), ('t', Other)])
class Other: pass
The root cause is that if the rvalue of an assignment is incomplete, we add a PlaceholderNode
that doesn't have becomes_typeinfo
set. This may also affect other things such as assignment-based TypedDicts, type aliases, type variables and NewTypes (haven't checked).
Not sure what would be the best way to fix this. One idea would be to treat every placeholder as a possible type, at least if it's generated from an incomplete assignment. A second idea would be to recognize possible types by looking at an incomplete rvalue, but this doesn't seem always possible.
This is follow-up to #6983.