Skip to content

Commit 836523c

Browse files
cixtorgraydon
authored andcommitted
---
yaml --- r: 1261 b: refs/heads/master c: 41b7d6d h: refs/heads/master i: 1259: 80de6f4 v: v3
1 parent 7138cd2 commit 836523c

File tree

5 files changed

+122
-89
lines changed

5 files changed

+122
-89
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: e92298187bceb0cc1cf423dd37e0f5fe30359a17
2+
refs/heads/master: 41b7d6d74da54b80419ab093303dd356fae957ec

trunk/src/comp/front/ast.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ type variant = rec(str name, vec[variant_arg] args, def_id id, ann ann);
229229
type view_item = spanned[view_item_];
230230
tag view_item_ {
231231
view_item_use(ident, vec[@meta_item], def_id);
232-
view_item_import(vec[ident], def_id);
232+
view_item_import(vec[ident], def_id, option.t[def]);
233233
}
234234

235235
type item = spanned[item_];
@@ -247,7 +247,7 @@ fn index_view_item(mod_index index, @view_item it) {
247247
case(ast.view_item_use(?id, _, _)) {
248248
index.insert(id, ast.mie_view_item(it));
249249
}
250-
case(ast.view_item_import(?ids,_)) {
250+
case(ast.view_item_import(?ids,_,_)) {
251251
auto len = _vec.len[ast.ident](ids);
252252
auto last_id = ids.(len - 1u);
253253
index.insert(last_id, ast.mie_view_item(it));

trunk/src/comp/front/parser.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1704,7 +1704,8 @@ impure fn parse_rest_import_name(parser p, ast.ident id) -> @ast.view_item {
17041704
identifiers += i;
17051705
}
17061706
p.bump();
1707-
auto import_decl = ast.view_item_import(identifiers, p.next_def_id());
1707+
auto import_decl = ast.view_item_import(identifiers, p.next_def_id(),
1708+
none[ast.def]);
17081709
ret @spanned(lo, hi, import_decl);
17091710
}
17101711

trunk/src/comp/middle/fold.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ type ast_fold[ENV] =
210210
def_id id) -> @view_item) fold_view_item_use,
211211

212212
(fn(&ENV e, &span sp, vec[ident] idents,
213-
def_id id) -> @view_item) fold_view_item_import,
213+
def_id id, option.t[def]) -> @view_item) fold_view_item_import,
214214

