rustc: Add a function to look up external item info in the item info table
This commit is contained in:
parent
027368b885
commit
bea41aa7d8
1 changed files with 52 additions and 4 deletions
|
@ -309,7 +309,6 @@ impure fn resolve_path(vec[ast.ident] path, vec[u8] data) -> resolve_result {
|
||||||
auto ebml_r = ebml.create_reader(io_r);
|
auto ebml_r = ebml.create_reader(io_r);
|
||||||
while (ebml.bytes_left(ebml_r) > 0u) {
|
while (ebml.bytes_left(ebml_r) > 0u) {
|
||||||
auto ebml_tag = ebml.peek(ebml_r);
|
auto ebml_tag = ebml.peek(ebml_r);
|
||||||
log #fmt("outer ebml tag id: %u", ebml_tag.id);
|
|
||||||
if (ebml_tag.id == metadata.tag_paths) {
|
if (ebml_tag.id == metadata.tag_paths) {
|
||||||
ebml.move_to_first_child(ebml_r);
|
ebml.move_to_first_child(ebml_r);
|
||||||
ret resolve_path_inner(path, ebml_r);
|
ret resolve_path_inner(path, ebml_r);
|
||||||
|
@ -321,6 +320,57 @@ impure fn resolve_path(vec[ast.ident] path, vec[u8] data) -> resolve_result {
|
||||||
fail;
|
fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impure fn move_to_item(&ebml.reader ebml_r, ast.def_id did) {
|
||||||
|
while (ebml.bytes_left(ebml_r) > 0u) {
|
||||||
|
auto outer_ebml_tag = ebml.peek(ebml_r);
|
||||||
|
if (outer_ebml_tag.id == metadata.tag_items) {
|
||||||
|
ebml.move_to_first_child(ebml_r);
|
||||||
|
|
||||||
|
while (ebml.bytes_left(ebml_r) > 0u) {
|
||||||
|
auto inner_ebml_tag = ebml.peek(ebml_r);
|
||||||
|
if (inner_ebml_tag.id == metadata.tag_items_item) {
|
||||||
|
ebml.move_to_first_child(ebml_r);
|
||||||
|
|
||||||
|
while (ebml.bytes_left(ebml_r) > 0u) {
|
||||||
|
auto innermost_ebml_tag = ebml.peek(ebml_r);
|
||||||
|
if (innermost_ebml_tag.id ==
|
||||||
|
metadata.tag_items_def_id) {
|
||||||
|
ebml.move_to_first_child(ebml_r);
|
||||||
|
auto did_data = ebml.read_data(ebml_r);
|
||||||
|
ebml.move_to_parent(ebml_r);
|
||||||
|
|
||||||
|
auto this_did = parse_def_id(did_data);
|
||||||
|
if (did._0 == this_did._0 &&
|
||||||
|
did._1 == this_did._1) {
|
||||||
|
// Move to the start of this item's data.
|
||||||
|
ebml.move_to_parent(ebml_r);
|
||||||
|
ebml.move_to_first_child(ebml_r);
|
||||||
|
ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ebml.move_to_next_sibling(ebml_r);
|
||||||
|
}
|
||||||
|
ebml.move_to_parent(ebml_r);
|
||||||
|
}
|
||||||
|
ebml.move_to_next_sibling(ebml_r);
|
||||||
|
}
|
||||||
|
ebml.move_to_parent(ebml_r);
|
||||||
|
}
|
||||||
|
ebml.move_to_next_sibling(ebml_r);
|
||||||
|
}
|
||||||
|
|
||||||
|
log #fmt("move_to_item: item not found: %d:%d", did._0, did._1);
|
||||||
|
}
|
||||||
|
|
||||||
|
impure fn get_item_kind(ast.def_id did, vec[u8] data) -> u8 {
|
||||||
|
auto io_r = io.new_reader_(io.new_byte_buf_reader(data));
|
||||||
|
auto ebml_r = ebml.create_reader(io_r);
|
||||||
|
move_to_item(ebml_r, did);
|
||||||
|
|
||||||
|
log "found item";
|
||||||
|
fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
fn load_crate(session.session sess,
|
fn load_crate(session.session sess,
|
||||||
int cnum,
|
int cnum,
|
||||||
|
@ -407,10 +457,8 @@ fn lookup_def(session.session sess, &span sp, int cnum, vec[ast.ident] path)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log #fmt("resolved '%s' to %d:%d", _str.connect(path, "."), did._0,
|
|
||||||
did._1);
|
|
||||||
|
|
||||||
// TODO: Look up item type, use that to determine the type of def.
|
// TODO: Look up item type, use that to determine the type of def.
|
||||||
|
auto kind_ch = get_item_kind(did, data);
|
||||||
|
|
||||||
fail;
|
fail;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue