@@ -410,7 +410,7 @@ def add_implicit_module_attrs(self, file_node: MypyFile) -> None:
410
410
self .add_symbol (name , var , dummy_context ())
411
411
else :
412
412
self .add_symbol (name ,
413
- PlaceholderNode (self .qualified_name (name ), file_node ),
413
+ PlaceholderNode (self .qualified_name (name ), file_node , - 1 ),
414
414
dummy_context ())
415
415
416
416
def add_builtin_aliases (self , tree : MypyFile ) -> None :
@@ -994,8 +994,8 @@ def analyze_class(self, defn: ClassDef) -> None:
994
994
# resolved. We don't want this to cause a deferral, since if there
995
995
# are no incomplete references, we'll replace this with a TypeInfo
996
996
# before returning.
997
- self . add_symbol ( defn . name , PlaceholderNode (fullname , defn , True ), defn ,
998
- can_defer = False )
997
+ placeholder = PlaceholderNode (fullname , defn , defn . line , becomes_typeinfo = True )
998
+ self . add_symbol ( defn . name , placeholder , defn , can_defer = False )
999
999
1000
1000
tag = self .track_incomplete_refs ()
1001
1001
@@ -1607,6 +1607,7 @@ def analyze_metaclass(self, defn: ClassDef) -> None:
1607
1607
#
1608
1608
1609
1609
def visit_import (self , i : Import ) -> None :
1610
+ self .statement = i
1610
1611
for id , as_id in i .ids :
1611
1612
if as_id is not None :
1612
1613
self .add_module_symbol (id , as_id , module_public = True , context = i )
@@ -1668,6 +1669,7 @@ def allow_patching(self, parent_mod: MypyFile, child: str) -> bool:
1668
1669
return False
1669
1670
1670
1671
def visit_import_from (self , imp : ImportFrom ) -> None :
1672
+ self .statement = imp
1671
1673
import_id = self .correct_relative_import (imp )
1672
1674
self .add_submodules_to_parent_modules (import_id , True )
1673
1675
module = self .modules .get (import_id )
@@ -2370,8 +2372,11 @@ def check_and_set_up_type_alias(self, s: AssignmentStmt) -> bool:
2370
2372
if self .found_incomplete_ref (tag ) or isinstance (res , PlaceholderType ):
2371
2373
# Since we have got here, we know this must be a type alias (incomplete refs
2372
2374
# may appear in nested positions), therefore use becomes_typeinfo=True.
2373
- self .add_symbol (lvalue .name , PlaceholderNode (self .qualified_name (lvalue .name ),
2374
- rvalue , becomes_typeinfo = True ), s )
2375
+ placeholder = PlaceholderNode (self .qualified_name (lvalue .name ),
2376
+ rvalue ,
2377
+ s .line ,
2378
+ becomes_typeinfo = True )
2379
+ self .add_symbol (lvalue .name , placeholder , s )
2375
2380
return True
2376
2381
self .add_type_alias_deps (depends_on )
2377
2382
# In addition to the aliases used, we add deps on unbound
@@ -3820,7 +3825,8 @@ class C:
3820
3825
return (node is None
3821
3826
or node .line < self .statement .line
3822
3827
or not self .is_defined_in_current_module (node .fullname ())
3823
- or isinstance (node , TypeInfo ))
3828
+ or isinstance (node , TypeInfo )
3829
+ or (isinstance (node , PlaceholderNode ) and node .becomes_typeinfo ))
3824
3830
3825
3831
def is_defined_in_current_module (self , fullname : Optional [str ]) -> bool :
3826
3832
if fullname is None :
@@ -4265,9 +4271,9 @@ def mark_incomplete(self, name: str, node: Node,
4265
4271
self .incomplete = True
4266
4272
elif name not in self .current_symbol_table () and not self .is_global_or_nonlocal (name ):
4267
4273
fullname = self .qualified_name (name )
4268
- self .add_symbol ( name ,
4269
- PlaceholderNode ( fullname , node , becomes_typeinfo ),
4270
- context = dummy_context ())
4274
+ placeholder = PlaceholderNode ( fullname , node , self .statement . line ,
4275
+ becomes_typeinfo = becomes_typeinfo )
4276
+ self . add_symbol ( name , placeholder , context = dummy_context ())
4271
4277
self .missing_names .add (name )
4272
4278
4273
4279
def is_incomplete_namespace (self , fullname : str ) -> bool :
0 commit comments