@@ -79,6 +79,13 @@ fn encode_def_id(ebml_w: ebml::writer, id: def_id) {
79
79
ebml_w. wr_tagged_str ( tag_def_id, def_to_str ( id) ) ;
80
80
}
81
81
82
+ /* Encodes the given name, then def_id as tagged strings */
83
+ fn encode_name_and_def_id ( ebml_w : ebml:: writer , nm : ident ,
84
+ id : node_id ) {
85
+ encode_name ( ebml_w, nm) ;
86
+ encode_def_id ( ebml_w, local_def ( id) ) ;
87
+ }
88
+
82
89
fn encode_region_param ( ebml_w : ebml:: writer , rp : region_param ) {
83
90
ebml_w. wr_tag ( tag_region_param) { ||
84
91
serialize_region_param ( ebml_w, rp)
@@ -146,90 +153,79 @@ fn encode_class_item_paths(ebml_w: ebml::writer,
146
153
147
154
fn encode_module_item_paths( ebml_w: ebml:: writer, ecx: @encode_ctxt,
148
155
module: _mod, path: [ str] , & index: [ entry < str > ] ) {
149
- // FIXME factor out add_to_index/start/encode_name/encode_def_id/end ops
150
156
for module. items. each { |it|
151
157
if ! reachable( ecx, it. id) ||
152
158
!ast_util:: is_exported( it. ident, module) { cont; }
159
+ if !ast_util:: is_item_impl( it) {
160
+ add_to_index( ebml_w, path, index, it. ident) ;
161
+ }
153
162
alt it. node {
154
163
item_const( _, _) {
155
- add_to_index( ebml_w, path, index, it. ident) ;
156
164
encode_named_def_id( ebml_w, it. ident, local_def( it. id) ) ;
157
165
}
158
166
item_fn( _, tps, _) {
159
- add_to_index( ebml_w, path, index, it. ident) ;
160
167
encode_named_def_id( ebml_w, it. ident, local_def( it. id) ) ;
161
168
}
162
169
item_mod( _mod) {
163
- add_to_index( ebml_w, path, index, it. ident) ;
164
- ebml_w. start_tag( tag_paths_data_mod) ;
165
- encode_name( ebml_w, it. ident) ;
166
- encode_def_id( ebml_w, local_def( it. id) ) ;
167
- encode_module_item_paths( ebml_w, ecx, _mod, path + [ it. ident] ,
168
- index) ;
169
- ebml_w. end_tag( ) ;
170
+ ebml_w. wr_tag( tag_paths_data_mod) { ||
171
+ encode_name_and_def_id( ebml_w, it. ident, it. id) ;
172
+ encode_module_item_paths( ebml_w, ecx, _mod, path + [ it. ident] ,
173
+ index) ;
174
+ }
170
175
}
171
176
item_native_mod( nmod) {
172
- add_to_index( ebml_w, path, index, it. ident) ;
173
- ebml_w. start_tag( tag_paths_data_mod) ;
174
- encode_name( ebml_w, it. ident) ;
175
- encode_def_id( ebml_w, local_def( it. id) ) ;
176
- encode_native_module_item_paths( ebml_w, nmod, path + [ it. ident] ,
177
- index) ;
178
- ebml_w. end_tag( ) ;
177
+ ebml_w. wr_tag( tag_paths_data_mod) { ||
178
+ encode_name_and_def_id( ebml_w, it. ident, it. id) ;
179
+ encode_native_module_item_paths( ebml_w, nmod,
180
+ path + [ it. ident] , index) ;
181
+ }
179
182
}
180
183
item_ty( _, tps, _) {
181
- add_to_index( ebml_w, path, index, it. ident) ;
182
- ebml_w. start_tag( tag_paths_data_item) ;
183
- encode_name( ebml_w, it. ident) ;
184
- encode_def_id( ebml_w, local_def( it. id) ) ;
185
- ebml_w. end_tag( ) ;
184
+ ebml_w. wr_tag( tag_paths_data_item) { ||
185
+ encode_name_and_def_id( ebml_w, it. ident, it. id) ;
186
+ }
186
187
}
187
188
item_res( _, tps, _, _, ctor_id, _) {
189
+ ebml_w. wr_tag( tag_paths_data_item) { ||
190
+ encode_name_and_def_id( ebml_w, it. ident, ctor_id) ;
191
+ }
192
+ // The same ident has to be added twice (with different positions)
193
+ // because it's for both the ctor and the dtor.
188
194
add_to_index( ebml_w, path, index, it. ident) ;
189
- ebml_w. start_tag( tag_paths_data_item) ;
190
- encode_name( ebml_w, it. ident) ;
191
- encode_def_id( ebml_w, local_def( ctor_id) ) ;
192
- ebml_w. end_tag( ) ;
193
- add_to_index( ebml_w, path, index, it. ident) ;
194
- ebml_w. start_tag( tag_paths_data_item) ;
195
- encode_name( ebml_w, it. ident) ;
196
- encode_def_id( ebml_w, local_def( it. id) ) ;
197
- ebml_w. end_tag( ) ;
195
+ ebml_w. wr_tag( tag_paths_data_item) { ||
196
+ encode_name_and_def_id( ebml_w, it. ident, it. id) ;
197
+ }
198
198
}
199
199
item_class( _, _, items, ctor, m_dtor, _) {
200
- add_to_index ( ebml_w, path , index , it . ident ) ;
201
- ebml_w. start_tag ( tag_paths_data_item ) ;
202
- encode_name ( ebml_w , it . ident ) ;
203
- encode_def_id ( ebml_w, local_def ( it . id ) ) ;
204
- ebml_w . end_tag ( ) ;
205
- ebml_w . start_tag ( tag_paths ) ;
206
- add_to_index( ebml_w, path, index, it. ident) ;
207
- #debug ( "ctor id: %d" , ctor . node . id ) ;
208
- encode_named_def_id ( ebml_w , it . ident , local_def( ctor. node. id) ) ;
209
- /* Encode id for dtor */
210
- option:: iter( m_dtor) { |dtor|
211
- ebml_w. start_tag ( tag_item_dtor) ;
212
- encode_def_id( ebml_w, local_def( dtor. node. id) ) ;
213
- ebml_w . end_tag ( ) ;
214
- } ;
215
- encode_class_item_paths( ebml_w, items, path + [ it. ident] ,
216
- index) ;
217
- ebml_w . end_tag ( ) ;
200
+ ebml_w. wr_tag ( tag_paths_data_item ) { ||
201
+ encode_name_and_def_id ( ebml_w, it . ident , it . id ) ;
202
+ }
203
+ ebml_w. wr_tag ( tag_paths ) { ||
204
+ // As in the res case, we add the same ident twice: for the
205
+ // class and for its ctor
206
+ add_to_index( ebml_w, path, index, it. ident) ;
207
+ encode_named_def_id ( ebml_w , it . ident ,
208
+ local_def( ctor. node. id) ) ;
209
+ /* Encode id for dtor */
210
+ option:: iter( m_dtor) { |dtor|
211
+ ebml_w. wr_tag ( tag_item_dtor) { ||
212
+ encode_def_id( ebml_w, local_def( dtor. node. id) ) ;
213
+ }
214
+ } ;
215
+ encode_class_item_paths( ebml_w, items, path + [ it. ident] ,
216
+ index) ;
217
+ }
218
218
}
219
219
item_enum( variants, _, _) {
220
- add_to_index( ebml_w, path, index, it. ident) ;
221
- ebml_w. start_tag( tag_paths_data_item) ;
222
- encode_name( ebml_w, it. ident) ;
223
- encode_def_id( ebml_w, local_def( it. id) ) ;
224
- ebml_w. end_tag( ) ;
225
- encode_enum_variant_paths( ebml_w, variants, path, index) ;
220
+ ebml_w. wr_tag( tag_paths_data_item) { ||
221
+ encode_name_and_def_id( ebml_w, it. ident, it. id) ;
222
+ }
223
+ encode_enum_variant_paths( ebml_w, variants, path, index) ;
226
224
}
227
225
item_iface( * ) {
228
- add_to_index( ebml_w, path, index, it. ident) ;
229
- ebml_w. start_tag( tag_paths_data_item) ;
230
- encode_name( ebml_w, it. ident) ;
231
- encode_def_id( ebml_w, local_def( it. id) ) ;
232
- ebml_w. end_tag( ) ;
226
+ ebml_w. wr_tag( tag_paths_data_item) { ||
227
+ encode_name_and_def_id( ebml_w, it. ident, it. id) ;
228
+ }
233
229
}
234
230
item_impl( * ) { }
235
231
}
@@ -629,7 +625,6 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
629
625
encode_enum_variant_info( ecx, ebml_w, item. id, variants,
630
626
path, index, tps) ;
631
627
}
632
- // FIXME: not sure if the dtor should be serialized
633
628
item_class( tps, ifaces, items, ctor, _dtor, rp) {
634
629
/* First, encode the fields and methods
635
630
These come first because we need to write them to make
@@ -810,7 +805,6 @@ fn encode_info_for_items(ecx: @encode_ctxt, ebml_w: ebml::writer,
810
805
encode_info_for_item( ecx, ebml_w, i, index, * pt) ;
811
806
/* encode ctor, then encode items */
812
807
alt i. node {
813
- // FIXME: not doing anything with dtor
814
808
item_class( tps, _, _, ctor, _, _) {
815
809
/* this is assuming that ctors aren't inlined...
816
810
probably shouldn't assume that */
@@ -1023,6 +1017,7 @@ fn encode_crate_deps(ebml_w: ebml::writer, cstore: cstore::cstore) {
1023
1017
// the assumption that they are numbered 1 to n.
1024
1018
// FIXME: This is not nearly enough to support correct versioning
1025
1019
// but is enough to get transitive crate dependencies working.
1020
+ // See #2166
1026
1021
ebml_w. start_tag ( tag_crate_deps) ;
1027
1022
for get_ordered_deps( cstore) . each { |dep|
1028
1023
encode_crate_dep( ebml_w, dep) ;
0 commit comments