Skip to content

Commit 71b6e60

Browse files
committed
rustc: Add an annotation for the crate definition to view_item_use
1 parent 341d128 commit 71b6e60

File tree

7 files changed

+50
-20
lines changed

7 files changed

+50
-20
lines changed

src/comp/driver/rustc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impure fn compile_input(session.session sess,
5959
auto def = tup(0, 0);
6060
auto p = parser.new_parser(sess, env, def, input);
6161
auto crate = parse_input(sess, p, input);
62-
crate = creader.read_crates(sess, crate);
62+
crate = creader.read_crates(sess, crate, library_search_paths);
6363
crate = resolve.resolve_crate(sess, crate);
6464
crate = typeck.check_crate(sess, crate);
6565
trans.trans_crate(sess, crate, output, shared);

src/comp/front/ast.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ type variant = rec(str name, vec[variant_arg] args, def_id id, ann ann);
349349

350350
type view_item = spanned[view_item_];
351351
tag view_item_ {
352-
view_item_use(ident, vec[@meta_item], def_id);
352+
view_item_use(ident, vec[@meta_item], def_id, ann);
353353
view_item_import(ident, vec[ident], def_id, option.t[def]);
354354
view_item_export(ident);
355355
}
@@ -376,7 +376,7 @@ type external_crate_info = ();
376376

377377
fn index_view_item(mod_index index, @view_item it) {
378378
alt (it.node) {
379-
case(ast.view_item_use(?id, _, _)) {
379+
case(ast.view_item_use(?id, _, _, _)) {
380380
index.insert(id, ast.mie_view_item(it));
381381
}
382382
case(ast.view_item_import(?def_ident,_,_,_)) {

src/comp/front/creader.rs

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,53 @@ import front.ast;
55
import middle.fold;
66
import util.common;
77
import util.common.span;
8+
9+
import std.fs;
810
import std.map.hashmap;
911

1012
// TODO: map to a real type here.
11-
type env = @hashmap[str, @ast.external_crate_info];
13+
type env = @rec(
14+
@hashmap[str, @ast.external_crate_info] crate_cache,
15+
vec[str] library_search_paths
16+
);
17+
18+
// TODO: return something
19+
fn load_crate(ast.ident ident, vec[str] library_search_paths) -> @() {
20+
for (str library_search_path in library_search_paths) {
21+
auto path = fs.connect(library_search_path, ident);
22+
// TODO
23+
}
24+
25+
ret @();
26+
}
1227

1328
fn fold_view_item_use(&env e, &span sp, ast.ident ident,
14-
vec[@ast.meta_item] meta_items, ast.def_id id) -> @ast.view_item {
15-
// TODO: find the crate
29+
vec[@ast.meta_item] meta_items, ast.def_id id, ast.ann orig_ann)
30+
-> @ast.view_item {
31+
auto external_crate;
32+
if (!e.crate_cache.contains_key(ident)) {
33+
external_crate = load_crate(ident, e.library_search_paths);
34+
e.crate_cache.insert(ident, external_crate);
35+
} else {
36+
external_crate = e.crate_cache.get(ident);
37+
}
1638

17-
auto viu = ast.view_item_use(ident, meta_items, id);
39+
auto ann = ast.ann_crate(external_crate);
40+
auto viu = ast.view_item_use(ident, meta_items, id, ann);
1841
ret @fold.respan[ast.view_item_](sp, viu);
1942
}
2043

2144
// Reads external crates referenced by "use" directives.
22-
fn read_crates(session.session sess, @ast.crate crate) -> @ast.crate {
23-
auto external_crates = @common.new_str_hash[@ast.external_crate_info]();
45+
fn read_crates(session.session sess,
46+
@ast.crate crate,
47+
vec[str] library_search_paths) -> @ast.crate {
48+
auto e = @rec(
49+
crate_cache=@common.new_str_hash[@ast.external_crate_info](),
50+
library_search_paths=library_search_paths
51+
);
52+
2453
auto f = fold_view_item_use;
2554
auto fld = @rec(fold_view_item_use=f with *fold.new_identity_fold[env]());
26-
ret fold.fold_crate[env](external_crates, fld, crate);
55+
ret fold.fold_crate[env](e, fld, crate);
2756
}
2857

src/comp/front/parser.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2151,7 +2151,8 @@ impure fn parse_use(parser p) -> @ast.view_item {
21512151
auto ident = parse_ident(p);
21522152
auto metadata = parse_optional_meta(p);
21532153
expect(p, token.SEMI);
2154-
auto use_decl = ast.view_item_use(ident, metadata, p.next_def_id());
2154+
auto use_decl = ast.view_item_use(ident, metadata, p.next_def_id(),
2155+
ast.ann_none);
21552156
ret @spanned(lo, hi, use_decl);
21562157
}
21572158

src/comp/middle/fold.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ type ast_fold[ENV] =
263263
// View Item folds.
264264
(fn(&ENV e, &span sp, ident ident,
265265
vec[@meta_item] meta_items,
266-
def_id id) -> @view_item) fold_view_item_use,
266+
def_id id, ann a) -> @view_item) fold_view_item_use,
267267

268268
(fn(&ENV e, &span sp, ident i, vec[ident] idents,
269269
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)
882882
}
883883

884884
alt (vi.node) {
885-
case (ast.view_item_use(?ident, ?meta_items, ?def_id)) {
885+
case (ast.view_item_use(?ident, ?meta_items, ?def_id, ?ann)) {
886886
ret fld.fold_view_item_use(env_, vi.span, ident, meta_items,
887-
def_id);
887+
def_id, ann);
888888
}
889889
case (ast.view_item_import(?def_ident, ?idents, ?def_id,
890890
?target_def)) {
@@ -1397,8 +1397,8 @@ fn identity_fold_item_obj[ENV](&ENV e, &span sp, ident i,
13971397

13981398
fn identity_fold_view_item_use[ENV](&ENV e, &span sp, ident i,
13991399
vec[@meta_item] meta_items,
1400-
def_id id) -> @view_item {
1401-
ret @respan(sp, ast.view_item_use(i, meta_items, id));
1400+
def_id id, ann a) -> @view_item {
1401+
ret @respan(sp, ast.view_item_use(i, meta_items, id, a));
14021402
}
14031403

14041404
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] {
15951595
fold_item_obj = bind identity_fold_item_obj[ENV](_,_,_,_,_,_,_),
15961596

15971597
fold_view_item_use =
1598-
bind identity_fold_view_item_use[ENV](_,_,_,_,_),
1598+
bind identity_fold_view_item_use[ENV](_,_,_,_,_,_),
15991599
fold_view_item_import =
16001600
bind identity_fold_view_item_import[ENV](_,_,_,_,_,_),
16011601
fold_view_item_export =

src/comp/middle/resolve.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ fn unwrap_def(def_wrap d) -> def {
4545
alt (d) {
4646
case (def_wrap_use(?it)) {
4747
alt (it.node) {
48-
case (ast.view_item_use(_, _, ?id)) {
48+
case (ast.view_item_use(_, _, ?id, _)) {
4949
ret ast.def_use(id);
5050
}
5151
}
@@ -265,7 +265,7 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
265265

266266
fn found_def_view(@ast.view_item i) -> def_wrap {
267267
alt (i.node) {
268-
case (ast.view_item_use(_, _, ?id)) {
268+
case (ast.view_item_use(_, _, ?id, _)) {
269269
ret def_wrap_use(i);
270270
}
271271
case (ast.view_item_import(_, ?idents,?d, _)) {

src/comp/pretty/pprust.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ impure fn print_type_params(ps s, vec[ast.ty_param] params) {
637637
impure fn print_view_item(ps s, @ast.view_item item) {
638638
hbox(s);
639639
alt (item.node) {
640-
case (ast.view_item_use(?id,?mta,_)) {
640+
case (ast.view_item_use(?id,?mta,_,_)) {
641641
wrd1(s, "use");
642642
wrd(s, id);
643643
if (_vec.len[@ast.meta_item](mta) > 0u) {

0 commit comments

Comments
 (0)