Skip to content

Commit ccbbb30

Browse files
committed
Refactor: simplify VarDef (close #84)
1 parent 4b58d3d commit ccbbb30

12 files changed

+47
-53
lines changed

checker.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,16 +133,16 @@ class TypeChecker(NodeVisitor<Type>):
133133
# Type check initializer.
134134
if defn.init:
135135
# There is an initializer.
136-
if defn.items[0][1]:
136+
if defn.items[0].type:
137137
# Explicit types.
138138
if len(defn.items) == 1:
139-
self.check_single_assignment(defn.items[0][1], None,
139+
self.check_single_assignment(defn.items[0].type, None,
140140
defn.init, defn.init)
141141
else:
142142
# Multiple assignment.
143143
Type[] lvt = []
144-
for v, t in defn.items:
145-
lvt.append(t)
144+
for v in defn.items:
145+
lvt.append(v.type)
146146
self.check_multi_assignment(
147147
lvt, <tuple<Type, Node>> [None] * len(lvt),
148148
defn.init, defn.init)
@@ -152,13 +152,10 @@ class TypeChecker(NodeVisitor<Type>):
152152
# Infer local variable type if there is an initializer
153153
# except if the# definition is at the top level (outside a
154154
# function).
155-
Var[] names = []
156-
for vv, tt in defn.items:
157-
names.append(vv)
158-
self.infer_local_variable_type(names, init_type, defn)
155+
self.infer_local_variable_type(defn.items, init_type, defn)
159156
else:
160157
# No initializer
161-
if (defn.kind == LDEF and not defn.items[0][1] and
158+
if (defn.kind == LDEF and not defn.items[0].type and
162159
not defn.is_top_level and not self.is_dynamic_function()):
163160
self.fail(messages.NEED_ANNOTATION_FOR_VAR, defn)
164161

icode.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ class IcodeBuilder(NodeVisitor<int>):
421421

422422
int visit_var_def(self, VarDef d):
423423
assert len(d.items) == 1
424-
var = d.items[0][0]
424+
var = d.items[0]
425425
if d.kind == nodes.LDEF:
426426
reg = self.add_local(var)
427427
if d.init:

nodes.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,9 @@ class Var(Node, AccessorNode, SymNode):
274274
bool is_self # Is this the first argument to an ordinary method
275275
# (usually "self")?
276276

277-
void __init__(self, str name):
277+
void __init__(self, str name, mtypes.Type type=None):
278278
self._name = name
279+
self.type = type
279280
self.is_init = False
280281
self.is_self = False
281282

@@ -319,32 +320,31 @@ class TypeDef(Node):
319320

320321

321322
class VarDef(Node):
322-
tuple<Var, mtypes.Type>[] items
323+
Var[] items
323324
int kind # LDEF/GDEF/MDEF/...
324325
Node init # Expression or None
325326
bool is_top_level # Is the definition at the top level (not within
326327
# a function or a type)?
327328
bool is_init
328329

329-
void __init__(self, tuple<Var, mtypes.Type>[] items,
330-
bool is_top_level, Node init=None):
330+
void __init__(self, Var[] items, bool is_top_level, Node init=None):
331331
self.items = items
332332
self.is_top_level = is_top_level
333333
self.init = init
334334
self.is_init = init is not None
335335

336336
TypeInfo info(self):
337-
return self.items[0][0].info
337+
return self.items[0].info
338338

339339
Node set_line(self, Token tok):
340340
super().set_line(tok)
341-
for n, t in self.items:
341+
for n in self.items:
342342
n.line = self.line
343343
return self
344344

345345
Node set_line(self, int tok):
346346
super().set_line(tok)
347-
for n, t in self.items:
347+
for n in self.items:
348348
n.line = self.line
349349
return self
350350

output.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ def function_header(self, o, arg_repr, arg_kinds, pre_args_func=None,
152152
def visit_var_def(self, o):
153153
r = o.repr
154154
if r:
155-
for v, t in o.items:
156-
self.type(t)
155+
for v in o.items:
156+
self.type(v.type)
157157
self.node(v)
158158
self.token(r.assign)
159159
self.node(o.init)

parse.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -524,26 +524,26 @@ def parse_type_def(self, is_interface):
524524

525525
VarDef parse_var_def(self, Type typ):
526526
"""Parse variable definition with explicit types."""
527-
n = self.parse_var_list(typ)
527+
vars = self.parse_var_list(typ)
528528
Node init = None
529529
assign_token = none
530530
if self.current_str() == '=':
531531
assign_token = self.expect('=')
532532
init = self.parse_expression(0)
533-
for nn, t in n:
534-
nn.is_init = init is not None
533+
for v in vars:
534+
v.is_init = init is not None
535535
br = self.expect_break()
536536

537-
node = VarDef(n, self.is_at_top_level(), init)
537+
node = VarDef(vars, self.is_at_top_level(), init)
538538
self.set_repr(node, noderepr.VarDefRepr(assign_token, br))
539539
return node
540540

541-
tuple<Var, Type>[] parse_var_list(self, Type first_type):
541+
Var[] parse_var_list(self, Type first_type):
542542
"""Parse a comma-separated list of variable names, potentially
543543
prefixed by type declarations.
544544
"""
545545
tok = self.expect_type(Name)
546-
n = [(Var(tok.string), first_type)]
546+
n = [Var(tok.string, first_type)]
547547
r = [noderepr.VarRepr(tok, none)]
548548
while self.current_str() == ',':
549549
tok = self.expect(',')
@@ -553,10 +553,10 @@ def parse_type_def(self, is_interface):
553553
if self.is_at_type():
554554
t = self.parse_type()
555555
tok = self.expect_type(Name)
556-
n.append((Var(tok.string), t))
556+
n.append(Var(tok.string, t))
557557
r.append(noderepr.VarRepr(tok, none))
558558
for i in range(len(n)):
559-
self.set_repr(n[i][0], r[i])
559+
self.set_repr(n[i], r[i])
560560
return n
561561

562562
# Parsing statements

pprinter.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,10 @@ class PrettyPrintVisitor(NodeVisitor):
7272
fdef.body.accept(self)
7373

7474
void visit_var_def(self, VarDef vdef):
75-
if vdef.items[0][0].name() != '__name__':
76-
self.type(vdef.items[0][1])
75+
if vdef.items[0].name() != '__name__':
76+
self.type(vdef.items[0].type)
7777
self.string(' ')
78-
self.string(vdef.items[0][0].name())
78+
self.string(vdef.items[0].name())
7979
if vdef.init:
8080
self.string(' = ')
8181
self.node(vdef.init)

pythongen.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ def get_pre_whitespace(self, t):
144144
def visit_var_def(self, o):
145145
r = o.repr
146146
if r:
147-
self.string(self.get_pre_whitespace(o.items[0][1]))
147+
self.string(self.get_pre_whitespace(o.items[0].type))
148148
self.omit_next_space = True
149-
for v, t in o.items:
149+
for v in o.items:
150150
self.node(v)
151151
if o.init:
152152
self.token(r.assign)

semanal.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class SemanticAnalyzer(NodeVisitor):
9292
self.global_decls = [set()]
9393

9494
# Add implicit definition of '__name__'.
95-
name_def = VarDef([(Var('__name__'), Any())], True)
95+
name_def = VarDef([Var('__name__', Any())], True)
9696
defs.insert(0, name_def)
9797

9898
for d in defs:
@@ -111,7 +111,7 @@ class SemanticAnalyzer(NodeVisitor):
111111
# Add implicit definition of 'None' to builtins, as we cannot define a
112112
# variable with a None type explicitly.
113113
if mod_id == 'builtins':
114-
none_def = VarDef([(Var('None'), NoneTyp())], True)
114+
none_def = VarDef([Var('None', NoneTyp())], True)
115115
defs.append(none_def)
116116
self.anal_var_def(none_def)
117117

@@ -139,7 +139,7 @@ class SemanticAnalyzer(NodeVisitor):
139139
self.globals[d.name] = SymbolTableNode(GDEF, info, self.cur_mod_id)
140140

141141
void anal_var_def(self, VarDef d):
142-
for v, t in d.items:
142+
for v in d.items:
143143
self.check_no_global(v.name(), d)
144144
v._full_name = self.qualified_name(v.name())
145145
self.globals[v.name()] = SymbolTableNode(GDEF, v, self.cur_mod_id)
@@ -356,12 +356,9 @@ class SemanticAnalyzer(NodeVisitor):
356356

357357
void visit_var_def(self, VarDef defn):
358358
for i in range(len(defn.items)):
359-
defn.items[i] = (defn.items[i][0],
360-
self.anal_type(defn.items[i][1]))
361-
if defn.items[i][1]:
362-
defn.items[i][0].type = defn.items[i][1]
359+
defn.items[i].type = self.anal_type(defn.items[i].type)
363360

364-
for v, t in defn.items:
361+
for v in defn.items:
365362
if self.locals:
366363
defn.kind = LDEF
367364
self.add_local(v, defn)

strconv.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def func_helper(self, o):
6464
def visit_mypy_file(self, o):
6565
# Skip implicit definition of __name__.
6666
if (o.defs and isinstance(o.defs[0], nodes.VarDef) and
67-
o.defs[0].items[0][0].name() == '__name__'):
67+
o.defs[0].items[0].name() == '__name__'):
6868
a = [o.defs[1:]]
6969
else:
7070
a = [o.defs]
@@ -126,9 +126,9 @@ def visit_type_def(self, o):
126126

127127
def visit_var_def(self, o):
128128
a = []
129-
for n, t in o.items:
129+
for n in o.items:
130130
a.append('Var({})'.format(n.name()))
131-
a.append('Type({})'.format(t))
131+
a.append('Type({})'.format(n.type))
132132
if o.init:
133133
a.append(o.init)
134134
return self.dump(a, o)

transform.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ class DyncheckTransformVisitor(TraverserVisitor):
9898
super().visit_var_def(o)
9999

100100
if o.init is not None:
101-
if o.items[0][0].type:
102-
t = o.items[0][0].type
101+
if o.items[0].type:
102+
t = o.items[0].type
103103
else:
104104
t = Any()
105105
o.init = self.coerce(o.init, t, self.get_type(o.init),

transformtype.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class TypeTransformer:
7979
elif isinstance(d, VarDef):
8080
vdef = (VarDef)d
8181
defs.extend(self.transform_var_def(vdef))
82-
for n, vt in vdef.items:
82+
for n in vdef.items:
8383
vars.add(n)
8484

8585
# Add accessors for implicitly defined attributes.
@@ -244,7 +244,7 @@ class TypeTransformer:
244244

245245
# Add $x and set$x accessor wrappers for data attributes. These let
246246
# derived classes redefine a data attribute as a property.
247-
for n, vt in o.items:
247+
for n in o.items:
248248
res.extend(self.make_accessors(n))
249249

250250
return res
@@ -366,7 +366,7 @@ class TypeTransformer:
366366
Node[] generic_accessor_wrappers(self, VarDef vdef):
367367
"""Construct wrapper class methods for attribute accessors."""
368368
res = <Node> []
369-
for n, vt in vdef.items:
369+
for n in vdef.items:
370370
if n.type:
371371
t = n.type
372372
else:
@@ -442,8 +442,8 @@ class TypeTransformer:
442442
This is added to a generic wrapper class.
443443
"""
444444
# The type is 'any' since it should behave covariantly in subclasses.
445-
return [VarDef([(Var(self.object_member_name(tdef.info)),
446-
Any())], False, None)]
445+
return [VarDef([Var(self.object_member_name(tdef.info),
446+
Any())], False, None)]
447447

448448
str object_member_name(self, TypeInfo info):
449449
if self.tf.is_java:
@@ -513,8 +513,8 @@ class TypeTransformer:
513513
# Only include a type variable if it introduces a new slot.
514514
slot = get_tvar_access_path(info, n + 1)[0] - 1
515515
if slot >= base_slots:
516-
defs.append(VarDef([(Var(tvar_slot_name(slot, is_alt)),
517-
Any())], False, None))
516+
defs.append(VarDef([Var(tvar_slot_name(slot, is_alt),
517+
Any())], False, None))
518518
return defs
519519

520520
void make_instance_tvar_initializer(self, FuncDef creat):

traverser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def visit_decorator(self, o):
5050
T visit_var_def(self, VarDef o):
5151
if o.init is not None:
5252
o.init.accept(self)
53-
for v, t in o.items:
53+
for v in o.items:
5454
self.visit_var(v)
5555

5656
def visit_expression_stmt(self, o):

0 commit comments

Comments
 (0)