Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 14 additions & 18 deletions mypy/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,21 +116,6 @@ def get_line(self) -> int:
def accept(self, visitor: NodeVisitor[T]) -> T:
raise RuntimeError('Not implemented')

# NOTE: Can't use @abstractmethod, since many subclasses of Node
# don't implement serialize().
def serialize(self) -> Any:
raise NotImplementedError('Cannot serialize {} instance'.format(self.__class__.__name__))

@classmethod
def deserialize(cls, data: JsonDict) -> 'Node':
classname = data['.class']
glo = globals()
if classname in glo:
cl = glo[classname]
if issubclass(cl, cls) and 'deserialize' in cl.__dict__:
return cl.deserialize(data)
raise NotImplementedError('unexpected .class {}'.format(classname))


# These are placeholders for a future refactoring; see #1783.
# For now they serve as (unchecked) documentation of what various
Expand All @@ -150,9 +135,20 @@ def name(self) -> str: pass
@abstractmethod
def fullname(self) -> str: pass

# NOTE: Can't use @abstractmethod, since many subclasses of Node
# don't implement serialize().
def serialize(self) -> Any:
raise NotImplementedError('Cannot serialize {} instance'.format(self.__class__.__name__))

@classmethod
def deserialize(cls, data: JsonDict) -> 'SymbolNode':
return cast(SymbolNode, super().deserialize(data))
classname = data['.class']
glo = globals()
if classname in glo:
cl = glo[classname]
if issubclass(cl, cls) and 'deserialize' in cl.__dict__:
return cl.deserialize(data)
raise NotImplementedError('unexpected .class {}'.format(classname))


class MypyFile(SymbolNode, Statement):
Expand Down Expand Up @@ -1078,7 +1074,7 @@ class RefExpr(Expression):
"""Abstract base class for name-like constructs"""

kind = None # type: int # LDEF/GDEF/MDEF/... (None if not available)
node = None # type: Node # Var, FuncDef or TypeInfo that describes this
node = None # type: SymbolNode # Var, FuncDef or TypeInfo that describes this
fullname = None # type: str # Fully qualified name (or name if not global)

# Does this define a new name with inferred type?
Expand Down Expand Up @@ -1124,7 +1120,7 @@ def deserialize(cls, data: JsonDict) -> 'NameExpr':
assert data['.class'] == 'NameExpr'
ret = NameExpr(data['name'])
ret.kind = data['kind']
ret.node = None if data['node'] is None else Node.deserialize(data['node'])
ret.node = None if data['node'] is None else SymbolNode.deserialize(data['node'])
ret.fullname = data['fullname']
ret.is_def = data['is_def']
ret.literal = data['literal']
Expand Down
2 changes: 1 addition & 1 deletion mypy/semanal.py
Original file line number Diff line number Diff line change
Expand Up @@ -1778,7 +1778,7 @@ def visit_name_expr(self, expr: NameExpr) -> None:
"context".format(expr.name), expr)
else:
expr.kind = n.kind
expr.node = (cast(Node, n.node))
expr.node = n.node
expr.fullname = n.fullname

def visit_super_expr(self, expr: SuperExpr) -> None:
Expand Down