Skip to content

Commit b0ca357

Browse files
committed
Revert move definition of SymbolTable and SymbolTableNode,
use string as a type definition in RevealLocalsExpr.__init__()
1 parent 7681f9e commit b0ca357

File tree

1 file changed

+155
-155
lines changed

1 file changed

+155
-155
lines changed

mypy/nodes.py

Lines changed: 155 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -229,160 +229,6 @@ def deserialize(cls, data: JsonDict) -> 'SymbolNode':
229229
raise NotImplementedError('unexpected .class {}'.format(classname))
230230

231231

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-
386232
class MypyFile(SymbolNode):
387233
"""The abstract syntax tree of a single source file."""
388234

@@ -1677,7 +1523,7 @@ class RevealLocalsExpr(Expression):
16771523

16781524
local_vars = None # type: List[SymbolTable]
16791525

1680-
def __init__(self, local_vars: List[SymbolTable]) -> None:
1526+
def __init__(self, local_vars: 'List[SymbolTable]') -> None:
16811527
self.local_vars = local_vars
16821528

16831529
def accept(self, visitor: ExpressionVisitor[T]) -> T:
@@ -2402,6 +2248,160 @@ def __getattribute__(self, attr: str) -> None:
24022248
raise AssertionError('De-serialization failure: TypeInfo not fixed')
24032249

24042250

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+
24052405
class MroError(Exception):
24062406
"""Raised if a consistent mro cannot be determined for a class."""
24072407

0 commit comments

Comments
 (0)