215215
// Additional nodes.
216216
(fn(&ENV e, &span sp,
@@ -705,9 +705,10 @@ fn fold_view_item[ENV](&ENV env, ast_fold[ENV] fld, @view_item vi)
705705
ret fld.fold_view_item_use(env_, vi.span, ident, meta_items,
706706
def_id);
707707
}
708-
case (ast.view_item_import(?idents, ?def_id)) {
708+
case (ast.view_item_import(?idents, ?def_id, ?target_def)) {
709709
// FIXME: what other folding should be done in here?
710-
ret fld.fold_view_item_import(env_, vi.span, idents, def_id);
710+
ret fld.fold_view_item_import(env_, vi.span, idents, def_id,
711+
target_def);
711712
}
712713
}
713714

@@ -1086,8 +1087,9 @@ fn identity_fold_view_item_use[ENV](&ENV e, &span sp, ident i,
10861087
}
10871088

10881089
fn identity_fold_view_item_import[ENV](&ENV e, &span sp, vec[ident] is,
1089-
def_id id) -> @view_item {
1090-
ret @respan(sp, ast.view_item_import(is, id));
1090+
def_id id, option.t[def] target_def)
1091+
-> @view_item {
1092+
ret @respan(sp, ast.view_item_import(is, id, target_def));
10911093
}
10921094

10931095
// Additional identities.
@@ -1236,7 +1238,7 @@ fn new_identity_fold[ENV]() -> ast_fold[ENV] {
12361238
fold_view_item_use =
12371239
bind identity_fold_view_item_use[ENV](_,_,_,_,_),
12381240
fold_view_item_import =
1239-
bind identity_fold_view_item_import[ENV](_,_,_,_),
1241+
bind identity_fold_view_item_import[ENV](_,_,_,_,_),
12401242

12411243
fold_block = bind identity_fold_block[ENV](_,_,_),
12421244
fold_fn = bind identity_fold_fn[ENV](_,_,_,_,_),

trunk/src/comp/middle/resolve.rs

Lines changed: 109 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ tag scope {
2525
type env = rec(list[scope] scopes,
2626
session.session sess);
2727

28-
type import_map = std.map.hashmap[ast.def_id,def];
28+
type import_map = std.map.hashmap[ast.def_id,def_wrap];
2929

3030
// A simple wrapper over defs that stores a bit more information about modules
3131
// and uses so that we can use the regular lookup_name when resolving imports.
@@ -34,68 +34,74 @@ tag def_wrap {
3434
def_wrap_import(@ast.view_item);
3535
def_wrap_mod(@ast.item);
3636
def_wrap_other(def);
37+
def_wrap_resolving;
3738
}
3839

39-
fn lookup_name(&env e, import_map index,
40-
ast.ident i) -> option.t[def] {
41-
auto d_ = lookup_name_wrapped(e, i);
42-
alt (d_) {
43-
case (none[tup(@env, def_wrap)]) {
44-
ret none[def];
45-
}
46-
case (some[tup(@env, def_wrap)](?d)) {
47-
alt (d._1) {
48-
case (def_wrap_use(?it)) {
49-
alt (it.node) {
50-
case (ast.view_item_use(_, _, ?id)) {
51-
ret some[def](ast.def_use(id));
52-
}
53-
}
40+
fn unwrap_def(def_wrap d) -> def {
41+
alt (d) {
42+
case (def_wrap_use(?it)) {
43+
alt (it.node) {
44+
case (ast.view_item_use(_, _, ?id)) {
45+
ret ast.def_use(id);
5446
}
55-
case (def_wrap_import(?it)) {
56-
alt (it.node) {
57-
case (ast.view_item_import(_, ?id)) {
58-
ret index.find(id);
47+
}
48+
}
49+
case (def_wrap_import(?it)) {
50+
alt (it.node) {
51+
case (ast.view_item_import(_, ?id, ?target_def)) {
52+
alt (target_def) {
53+
case (some[def](?d)) {
54+
ret d;
5955
}
60-
}
61-
}
62-
case (def_wrap_mod(?i)) {
63-
alt (i.node) {
64-
case (ast.item_mod(_, _, ?id)) {
65-
ret some[def](ast.def_mod(id));
56+
case (none[def]) {
57+
fail;
6658
}
6759
}
6860
}
69-
case (def_wrap_other(?d)) {
70-
ret some[def](d);
61+
}
62+
}
63+
case (def_wrap_mod(?m)) {
64+
alt (m.node) {
65+
case (ast.item_mod(_, _, ?id)) {
66+
ret ast.def_mod(id);
7167
}
7268
}
7369
}
70+
case (def_wrap_other(?d)) {
71+
ret d;
72+
}
73+
}
74+
}
75+
76+
fn lookup_name(&env e, ast.ident i) -> option.t[def] {
77+
auto d_ = lookup_name_wrapped(e, i);
78+
alt (d_) {
79+
case (none[tup(@env, def_wrap)]) {
80+
ret none[def];
81+
}
82+
case (some[tup(@env, def_wrap)](?d)) {
83+
ret some(unwrap_def(d._1));
84+
}
7485
}
7586
}
7687

7788
// Follow the path of an import and return what it ultimately points to.
7889

79-
fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap {
90+
fn find_final_def(&env e, import_map index,
91+
&span sp, vec[ident] idents,
92+
ast.def_id import_id) -> def_wrap {
8093

8194
// We are given a series of identifiers (a.b.c.d) and we know that
8295
// in the environment 'e' the identifier 'a' was resolved to 'd'. We
8396
// should return what a.b.c.d points to in the end.
84-
fn found_something(&env e, std.map.hashmap[ast.def_id, bool] pending,
97+
fn found_something(&env e, import_map index,
8598
&span sp, vec[ident] idents, def_wrap d) -> def_wrap {
8699
alt (d) {
87100
case (def_wrap_import(?imp)) {
88101
alt (imp.node) {
89-
case (ast.view_item_import(?new_idents, ?d)) {
90-
if (pending.contains_key(d)) {
91-
e.sess.span_err(sp,
92-
"cyclic import");
93-
fail;
94-
}
95-
pending.insert(d, true);
96-
auto x = inner(e, pending, sp, new_idents);
97-
pending.remove(d);
98-
ret found_something(e, pending, sp, idents, x);
102+
case (ast.view_item_import(?new_idents, ?d, _)) {
103+
auto x = inner(e, index, sp, new_idents, d);
104+
ret found_something(e, index, sp, idents, x);
99105
}
100106
}
101107
}
@@ -121,7 +127,7 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap {
121127
}
122128
case (some[tup(@env, def_wrap)](?next)) {
123129
auto combined_e = update_env_for_item(e, i);
124-
ret found_something(combined_e, pending, sp,
130+
ret found_something(combined_e, index, sp,
125131
rest_idents, next._1);
126132
}
127133
}
@@ -136,22 +142,40 @@ fn find_final_def(&env e, &span sp, vec[ident] idents) -> def_wrap {
136142
}
137143
fail;
138144
}
139-
fn inner(&env e, std.map.hashmap[ast.def_id, bool] pending,
140-
&span sp, vec[ident] idents) -> def_wrap {
145+
146+
fn inner(&env e, import_map index, &span sp, vec[ident] idents,
147+
ast.def_id import_id) -> def_wrap {
148+
alt (index.find(import_id)) {
149+
case (some[def_wrap](?x)) {
150+
alt (x) {
151+
case (def_wrap_resolving) {
152+
e.sess.span_err(sp, "cyclic import");
153+
fail;
154+
}
155+
case (_) {
156+
ret x;
157+
}
158+
}
159+
}
160+
case (none[def_wrap]) {
161+
}
162+
}
141163
auto first = idents.(0);
164+
index.insert(import_id, def_wrap_resolving);
142165
auto d_ = lookup_name_wrapped(e, first);
143166
alt (d_) {
144167
case (none[tup(@env, def_wrap)]) {
145168
e.sess.span_err(sp, "unresolved name: " + first);
146169
fail;
147170
}
148171
case (some[tup(@env, def_wrap)](?d)) {
149-
ret found_something(*d._0, pending, sp, idents, d._1);
172+
auto x = found_something(*d._0, index, sp, idents, d._1);
173+
index.insert(import_id, x);
174+
ret x;
150175
}
151176
}
152177
}
153-
auto pending = new_def_hash[bool]();
154-
ret inner(e, pending, sp, idents);
178+
ret inner(e, index, sp, idents, import_id);
155179
}
156180

157181
fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
@@ -203,7 +227,7 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
203227
case (ast.view_item_use(_, _, ?id)) {
204228
ret def_wrap_use(i);
205229
}
206-
case (ast.view_item_import(?idents,?d)) {
230+
case (ast.view_item_import(?idents,?d, _)) {
207231
ret def_wrap_import(i);
208232
}
209233
}
@@ -327,11 +351,11 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
327351
}
328352
}
329353

330-
fn fold_pat_tag(&env e, &span sp, import_map index, ident i,
331-
vec[@ast.pat] args, option.t[ast.variant_def] old_def,
354+
fn fold_pat_tag(&env e, &span sp, ident i, vec[@ast.pat] args,
355+
option.t[ast.variant_def] old_def,
332356
ann a) -> @ast.pat {
333357
auto new_def;
334-
alt (lookup_name(e, index, i)) {
358+
alt (lookup_name(e, i)) {
335359
case (some[def](?d)) {
336360
alt (d) {
337361
case (ast.def_variant(?did, ?vid)) {
@@ -372,8 +396,8 @@ fn fold_pat_tag(&env e, &span sp, import_map index, ident i,
372396
// and split that off as the 'primary' expr_path, with secondary expr_field
373397
// expressions tacked on the end.
374398

375-
fn fold_expr_path(&env e, &span sp, import_map index,
376-
&ast.path p, &option.t[def] d, ann a) -> @ast.expr {
399+
fn fold_expr_path(&env e, &span sp, &ast.path p, &option.t[def] d,
400+
ann a) -> @ast.expr {
377401

378402
if (_vec.len[@ast.ty](p.node.types) > 0u) {
379403
e.sess.unimpl("resolving name expr with ty params");
@@ -384,7 +408,7 @@ fn fold_expr_path(&env e, &span sp, import_map index,
384408
check (n_idents != 0u);
385409
auto id0 = p.node.idents.(0);
386410

387-
auto d_ = lookup_name(e, index, id0);
411+
auto d_ = lookup_name(e, id0);
388412

389413
alt (d_) {
390414
case (some[def](_)) {
@@ -413,30 +437,19 @@ fn fold_expr_path(&env e, &span sp, import_map index,
413437

414438
fn fold_view_item_import(&env e, &span sp,
415439
import_map index,
416-
vec[ident] is, ast.def_id id) -> @ast.view_item {
440+
vec[ident] is, ast.def_id id,
441+
option.t[def] target_id) -> @ast.view_item {
417442
// Produce errors for invalid imports
418443
auto len = _vec.len[ast.ident](is);
419444
auto last_id = is.(len - 1u);
420-
auto d = find_final_def(e, sp, is);
421-
alt (d) {
422-
case (def_wrap_mod(?m)) {
423-
alt (m.node) {
424-
case (ast.item_mod(_, _, ?id)) {
425-
index.insert(id, ast.def_mod(id));
426-
}
427-
}
428-
}
429-
case (def_wrap_other(?target_def)) {
430-
index.insert(id, target_def);
431-
}
432-
}
433-
434-
ret @fold.respan[ast.view_item_](sp, ast.view_item_import(is, id));
445+
auto d = find_final_def(e, index, sp, is, id);
446+
let option.t[def] target_def = some(unwrap_def(d));
447+
ret @fold.respan[ast.view_item_](sp, ast.view_item_import(is, id,
448+
target_def));
435449
}
436450

437451

438-
fn fold_ty_path(&env e, &span sp, import_map index, ast.path p,
439-
&option.t[def] d) -> @ast.ty {
452+
fn fold_ty_path(&env e, &span sp, ast.path p, &option.t[def] d) -> @ast.ty {
440453

441454
let uint len = _vec.len[ast.ident](p.node.idents);
442455
check (len != 0u);
@@ -448,7 +461,7 @@ fn fold_ty_path(&env e, &span sp, import_map index, ast.path p,
448461
e.sess.unimpl("resolving path ty with ty params");
449462
}
450463

451-
auto d_ = lookup_name(e, index, p.node.idents.(0));
464+
auto d_ = lookup_name(e, p.node.idents.(0));
452465

453466
alt (d_) {
454467
case (some[def](?d)) {
@@ -478,16 +491,33 @@ fn update_env_for_arm(&env e, &ast.arm p) -> env {
478491
ret rec(scopes = cons[scope](scope_arm(p), @e.scopes) with e);
479492
}
480493

494+
fn resolve_imports(session.session sess, @ast.crate crate) -> @ast.crate {
495+
let fold.ast_fold[env] fld = fold.new_identity_fold[env]();
496+
497+
auto import_index = new_def_hash[def_wrap]();
498+
fld = @rec( fold_view_item_import
499+
= bind fold_view_item_import(_,_,import_index,_,_,_),
500+
update_env_for_crate = bind update_env_for_crate(_,_),
501+
update_env_for_item = bind update_env_for_item(_,_),
502+
update_env_for_block = bind update_env_for_block(_,_),
503+
update_env_for_arm = bind update_env_for_arm(_,_)
504+
with *fld );
505+
506+
auto e = rec(scopes = nil[scope],
507+
sess = sess);
508+
509+
ret fold.fold_crate[env](e, fld, crate);
510+
}
511+
481512
fn resolve_crate(session.session sess, @ast.crate crate) -> @ast.crate {
482513

483514
let fold.ast_fold[env] fld = fold.new_identity_fold[env]();
484515

485-
auto import_index = new_def_hash[def]();
486-
fld = @rec( fold_pat_tag = bind fold_pat_tag(_,_,import_index,_,_,_,_),
487-
fold_expr_path = bind fold_expr_path(_,_,import_index,_,_,_),
488-
fold_view_item_import
489-
= bind fold_view_item_import(_,_,import_index,_,_),
490-
fold_ty_path = bind fold_ty_path(_,_,import_index,_,_),
516+
auto new_crate = resolve_imports(sess, crate);
517+
518+
fld = @rec( fold_pat_tag = bind fold_pat_tag(_,_,_,_,_,_),
519+
fold_expr_path = bind fold_expr_path(_,_,_,_,_),
520+
fold_ty_path = bind fold_ty_path(_,_,_,_),
491521
update_env_for_crate = bind update_env_for_crate(_,_),
492522
update_env_for_item = bind update_env_for_item(_,_),
493523
update_env_for_block = bind update_env_for_block(_,_),
@@ -497,7 +527,7 @@ fn resolve_crate(session.session sess, @ast.crate crate) -> @ast.crate {
497527
auto e = rec(scopes = nil[scope],
498528
sess = sess);
499529

500-
ret fold.fold_crate[env](e, fld, crate);
530+
ret fold.fold_crate[env](e, fld, new_crate);
501531
}
502532

503533
// Local Variables:

0 commit comments

Comments
 (0)