@@ -103,21 +103,9 @@ class EmitVisitor(asdl.VisitorBase):
103
103
104
104
def __init__ (self , file , metadata = None ):
105
105
self .file = file
106
- self .identifiers = set ()
107
- self .singletons = set ()
108
- self .types = set ()
109
106
self ._metadata = metadata
110
107
super (EmitVisitor , self ).__init__ ()
111
108
112
- def emit_identifier (self , name ):
113
- self .identifiers .add (str (name ))
114
-
115
- def emit_singleton (self , name ):
116
- self .singletons .add (str (name ))
117
-
118
- def emit_type (self , name ):
119
- self .types .add (str (name ))
120
-
121
109
def emit (self , s , depth , reflow = True ):
122
110
# XXX reflow long lines?
123
111
if reflow :
@@ -143,6 +131,8 @@ def metadata(self, value):
143
131
self ._metadata = value
144
132
145
133
class MetadataVisitor (asdl .VisitorBase ):
134
+ ROOT_TYPE = "AST"
135
+
146
136
def __init__ (self , * args , ** kwargs ):
147
137
super ().__init__ (* args , ** kwargs )
148
138
@@ -151,8 +141,16 @@ def __init__(self, *args, **kwargs):
151
141
# names where all the constructors
152
142
# belonging to that type lack of any
153
143
# fields.
144
+ # - identifiers: All identifiers used in the AST decclarations
145
+ # - singletons: List of all constructors that originates from
146
+ # simple sums.
147
+ # - types: List of all top level type names
148
+ #
154
149
self .metadata = types .SimpleNamespace (
155
- simple_sums = set ()
150
+ simple_sums = set (),
151
+ identifiers = set (),
152
+ singletons = set (),
153
+ types = {self .ROOT_TYPE },
156
154
)
157
155
158
156
def visitModule (self , mod ):
@@ -163,9 +161,35 @@ def visitType(self, type):
163
161
self .visit (type .value , type .name )
164
162
165
163
def visitSum (self , sum , name ):
166
- if is_simple (sum ):
164
+ self .metadata .types .add (name )
165
+
166
+ simple_sum = is_simple (sum )
167
+ if simple_sum :
167
168
self .metadata .simple_sums .add (name )
168
169
170
+ for constructor in sum .types :
171
+ if simple_sum :
172
+ self .metadata .singletons .add (constructor .name )
173
+ self .visitConstructor (constructor )
174
+ self .visitFields (sum .attributes )
175
+
176
+ def visitConstructor (self , constructor ):
177
+ self .metadata .types .add (constructor .name )
178
+ self .visitFields (constructor .fields )
179
+
180
+ def visitProduct (self , product , name ):
181
+ self .metadata .types .add (name )
182
+ self .visitFields (product .attributes )
183
+ self .visitFields (product .fields )
184
+
185
+ def visitFields (self , fields ):
186
+ for field in fields :
187
+ self .visitField (field )
188
+
189
+ def visitField (self , field ):
190
+ self .metadata .identifiers .add (field .name )
191
+
192
+
169
193
class TypeDefVisitor (EmitVisitor ):
170
194
def visitModule (self , mod ):
171
195
for dfn in mod .dfns :
@@ -683,45 +707,33 @@ def emit_sequence_constructor(self, name, type):
683
707
class PyTypesDeclareVisitor (PickleVisitor ):
684
708
685
709
def visitProduct (self , prod , name ):
686
- self .emit_type ("%s_type" % name )
687
710
self .emit ("static PyObject* ast2obj_%s(struct ast_state *state, void*);" % name , 0 )
688
711
if prod .attributes :
689
- for a in prod .attributes :
690
- self .emit_identifier (a .name )
691
712
self .emit ("static const char * const %s_attributes[] = {" % name , 0 )
692
713
for a in prod .attributes :
693
714
self .emit ('"%s",' % a .name , 1 )
694
715
self .emit ("};" , 0 )
695
716
if prod .fields :
696
- for f in prod .fields :
697
- self .emit_identifier (f .name )
698
717
self .emit ("static const char * const %s_fields[]={" % name ,0 )
699
718
for f in prod .fields :
700
719
self .emit ('"%s",' % f .name , 1 )
701
720
self .emit ("};" , 0 )
702
721
703
722
def visitSum (self , sum , name ):
704
- self .emit_type ("%s_type" % name )
705
723
if sum .attributes :
706
- for a in sum .attributes :
707
- self .emit_identifier (a .name )
708
724
self .emit ("static const char * const %s_attributes[] = {" % name , 0 )
709
725
for a in sum .attributes :
710
726
self .emit ('"%s",' % a .name , 1 )
711
727
self .emit ("};" , 0 )
712
728
ptype = "void*"
713
729
if is_simple (sum ):
714
730
ptype = get_c_type (name )
715
- for t in sum .types :
716
- self .emit_singleton ("%s_singleton" % t .name )
717
731
self .emit ("static PyObject* ast2obj_%s(struct ast_state *state, %s);" % (name , ptype ), 0 )
718
732
for t in sum .types :
719
733
self .visitConstructor (t , name )
720
734
721
735
def visitConstructor (self , cons , name ):
722
736
if cons .fields :
723
- for t in cons .fields :
724
- self .emit_identifier (t .name )
725
737
self .emit ("static const char * const %s_fields[]={" % cons .name , 0 )
726
738
for t in cons .fields :
727
739
self .emit ('"%s",' % t .name , 1 )
@@ -1099,8 +1111,6 @@ def visitProduct(self, prod, name):
1099
1111
(name , name , fields , len (prod .fields )), 1 )
1100
1112
self .emit ('%s);' % reflow_c_string (asdl_of (name , prod ), 2 ), 2 , reflow = False )
1101
1113
self .emit ("if (!state->%s_type) return 0;" % name , 1 )
1102
- self .emit_type ("AST_type" )
1103
- self .emit_type ("%s_type" % name )
1104
1114
if prod .attributes :
1105
1115
self .emit ("if (!add_attributes(state, state->%s_type, %s_attributes, %d)) return 0;" %
1106
1116
(name , name , len (prod .attributes )), 1 )
@@ -1113,7 +1123,6 @@ def visitSum(self, sum, name):
1113
1123
self .emit ('state->%s_type = make_type(state, "%s", state->AST_type, NULL, 0,' %
1114
1124
(name , name ), 1 )
1115
1125
self .emit ('%s);' % reflow_c_string (asdl_of (name , sum ), 2 ), 2 , reflow = False )
1116
- self .emit_type ("%s_type" % name )
1117
1126
self .emit ("if (!state->%s_type) return 0;" % name , 1 )
1118
1127
if sum .attributes :
1119
1128
self .emit ("if (!add_attributes(state, state->%s_type, %s_attributes, %d)) return 0;" %
@@ -1134,7 +1143,6 @@ def visitConstructor(self, cons, name, simple):
1134
1143
(cons .name , cons .name , name , fields , len (cons .fields )), 1 )
1135
1144
self .emit ('%s);' % reflow_c_string (asdl_of (cons .name , cons ), 2 ), 2 , reflow = False )
1136
1145
self .emit ("if (!state->%s_type) return 0;" % cons .name , 1 )
1137
- self .emit_type ("%s_type" % cons .name )
1138
1146
self .emit_defaults (cons .name , cons .fields , 1 )
1139
1147
if simple :
1140
1148
self .emit ("state->%s_singleton = PyType_GenericNew((PyTypeObject *)"
@@ -1439,17 +1447,8 @@ def generate_ast_fini(module_state, f):
1439
1447
""" ))
1440
1448
1441
1449
1442
- def generate_module_def (mod , f , internal_h ):
1450
+ def generate_module_def (mod , metadata , f , internal_h ):
1443
1451
# Gather all the data needed for ModuleSpec
1444
- visitor_list = set ()
1445
- with open (os .devnull , "w" ) as devnull :
1446
- visitor = PyTypesDeclareVisitor (devnull )
1447
- visitor .visit (mod )
1448
- visitor_list .add (visitor )
1449
- visitor = PyTypesVisitor (devnull )
1450
- visitor .visit (mod )
1451
- visitor_list .add (visitor )
1452
-
1453
1452
state_strings = {
1454
1453
"ast" ,
1455
1454
"_fields" ,
@@ -1458,16 +1457,19 @@ def generate_module_def(mod, f, internal_h):
1458
1457
"__dict__" ,
1459
1458
"__module__" ,
1460
1459
"_attributes" ,
1460
+ * metadata .identifiers
1461
1461
}
1462
+
1462
1463
module_state = state_strings .copy ()
1463
- for visitor in visitor_list :
1464
- for identifier in visitor .identifiers :
1465
- module_state .add (identifier )
1466
- state_strings .add (identifier )
1467
- for singleton in visitor .singletons :
1468
- module_state .add (singleton )
1469
- for tp in visitor .types :
1470
- module_state .add (tp )
1464
+ module_state .update (
1465
+ "%s_singleton" % singleton
1466
+ for singleton in metadata .singletons
1467
+ )
1468
+ module_state .update (
1469
+ "%s_type" % type
1470
+ for type in metadata .types
1471
+ )
1472
+
1471
1473
state_strings = sorted (state_strings )
1472
1474
module_state = sorted (module_state )
1473
1475
@@ -1583,7 +1585,7 @@ def write_internal_h_footer(mod, f):
1583
1585
""" ), file = f )
1584
1586
1585
1587
def write_source (mod , metadata , f , internal_h_file ):
1586
- generate_module_def (mod , f , internal_h_file )
1588
+ generate_module_def (mod , metadata , f , internal_h_file )
1587
1589
1588
1590
v = ChainOfVisitors (
1589
1591
SequenceConstructorVisitor (f ),
0 commit comments