@@ -229,160 +229,6 @@ def deserialize(cls, data: JsonDict) -> 'SymbolNode':
229
229
raise NotImplementedError ('unexpected .class {}' .format (classname ))
230
230
231
231
232
- class SymbolTableNode :
233
- # Kind of node. Possible values:
234
- # - LDEF: local definition (of any kind)
235
- # - GDEF: global (module-level) definition
236
- # - MDEF: class member definition
237
- # - TVAR: TypeVar(...) definition
238
- # - MODULE_REF: reference to a module
239
- # - TYPE_ALIAS: type alias
240
- # - UNBOUND_IMPORTED: temporary kind for imported names
241
- kind = None # type: int
242
- # AST node of definition (FuncDef/Var/TypeInfo/Decorator/TypeVarExpr,
243
- # or None for a bound type variable).
244
- node = None # type: Optional[SymbolNode]
245
- # Module id (e.g. "foo.bar") or None
246
- mod_id = '' # type: Optional[str]
247
- # If this not None, override the type of the 'node' attribute.
248
- type_override = None # type: Optional[mypy.types.Type]
249
- # If False, this name won't be imported via 'from <module> import *'.
250
- # This has no effect on names within classes.
251
- module_public = True
252
- # For deserialized MODULE_REF nodes, the referenced module name;
253
- # for other nodes, optionally the name of the referenced object.
254
- cross_ref = None # type: Optional[str]
255
- # Was this node created by normalіze_type_alias?
256
- normalized = False # type: bool
257
-
258
- def __init__ (self , kind : int , node : Optional [SymbolNode ], mod_id : str = None ,
259
- typ : 'mypy.types.Type' = None ,
260
- module_public : bool = True , normalized : bool = False ) -> None :
261
- self .kind = kind
262
- self .node = node
263
- self .type_override = typ
264
- self .mod_id = mod_id
265
- self .module_public = module_public
266
- self .normalized = normalized
267
-
268
- @property
269
- def fullname (self ) -> Optional [str ]:
270
- if self .node is not None :
271
- return self .node .fullname ()
272
- else :
273
- return None
274
-
275
- @property
276
- def type (self ) -> 'Optional[mypy.types.Type]' :
277
- # IDEA: Get rid of the Any type.
278
- node = self .node # type: Any
279
- if self .type_override is not None :
280
- return self .type_override
281
- elif ((isinstance (node , Var ) or isinstance (node , FuncDef ))
282
- and node .type is not None ):
283
- return node .type
284
- elif isinstance (node , Decorator ):
285
- return node .var .type
286
- else :
287
- return None
288
-
289
- def __str__ (self ) -> str :
290
- s = '{}/{}' .format (node_kinds [self .kind ], short_type (self .node ))
291
- if self .mod_id is not None :
292
- s += ' ({})' .format (self .mod_id )
293
- # Include declared type of variables and functions.
294
- if self .type is not None :
295
- s += ' : {}' .format (self .type )
296
- return s
297
-
298
- def serialize (self , prefix : str , name : str ) -> JsonDict :
299
- """Serialize a SymbolTableNode.
300
-
301
- Args:
302
- prefix: full name of the containing module or class; or None
303
- name: name of this object relative to the containing object
304
- """
305
- data = {'.class' : 'SymbolTableNode' ,
306
- 'kind' : node_kinds [self .kind ],
307
- } # type: JsonDict
308
- if not self .module_public :
309
- data ['module_public' ] = False
310
- if self .kind == MODULE_REF :
311
- assert self .node is not None , "Missing module cross ref in %s for %s" % (prefix , name )
312
- data ['cross_ref' ] = self .node .fullname ()
313
- else :
314
- if self .node is not None :
315
- if prefix is not None :
316
- fullname = self .node .fullname ()
317
- if (fullname is not None and '.' in fullname and
318
- fullname != prefix + '.' + name ):
319
- data ['cross_ref' ] = fullname
320
- return data
321
- data ['node' ] = self .node .serialize ()
322
- if self .type_override is not None :
323
- data ['type_override' ] = self .type_override .serialize ()
324
- return data
325
-
326
- @classmethod
327
- def deserialize (cls , data : JsonDict ) -> 'SymbolTableNode' :
328
- assert data ['.class' ] == 'SymbolTableNode'
329
- kind = inverse_node_kinds [data ['kind' ]]
330
- if 'cross_ref' in data :
331
- # This will be fixed up later.
332
- stnode = SymbolTableNode (kind , None )
333
- stnode .cross_ref = data ['cross_ref' ]
334
- else :
335
- node = None
336
- if 'node' in data :
337
- node = SymbolNode .deserialize (data ['node' ])
338
- typ = None
339
- if 'type_override' in data :
340
- typ = mypy .types .deserialize_type (data ['type_override' ])
341
- stnode = SymbolTableNode (kind , node , typ = typ )
342
- if 'module_public' in data :
343
- stnode .module_public = data ['module_public' ]
344
- return stnode
345
-
346
-
347
- class SymbolTable (Dict [str , SymbolTableNode ]):
348
- def __str__ (self ) -> str :
349
- a = [] # type: List[str]
350
- for key , value in self .items ():
351
- # Filter out the implicit import of builtins.
352
- if isinstance (value , SymbolTableNode ):
353
- if (value .fullname != 'builtins' and
354
- (value .fullname or '' ).split ('.' )[- 1 ] not in
355
- implicit_module_attrs ):
356
- a .append (' ' + str (key ) + ' : ' + str (value ))
357
- else :
358
- a .append (' <invalid item>' )
359
- a = sorted (a )
360
- a .insert (0 , 'SymbolTable(' )
361
- a [- 1 ] += ')'
362
- return '\n ' .join (a )
363
-
364
- def serialize (self , fullname : str ) -> JsonDict :
365
- data = {'.class' : 'SymbolTable' } # type: JsonDict
366
- for key , value in self .items ():
367
- # Skip __builtins__: it's a reference to the builtins
368
- # module that gets added to every module by
369
- # SemanticAnalyzer.visit_file(), but it shouldn't be
370
- # accessed by users of the module.
371
- if key == '__builtins__' :
372
- continue
373
- data [key ] = value .serialize (fullname , key )
374
- return data
375
-
376
- @classmethod
377
- def deserialize (cls , data : JsonDict ) -> 'SymbolTable' :
378
- assert data ['.class' ] == 'SymbolTable'
379
- st = SymbolTable ()
380
- for key , value in data .items ():
381
- if key != '.class' :
382
- st [key ] = SymbolTableNode .deserialize (value )
383
- return st
384
-
385
-
386
232
class MypyFile (SymbolNode ):
387
233
"""The abstract syntax tree of a single source file."""
388
234
@@ -1677,7 +1523,7 @@ class RevealLocalsExpr(Expression):
1677
1523
1678
1524
local_vars = None # type: List[SymbolTable]
1679
1525
1680
- def __init__ (self , local_vars : List [SymbolTable ]) -> None :
1526
+ def __init__ (self , local_vars : ' List[SymbolTable]' ) -> None :
1681
1527
self .local_vars = local_vars
1682
1528
1683
1529
def accept (self , visitor : ExpressionVisitor [T ]) -> T :
@@ -2402,6 +2248,160 @@ def __getattribute__(self, attr: str) -> None:
2402
2248
raise AssertionError ('De-serialization failure: TypeInfo not fixed' )
2403
2249
2404
2250
2251
+ class SymbolTableNode :
2252
+ # Kind of node. Possible values:
2253
+ # - LDEF: local definition (of any kind)
2254
+ # - GDEF: global (module-level) definition
2255
+ # - MDEF: class member definition
2256
+ # - TVAR: TypeVar(...) definition
2257
+ # - MODULE_REF: reference to a module
2258
+ # - TYPE_ALIAS: type alias
2259
+ # - UNBOUND_IMPORTED: temporary kind for imported names
2260
+ kind = None # type: int
2261
+ # AST node of definition (FuncDef/Var/TypeInfo/Decorator/TypeVarExpr,
2262
+ # or None for a bound type variable).
2263
+ node = None # type: Optional[SymbolNode]
2264
+ # Module id (e.g. "foo.bar") or None
2265
+ mod_id = '' # type: Optional[str]
2266
+ # If this not None, override the type of the 'node' attribute.
2267
+ type_override = None # type: Optional[mypy.types.Type]
2268
+ # If False, this name won't be imported via 'from <module> import *'.
2269
+ # This has no effect on names within classes.
2270
+ module_public = True
2271
+ # For deserialized MODULE_REF nodes, the referenced module name;
2272
+ # for other nodes, optionally the name of the referenced object.
2273
+ cross_ref = None # type: Optional[str]
2274
+ # Was this node created by normalіze_type_alias?
2275
+ normalized = False # type: bool
2276
+
2277
+ def __init__ (self , kind : int , node : Optional [SymbolNode ], mod_id : str = None ,
2278
+ typ : 'mypy.types.Type' = None ,
2279
+ module_public : bool = True , normalized : bool = False ) -> None :
2280
+ self .kind = kind
2281
+ self .node = node
2282
+ self .type_override = typ
2283
+ self .mod_id = mod_id
2284
+ self .module_public = module_public
2285
+ self .normalized = normalized
2286
+
2287
+ @property
2288
+ def fullname (self ) -> Optional [str ]:
2289
+ if self .node is not None :
2290
+ return self .node .fullname ()
2291
+ else :
2292
+ return None
2293
+
2294
+ @property
2295
+ def type (self ) -> 'Optional[mypy.types.Type]' :
2296
+ # IDEA: Get rid of the Any type.
2297
+ node = self .node # type: Any
2298
+ if self .type_override is not None :
2299
+ return self .type_override
2300
+ elif ((isinstance (node , Var ) or isinstance (node , FuncDef ))
2301
+ and node .type is not None ):
2302
+ return node .type
2303
+ elif isinstance (node , Decorator ):
2304
+ return node .var .type
2305
+ else :
2306
+ return None
2307
+
2308
+ def __str__ (self ) -> str :
2309
+ s = '{}/{}' .format (node_kinds [self .kind ], short_type (self .node ))
2310
+ if self .mod_id is not None :
2311
+ s += ' ({})' .format (self .mod_id )
2312
+ # Include declared type of variables and functions.
2313
+ if self .type is not None :
2314
+ s += ' : {}' .format (self .type )
2315
+ return s
2316
+
2317
+ def serialize (self , prefix : str , name : str ) -> JsonDict :
2318
+ """Serialize a SymbolTableNode.
2319
+
2320
+ Args:
2321
+ prefix: full name of the containing module or class; or None
2322
+ name: name of this object relative to the containing object
2323
+ """
2324
+ data = {'.class' : 'SymbolTableNode' ,
2325
+ 'kind' : node_kinds [self .kind ],
2326
+ } # type: JsonDict
2327
+ if not self .module_public :
2328
+ data ['module_public' ] = False
2329
+ if self .kind == MODULE_REF :
2330
+ assert self .node is not None , "Missing module cross ref in %s for %s" % (prefix , name )
2331
+ data ['cross_ref' ] = self .node .fullname ()
2332
+ else :
2333
+ if self .node is not None :
2334
+ if prefix is not None :
2335
+ fullname = self .node .fullname ()
2336
+ if (fullname is not None and '.' in fullname and
2337
+ fullname != prefix + '.' + name ):
2338
+ data ['cross_ref' ] = fullname
2339
+ return data
2340
+ data ['node' ] = self .node .serialize ()
2341
+ if self .type_override is not None :
2342
+ data ['type_override' ] = self .type_override .serialize ()
2343
+ return data
2344
+
2345
+ @classmethod
2346
+ def deserialize (cls , data : JsonDict ) -> 'SymbolTableNode' :
2347
+ assert data ['.class' ] == 'SymbolTableNode'
2348
+ kind = inverse_node_kinds [data ['kind' ]]
2349
+ if 'cross_ref' in data :
2350
+ # This will be fixed up later.
2351
+ stnode = SymbolTableNode (kind , None )
2352
+ stnode .cross_ref = data ['cross_ref' ]
2353
+ else :
2354
+ node = None
2355
+ if 'node' in data :
2356
+ node = SymbolNode .deserialize (data ['node' ])
2357
+ typ = None
2358
+ if 'type_override' in data :
2359
+ typ = mypy .types .deserialize_type (data ['type_override' ])
2360
+ stnode = SymbolTableNode (kind , node , typ = typ )
2361
+ if 'module_public' in data :
2362
+ stnode .module_public = data ['module_public' ]
2363
+ return stnode
2364
+
2365
+
2366
+ class SymbolTable (Dict [str , SymbolTableNode ]):
2367
+ def __str__ (self ) -> str :
2368
+ a = [] # type: List[str]
2369
+ for key , value in self .items ():
2370
+ # Filter out the implicit import of builtins.
2371
+ if isinstance (value , SymbolTableNode ):
2372
+ if (value .fullname != 'builtins' and
2373
+ (value .fullname or '' ).split ('.' )[- 1 ] not in
2374
+ implicit_module_attrs ):
2375
+ a .append (' ' + str (key ) + ' : ' + str (value ))
2376
+ else :
2377
+ a .append (' <invalid item>' )
2378
+ a = sorted (a )
2379
+ a .insert (0 , 'SymbolTable(' )
2380
+ a [- 1 ] += ')'
2381
+ return '\n ' .join (a )
2382
+
2383
+ def serialize (self , fullname : str ) -> JsonDict :
2384
+ data = {'.class' : 'SymbolTable' } # type: JsonDict
2385
+ for key , value in self .items ():
2386
+ # Skip __builtins__: it's a reference to the builtins
2387
+ # module that gets added to every module by
2388
+ # SemanticAnalyzer.visit_file(), but it shouldn't be
2389
+ # accessed by users of the module.
2390
+ if key == '__builtins__' :
2391
+ continue
2392
+ data [key ] = value .serialize (fullname , key )
2393
+ return data
2394
+
2395
+ @classmethod
2396
+ def deserialize (cls , data : JsonDict ) -> 'SymbolTable' :
2397
+ assert data ['.class' ] == 'SymbolTable'
2398
+ st = SymbolTable ()
2399
+ for key , value in data .items ():
2400
+ if key != '.class' :
2401
+ st [key ] = SymbolTableNode .deserialize (value )
2402
+ return st
2403
+
2404
+
2405
2405
class MroError (Exception ):
2406
2406
"""Raised if a consistent mro cannot be determined for a class."""
2407
2407
0 commit comments