Skip to content

Commit 83aca49

Browse files
elazarggvanrossum
authored andcommitted
Tighter types for nodes.py (#2224)
1 parent 169b224 commit 83aca49

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

mypy/nodes.py

+20-18
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class Node(Context):
9797
line = -1
9898
column = -1
9999

100+
# TODO: Move to Expression
100101
literal = LITERAL_NO
101102
literal_hash = None # type: Any
102103

@@ -139,8 +140,9 @@ class Statement(Node):
139140
class Expression(Node):
140141
"""An expression node."""
141142

142-
143-
# TODO: Union['NameExpr', 'TupleExpr', 'ListExpr', 'MemberExpr', 'IndexExpr']; see #1783.
143+
# TODO:
144+
# Lvalue = Union['NameExpr', 'MemberExpr', 'IndexExpr', 'SuperExpr', 'StarExpr'
145+
# 'TupleExpr', 'ListExpr']; see #1783.
144146
Lvalue = Expression
145147

146148

@@ -157,7 +159,7 @@ def fullname(self) -> str: pass
157159

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

163165
@classmethod
@@ -171,7 +173,7 @@ def deserialize(cls, data: JsonDict) -> 'SymbolNode':
171173
raise NotImplementedError('unexpected .class {}'.format(classname))
172174

173175

174-
class MypyFile(SymbolNode, Statement):
176+
class MypyFile(SymbolNode):
175177
"""The abstract syntax tree of a single source file."""
176178

177179
# Module name ('__main__' for initial file)
@@ -591,7 +593,7 @@ def deserialize(cls, data: JsonDict) -> 'Decorator':
591593
return dec
592594

593595

594-
class Var(SymbolNode, Statement):
596+
class Var(SymbolNode):
595597
"""A variable.
596598
597599
It can refer to global/local variable or a data attribute.
@@ -798,10 +800,10 @@ class OperatorAssignmentStmt(Statement):
798800
"""Operator assignment statement such as x += 1"""
799801

800802
op = ''
801-
lvalue = None # type: Expression
803+
lvalue = None # type: Lvalue
802804
rvalue = None # type: Expression
803805

804-
def __init__(self, op: str, lvalue: Expression, rvalue: Expression) -> None:
806+
def __init__(self, op: str, lvalue: Lvalue, rvalue: Expression) -> None:
805807
self.op = op
806808
self.lvalue = lvalue
807809
self.rvalue = rvalue
@@ -826,14 +828,14 @@ def accept(self, visitor: NodeVisitor[T]) -> T:
826828

827829
class ForStmt(Statement):
828830
# Index variables
829-
index = None # type: Expression
831+
index = None # type: Lvalue
830832
# Expression to iterate
831833
expr = None # type: Expression
832834
body = None # type: Block
833835
else_body = None # type: Block
834836
is_async = False # True if `async for ...` (PEP 492, Python 3.5)
835837

836-
def __init__(self, index: Expression, expr: Expression, body: Block,
838+
def __init__(self, index: Lvalue, expr: Expression, body: Block,
837839
else_body: Block) -> None:
838840
self.index = index
839841
self.expr = expr
@@ -865,9 +867,9 @@ def accept(self, visitor: NodeVisitor[T]) -> T:
865867

866868

867869
class DelStmt(Statement):
868-
expr = None # type: Expression
870+
expr = None # type: Lvalue
869871

870-
def __init__(self, expr: Expression) -> None:
872+
def __init__(self, expr: Lvalue) -> None:
871873
self.expr = expr
872874

873875
def accept(self, visitor: NodeVisitor[T]) -> T:
@@ -940,11 +942,11 @@ def accept(self, visitor: NodeVisitor[T]) -> T:
940942

941943
class WithStmt(Statement):
942944
expr = None # type: List[Expression]
943-
target = None # type: List[Expression]
945+
target = None # type: List[Lvalue]
944946
body = None # type: Block
945947
is_async = False # True if `async with ...` (PEP 492, Python 3.5)
946948

947-
def __init__(self, expr: List[Expression], target: List[Expression],
949+
def __init__(self, expr: List[Expression], target: List[Lvalue],
948950
body: Block) -> None:
949951
self.expr = expr
950952
self.target = target
@@ -1540,9 +1542,9 @@ class GeneratorExpr(Expression):
15401542
left_expr = None # type: Expression
15411543
sequences = None # type: List[Expression]
15421544
condlists = None # type: List[List[Expression]]
1543-
indices = None # type: List[Expression]
1545+
indices = None # type: List[Lvalue]
15441546

1545-
def __init__(self, left_expr: Expression, indices: List[Expression],
1547+
def __init__(self, left_expr: Expression, indices: List[Lvalue],
15461548
sequences: List[Expression], condlists: List[List[Expression]]) -> None:
15471549
self.left_expr = left_expr
15481550
self.sequences = sequences
@@ -1584,9 +1586,9 @@ class DictionaryComprehension(Expression):
15841586
value = None # type: Expression
15851587
sequences = None # type: List[Expression]
15861588
condlists = None # type: List[List[Expression]]
1587-
indices = None # type: List[Expression]
1589+
indices = None # type: List[Lvalue]
15881590

1589-
def __init__(self, key: Expression, value: Expression, indices: List[Expression],
1591+
def __init__(self, key: Expression, value: Expression, indices: List[Lvalue],
15901592
sequences: List[Expression], condlists: List[List[Expression]]) -> None:
15911593
self.key = key
15921594
self.value = value
@@ -2026,7 +2028,7 @@ def __str__(self) -> str:
20262028
('Names', sorted(self.names.keys()))],
20272029
'TypeInfo')
20282030

2029-
def serialize(self) -> Union[str, JsonDict]:
2031+
def serialize(self) -> JsonDict:
20302032
# NOTE: This is where all ClassDefs originate, so there shouldn't be duplicates.
20312033
data = {'.class': 'TypeInfo',
20322034
'module_name': self.module_name,

0 commit comments

Comments
 (0)