Skip to content

Commit c97b29a

Browse files
committed
Refactor encoder::encode_module_item_paths
to eliminate some repeated code.
1 parent cf2fc2c commit c97b29a

File tree

2 files changed

+64
-62
lines changed

2 files changed

+64
-62
lines changed

src/librustsyntax/ast_util.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,6 +521,13 @@ fn compute_id_range_for_inlined_item(item: inlined_item) -> id_range {
521521
compute_id_range { |f| visit_ids_for_inlined_item(item, f) }
522522
}
523523

524+
pure fn is_item_impl(item: @ast::item) -> bool {
525+
alt item.node {
526+
item_impl(*) { true }
527+
_ { false }
528+
}
529+
}
530+
524531
// Local Variables:
525532
// mode: rust
526533
// fill-column: 78;

src/rustc/metadata/encoder.rs

Lines changed: 57 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,13 @@ fn encode_def_id(ebml_w: ebml::writer, id: def_id) {
7979
ebml_w.wr_tagged_str(tag_def_id, def_to_str(id));
8080
}
8181

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+
8289
fn encode_region_param(ebml_w: ebml::writer, rp: region_param) {
8390
ebml_w.wr_tag(tag_region_param) {||
8491
serialize_region_param(ebml_w, rp)
@@ -146,90 +153,79 @@ fn encode_class_item_paths(ebml_w: ebml::writer,
146153

147154
fn encode_module_item_paths(ebml_w: ebml::writer, ecx: @encode_ctxt,
148155
module: _mod, path: [str], &index: [entry<str>]) {
149-
// FIXME factor out add_to_index/start/encode_name/encode_def_id/end ops
150156
for module.items.each {|it|
151157
if !reachable(ecx, it.id) ||
152158
!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+
}
153162
alt it.node {
154163
item_const(_, _) {
155-
add_to_index(ebml_w, path, index, it.ident);
156164
encode_named_def_id(ebml_w, it.ident, local_def(it.id));
157165
}
158166
item_fn(_, tps, _) {
159-
add_to_index(ebml_w, path, index, it.ident);
160167
encode_named_def_id(ebml_w, it.ident, local_def(it.id));
161168
}
162169
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+
}
170175
}
171176
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+
}
179182
}
180183
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+
}
186187
}
187188
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.
188194
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+
}
198198
}
199199
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+
}
218218
}
219219
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);
226224
}
227225
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+
}
233229
}
234230
item_impl(*) {}
235231
}
@@ -629,7 +625,6 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
629625
encode_enum_variant_info(ecx, ebml_w, item.id, variants,
630626
path, index, tps);
631627
}
632-
// FIXME: not sure if the dtor should be serialized
633628
item_class(tps, ifaces, items, ctor, _dtor, rp) {
634629
/* First, encode the fields and methods
635630
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,
810805
encode_info_for_item(ecx, ebml_w, i, index, *pt);
811806
/* encode ctor, then encode items */
812807
alt i.node {
813-
// FIXME: not doing anything with dtor
814808
item_class(tps, _, _, ctor, _, _) {
815809
/* this is assuming that ctors aren't inlined...
816810
probably shouldn't assume that */
@@ -1023,6 +1017,7 @@ fn encode_crate_deps(ebml_w: ebml::writer, cstore: cstore::cstore) {
10231017
// the assumption that they are numbered 1 to n.
10241018
// FIXME: This is not nearly enough to support correct versioning
10251019
// but is enough to get transitive crate dependencies working.
1020+
// See #2166
10261021
ebml_w.start_tag(tag_crate_deps);
10271022
for get_ordered_deps(cstore).each {|dep|
10281023
encode_crate_dep(ebml_w, dep);

0 commit comments

Comments
 (0)