@@ -313,7 +313,6 @@ def add_implicit_module_attrs(self, file_node: MypyFile) -> None:
313
313
self .add_symbol (name , var , None )
314
314
else :
315
315
self .add_symbol (name , PlaceholderNode (self .qualified_name (name ), file_node ), None )
316
- self .defer ()
317
316
318
317
def prepare_file (self , file_node : MypyFile ) -> None :
319
318
"""Prepare a freshly parsed file for semantic analysis."""
@@ -848,7 +847,12 @@ def visit_class_def(self, defn: ClassDef) -> None:
848
847
def analyze_class (self , defn : ClassDef ) -> None :
849
848
fullname = self .qualified_name (defn .name )
850
849
if not defn .info and not self .is_core_builtin_class (defn ):
851
- self .add_symbol (defn .name , PlaceholderNode (fullname , defn , True ), defn )
850
+ # Add placeholder so that self-references in base classes can be
851
+ # resolved. We don't want this to cause a deferral, since if there
852
+ # are no incomplete references, we'll replace this with a TypeInfo
853
+ # before returning.
854
+ self .add_symbol (defn .name , PlaceholderNode (fullname , defn , True ), defn ,
855
+ can_defer = False )
852
856
853
857
tag = self .track_incomplete_refs ()
854
858
@@ -3900,7 +3904,11 @@ def lookup_qualified(self, name: str, ctx: Context,
3900
3904
return None
3901
3905
3902
3906
def defer (self ) -> None :
3903
- """Defer current analysis target to be analyzed again."""
3907
+ """Defer current analysis target to be analyzed again.
3908
+
3909
+ This must be called if something in the current target is
3910
+ incomplete or has a placeholder node.
3911
+ """
3904
3912
self .deferred = True
3905
3913
3906
3914
def track_incomplete_refs (self ) -> Tag :
@@ -4115,7 +4123,8 @@ def current_symbol_kind(self) -> int:
4115
4123
return kind
4116
4124
4117
4125
def add_symbol (self , name : str , node : SymbolNode , context : Optional [Context ],
4118
- module_public : bool = True , module_hidden : bool = False ) -> bool :
4126
+ module_public : bool = True , module_hidden : bool = False ,
4127
+ can_defer : bool = True ) -> bool :
4119
4128
"""Add symbol to the currently active symbol table.
4120
4129
4121
4130
Generally additions to symbol table should go through this method or
@@ -4124,6 +4133,8 @@ def add_symbol(self, name: str, node: SymbolNode, context: Optional[Context],
4124
4133
4125
4134
Return True if we actually added the symbol, or False if we refused to do so
4126
4135
(because something is not ready).
4136
+
4137
+ If can_defer is True, defer current target if adding a placeholder.
4127
4138
"""
4128
4139
if self .is_func_scope ():
4129
4140
kind = LDEF
@@ -4135,7 +4146,7 @@ def add_symbol(self, name: str, node: SymbolNode, context: Optional[Context],
4135
4146
node ,
4136
4147
module_public = module_public ,
4137
4148
module_hidden = module_hidden )
4138
- return self .add_symbol_table_node (name , symbol , context )
4149
+ return self .add_symbol_table_node (name , symbol , context , can_defer )
4139
4150
4140
4151
def add_symbol_skip_local (self , name : str , node : SymbolNode ) -> None :
4141
4152
"""Same as above, but skipping the local namespace.
@@ -4175,21 +4186,26 @@ def is_global_or_nonlocal(self, name: str) -> bool:
4175
4186
or name in self .nonlocal_decls [- 1 ]))
4176
4187
4177
4188
def add_symbol_table_node (self , name : str , symbol : SymbolTableNode ,
4178
- context : Optional [Context ] = None ) -> bool :
4189
+ context : Optional [Context ] = None ,
4190
+ can_defer : bool = True ) -> bool :
4179
4191
"""Add symbol table node to the currently active symbol table.
4180
4192
4181
4193
Return True if we actually added the symbol, or False if we refused to do so
4182
4194
(because something is not ready).
4195
+
4196
+ If can_defer is True, defer current target if adding a placeholder.
4183
4197
"""
4184
4198
names = self .current_symbol_table ()
4185
4199
existing = names .get (name )
4200
+ if isinstance (symbol .node , PlaceholderNode ) and can_defer :
4201
+ self .defer ()
4186
4202
if (existing is not None
4187
4203
and context is not None
4188
4204
and (not isinstance (existing .node , PlaceholderNode )
4189
- or isinstance (symbol .node , PlaceholderNode ) and
4190
- # Allow replacing becomes_typeinfo=False with becomes_typeinfo=True.
4191
- # This can happen for type aliases and NewTypes.
4192
- not symbol .node .becomes_typeinfo )):
4205
+ or ( isinstance (symbol .node , PlaceholderNode ) and
4206
+ # Allow replacing becomes_typeinfo=False with becomes_typeinfo=True.
4207
+ # This can happen for type aliases and NewTypes.
4208
+ not symbol .node .becomes_typeinfo ) )):
4193
4209
# There is an existing node, so this may be a redefinition.
4194
4210
# If the new node points to the same node as the old one,
4195
4211
# or if both old and new nodes are placeholders, we don't
0 commit comments