diff options
| author | Patrick Walton <[email protected]> | 2011-03-15 17:33:05 -0700 |
|---|---|---|
| committer | Patrick Walton <[email protected]> | 2011-03-15 17:33:05 -0700 |
| commit | 71b6e602c54f78dc2f8f33de2d74b40879316165 (patch) | |
| tree | 87d92ce397c471e3046868b38a40ed67a69ca9f3 /src | |
| parent | Revert "Change the numbering of upcall functions. upcall_0 now calls a functi... (diff) | |
| download | rust-71b6e602c54f78dc2f8f33de2d74b40879316165.tar.xz rust-71b6e602c54f78dc2f8f33de2d74b40879316165.zip | |
rustc: Add an annotation for the crate definition to view_item_use
Diffstat (limited to 'src')
| -rw-r--r-- | src/comp/driver/rustc.rs | 2 | ||||
| -rw-r--r-- | src/comp/front/ast.rs | 4 | ||||
| -rw-r--r-- | src/comp/front/creader.rs | 43 | ||||
| -rw-r--r-- | src/comp/front/parser.rs | 3 | ||||
| -rw-r--r-- | src/comp/middle/fold.rs | 12 | ||||
| -rw-r--r-- | src/comp/middle/resolve.rs | 4 | ||||
| -rw-r--r-- | src/comp/pretty/pprust.rs | 2 |
7 files changed, 50 insertions, 20 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs index ed03f1d2..312166c4 100644 --- a/src/comp/driver/rustc.rs +++ b/src/comp/driver/rustc.rs @@ -59,7 +59,7 @@ impure fn compile_input(session.session sess, auto def = tup(0, 0); auto p = parser.new_parser(sess, env, def, input); auto crate = parse_input(sess, p, input); - crate = creader.read_crates(sess, crate); + crate = creader.read_crates(sess, crate, library_search_paths); crate = resolve.resolve_crate(sess, crate); crate = typeck.check_crate(sess, crate); trans.trans_crate(sess, crate, output, shared); diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs index 3de72406..1970f788 100644 --- a/src/comp/front/ast.rs +++ b/src/comp/front/ast.rs @@ -349,7 +349,7 @@ type variant = rec(str name, vec[variant_arg] args, def_id id, ann ann); type view_item = spanned[view_item_]; tag view_item_ { - view_item_use(ident, vec[@meta_item], def_id); + view_item_use(ident, vec[@meta_item], def_id, ann); view_item_import(ident, vec[ident], def_id, option.t[def]); view_item_export(ident); } @@ -376,7 +376,7 @@ type external_crate_info = (); fn index_view_item(mod_index index, @view_item it) { alt (it.node) { - case(ast.view_item_use(?id, _, _)) { + case(ast.view_item_use(?id, _, _, _)) { index.insert(id, ast.mie_view_item(it)); } case(ast.view_item_import(?def_ident,_,_,_)) { diff --git a/src/comp/front/creader.rs b/src/comp/front/creader.rs index 4564ae2b..d1eaba85 100644 --- a/src/comp/front/creader.rs +++ b/src/comp/front/creader.rs @@ -5,24 +5,53 @@ import front.ast; import middle.fold; import util.common; import util.common.span; + +import std.fs; import std.map.hashmap; // TODO: map to a real type here. -type env = @hashmap[str, @ast.external_crate_info]; +type env = @rec( + @hashmap[str, @ast.external_crate_info] crate_cache, + vec[str] library_search_paths +); + +// TODO: return something +fn load_crate(ast.ident ident, vec[str] library_search_paths) -> @() { + for (str library_search_path in library_search_paths) { + auto path = fs.connect(library_search_path, ident); + // TODO + } + + ret @(); +} fn fold_view_item_use(&env e, &span sp, ast.ident ident, - vec[@ast.meta_item] meta_items, ast.def_id id) -> @ast.view_item { - // TODO: find the crate + vec[@ast.meta_item] meta_items, ast.def_id id, ast.ann orig_ann) + -> @ast.view_item { + auto external_crate; + if (!e.crate_cache.contains_key(ident)) { + external_crate = load_crate(ident, e.library_search_paths); + e.crate_cache.insert(ident, external_crate); + } else { + external_crate = e.crate_cache.get(ident); + } - auto viu = ast.view_item_use(ident, meta_items, id); + auto ann = ast.ann_crate(external_crate); + auto viu = ast.view_item_use(ident, meta_items, id, ann); ret @fold.respan[ast.view_item_](sp, viu); } // Reads external crates referenced by "use" directives. -fn read_crates(session.session sess, @ast.crate crate) -> @ast.crate { - auto external_crates = @common.new_str_hash[@ast.external_crate_info](); +fn read_crates(session.session sess, + @ast.crate crate, + vec[str] library_search_paths) -> @ast.crate { + auto e = @rec( + [email protected]_str_hash[@ast.external_crate_info](), + library_search_paths=library_search_paths + ); + auto f = fold_view_item_use; auto fld = @rec(fold_view_item_use=f with *fold.new_identity_fold[env]()); - ret fold.fold_crate[env](external_crates, fld, crate); + ret fold.fold_crate[env](e, fld, crate); } diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs index df57bc19..a5c79926 100644 --- a/src/comp/front/parser.rs +++ b/src/comp/front/parser.rs @@ -2151,7 +2151,8 @@ impure fn parse_use(parser p) -> @ast.view_item { auto ident = parse_ident(p); auto metadata = parse_optional_meta(p); expect(p, token.SEMI); - auto use_decl = ast.view_item_use(ident, metadata, p.next_def_id()); + auto use_decl = ast.view_item_use(ident, metadata, p.next_def_id(), + ast.ann_none); ret @spanned(lo, hi, use_decl); } diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs index 1fc91693..73b2cab3 100644 --- a/src/comp/middle/fold.rs +++ b/src/comp/middle/fold.rs @@ -263,7 +263,7 @@ type ast_fold[ENV] = // View Item folds. (fn(&ENV e, &span sp, ident ident, vec[@meta_item] meta_items, - def_id id) -> @view_item) fold_view_item_use, + def_id id, ann a) -> @view_item) fold_view_item_use, (fn(&ENV e, &span sp, ident i, vec[ident] idents, def_id id, option.t[def]) -> @view_item) fold_view_item_import, @@ -882,9 +882,9 @@ fn fold_view_item[ENV](&ENV env, ast_fold[ENV] fld, @view_item vi) } alt (vi.node) { - case (ast.view_item_use(?ident, ?meta_items, ?def_id)) { + case (ast.view_item_use(?ident, ?meta_items, ?def_id, ?ann)) { ret fld.fold_view_item_use(env_, vi.span, ident, meta_items, - def_id); + def_id, ann); } case (ast.view_item_import(?def_ident, ?idents, ?def_id, ?target_def)) { @@ -1397,8 +1397,8 @@ fn identity_fold_item_obj[ENV](&ENV e, &span sp, ident i, fn identity_fold_view_item_use[ENV](&ENV e, &span sp, ident i, vec[@meta_item] meta_items, - def_id id) -> @view_item { - ret @respan(sp, ast.view_item_use(i, meta_items, id)); + def_id id, ann a) -> @view_item { + ret @respan(sp, ast.view_item_use(i, meta_items, id, a)); } fn identity_fold_view_item_import[ENV](&ENV e, &span sp, ident i, @@ -1595,7 +1595,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] { fold_item_obj = bind identity_fold_item_obj[ENV](_,_,_,_,_,_,_), fold_view_item_use = - bind identity_fold_view_item_use[ENV](_,_,_,_,_), + bind identity_fold_view_item_use[ENV](_,_,_,_,_,_), fold_view_item_import = bind identity_fold_view_item_import[ENV](_,_,_,_,_,_), fold_view_item_export = diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs index 1079489e..62021ee9 100644 --- a/src/comp/middle/resolve.rs +++ b/src/comp/middle/resolve.rs @@ -45,7 +45,7 @@ fn unwrap_def(def_wrap d) -> def { alt (d) { case (def_wrap_use(?it)) { alt (it.node) { - case (ast.view_item_use(_, _, ?id)) { + case (ast.view_item_use(_, _, ?id, _)) { ret ast.def_use(id); } } @@ -265,7 +265,7 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] { fn found_def_view(@ast.view_item i) -> def_wrap { alt (i.node) { - case (ast.view_item_use(_, _, ?id)) { + case (ast.view_item_use(_, _, ?id, _)) { ret def_wrap_use(i); } case (ast.view_item_import(_, ?idents,?d, _)) { diff --git a/src/comp/pretty/pprust.rs b/src/comp/pretty/pprust.rs index e59c0c3d..a25bc447 100644 --- a/src/comp/pretty/pprust.rs +++ b/src/comp/pretty/pprust.rs @@ -637,7 +637,7 @@ impure fn print_type_params(ps s, vec[ast.ty_param] params) { impure fn print_view_item(ps s, @ast.view_item item) { hbox(s); alt (item.node) { - case (ast.view_item_use(?id,?mta,_)) { + case (ast.view_item_use(?id,?mta,_,_)) { wrd1(s, "use"); wrd(s, id); if (_vec.len[@ast.meta_item](mta) > 0u) { |