From 0bf75a203e6611f0b0293c3fc08a6f2ee3a5f1ba Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Mon, 18 Apr 2011 09:22:23 +0200 Subject: collect crate meta info and ext crate names --- src/comp/driver/rustc.rs | 3 ++- src/comp/driver/session.rs | 17 +++++++++++++---- src/comp/front/creader.rs | 10 +++++----- src/comp/front/eval.rs | 5 ++++- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs index d6f6f694..afa2a9bb 100644 --- a/src/comp/driver/rustc.rs +++ b/src/comp/driver/rustc.rs @@ -128,8 +128,9 @@ impure fn main(vec[str] args) { auto crate_cache = common.new_int_hash[session.crate_metadata](); auto target_crate_num = 0; + let vec[@front.ast.meta_item] md = vec(); auto sess = session.session(target_crate_num, target_cfg, crate_cache, - front.codemap.new_codemap()); + md, front.codemap.new_codemap()); let option.t[str] input_file = none[str]; let option.t[str] output_file = none[str]; diff --git a/src/comp/driver/session.rs b/src/comp/driver/session.rs index dab02fbd..9cbbc94c 100644 --- a/src/comp/driver/session.rs +++ b/src/comp/driver/session.rs @@ -23,11 +23,13 @@ type cfg = rec(os os, ty_mach uint_type, ty_mach float_type); -type crate_metadata = vec[u8]; +type crate_metadata = rec(str name, + vec[u8] data); -obj session(ast.crate_num cnum, cfg targ, - map.hashmap[int, crate_metadata] crates, - codemap.codemap cm) { +state obj session(ast.crate_num cnum, cfg targ, + map.hashmap[int, crate_metadata] crates, + mutable vec[@ast.meta_item] metadata, + codemap.codemap cm) { fn get_targ_cfg() -> cfg { ret targ; @@ -53,6 +55,13 @@ obj session(ast.crate_num cnum, cfg targ, fail; } + fn add_metadata(vec[@ast.meta_item] data) { + metadata = metadata + data; + } + fn get_metadata() -> vec[@ast.meta_item] { + ret metadata; + } + fn span_warn(span sp, str msg) { auto lo = codemap.lookup_pos(cm, sp.lo); auto hi = codemap.lookup_pos(cm, sp.hi); diff --git a/src/comp/front/creader.rs b/src/comp/front/creader.rs index b7015380..55b40cce 100644 --- a/src/comp/front/creader.rs +++ b/src/comp/front/creader.rs @@ -400,7 +400,7 @@ fn load_crate(session.session sess, auto path = fs.connect(library_search_path, filename); alt (get_metadata_section(path)) { case (option.some[vec[u8]](?cvec)) { - sess.set_external_crate(cnum, cvec); + sess.set_external_crate(cnum, rec(name=ident, data=cvec)); ret; } case (_) {} @@ -470,7 +470,7 @@ fn kind_has_type_params(u8 kind_ch) -> bool { fn lookup_def(session.session sess, int cnum, vec[ast.ident] path) -> option.t[ast.def] { - auto data = sess.get_external_crate(cnum); + auto data = sess.get_external_crate(cnum).data; auto did; alt (resolve_path(path, data)) { @@ -513,7 +513,7 @@ fn lookup_def(session.session sess, int cnum, vec[ast.ident] path) fn get_type(session.session sess, ast.def_id def) -> ty.ty_param_count_and_ty { auto external_crate_id = def._0; - auto data = sess.get_external_crate(external_crate_id); + auto data = sess.get_external_crate(external_crate_id).data; auto item = lookup_item(def._1, data); auto t = item_type(item, external_crate_id); @@ -531,7 +531,7 @@ fn get_type(session.session sess, ast.def_id def) fn get_symbol(session.session sess, ast.def_id def) -> str { auto external_crate_id = def._0; - auto data = sess.get_external_crate(external_crate_id); + auto data = sess.get_external_crate(external_crate_id).data; auto item = lookup_item(def._1, data); ret item_symbol(item); } @@ -539,7 +539,7 @@ fn get_symbol(session.session sess, ast.def_id def) -> str { fn get_tag_variants(session.session sess, ast.def_id def) -> vec[trans.variant_info] { auto external_crate_id = def._0; - auto data = sess.get_external_crate(external_crate_id); + auto data = sess.get_external_crate(external_crate_id).data; auto items = ebml.get_doc(ebml.new_doc(data), metadata.tag_items); auto item = find_item(def._1, items); diff --git a/src/comp/front/eval.rs b/src/comp/front/eval.rs index ca350c36..8306bcf0 100644 --- a/src/comp/front/eval.rs +++ b/src/comp/front/eval.rs @@ -419,7 +419,10 @@ impure fn eval_crate_directive(ctx cx, ast.index_view_item(index, vi); } - case (ast.cdir_meta(?mi)) {} + case (ast.cdir_meta(?mi)) { + cx.sess.add_metadata(mi); + } + case (ast.cdir_syntax(?pth)) {} case (ast.cdir_auth(?pth, ?eff)) {} } -- cgit v1.2.3