@@ -152,7 +152,7 @@ def visit_decorator(self, dec: Decorator) -> None:
152152 for expr in dec .decorators :
153153 preserve_type = False
154154 if isinstance (expr , RefExpr ) and isinstance (expr .node , FuncDef ):
155- if is_identity_signature (expr .node .type ):
155+ if expr . node . type and is_identity_signature (expr .node .type ):
156156 preserve_type = True
157157 if not preserve_type :
158158 decorator_preserves_type = False
@@ -246,31 +246,38 @@ def perform_transform(self, node: Union[Node, SymbolTableNode],
246246 transform : Callable [[Type ], Type ]) -> None :
247247 """Apply transform to all types associated with node."""
248248 if isinstance (node , ForStmt ):
249- node .index_type = transform (node .index_type )
249+ if node .index_type :
250+ node .index_type = transform (node .index_type )
250251 self .transform_types_in_lvalue (node .index , transform )
251252 if isinstance (node , WithStmt ):
252- node .target_type = transform (node .target_type )
253+ if node .target_type :
254+ node .target_type = transform (node .target_type )
253255 for n in node .target :
254256 if isinstance (n , NameExpr ) and isinstance (n .node , Var ) and n .node .type :
255257 n .node .type = transform (n .node .type )
256258 if isinstance (node , (FuncDef , CastExpr , AssignmentStmt , TypeAliasExpr , Var )):
259+ assert node .type , "Scheduled patch for non-existent type"
257260 node .type = transform (node .type )
258261 if isinstance (node , NewTypeExpr ):
262+ assert node .old_type , "Scheduled patch for non-existent type"
259263 node .old_type = transform (node .old_type )
260264 if isinstance (node , TypeVarExpr ):
261265 if node .upper_bound :
262266 node .upper_bound = transform (node .upper_bound )
263267 if node .values :
264268 node .values = [transform (v ) for v in node .values ]
265269 if isinstance (node , TypedDictExpr ):
270+ assert node .info .typeddict_type , "Scheduled patch for non-existent type"
266271 node .info .typeddict_type = cast (TypedDictType ,
267272 transform (node .info .typeddict_type ))
268273 if isinstance (node , NamedTupleExpr ):
274+ assert node .info .tuple_type , "Scheduled patch for non-existent type"
269275 node .info .tuple_type = cast (TupleType ,
270276 transform (node .info .tuple_type ))
271277 if isinstance (node , TypeApplication ):
272278 node .types = [transform (t ) for t in node .types ]
273279 if isinstance (node , SymbolTableNode ):
280+ assert node .type_override , "Scheduled patch for non-existent type"
274281 node .type_override = transform (node .type_override )
275282 if isinstance (node , TypeInfo ):
276283 for tvar in node .defn .type_vars :
@@ -296,7 +303,8 @@ def transform_types_in_lvalue(self, lvalue: Lvalue,
296303 if isinstance (lvalue , RefExpr ):
297304 if isinstance (lvalue .node , Var ):
298305 var = lvalue .node
299- var .type = transform (var .type )
306+ if var .type :
307+ var .type = transform (var .type )
300308 elif isinstance (lvalue , TupleExpr ):
301309 for item in lvalue .items :
302310 self .transform_types_in_lvalue (item , transform )
@@ -355,7 +363,7 @@ def fail(self, msg: str, ctx: Context, *, blocker: bool = False) -> None:
355363 def fail_blocker (self , msg : str , ctx : Context ) -> None :
356364 self .fail (msg , ctx , blocker = True )
357365
358- def builtin_type (self , name : str , args : List [Type ] = None ) -> Instance :
366+ def builtin_type (self , name : str , args : Optional [ List [Type ] ] = None ) -> Instance :
359367 names = self .modules ['builtins' ]
360368 sym = names .names [name ]
361369 node = sym .node
0 commit comments