Skip to content

Commit ad0fafa

Browse files
committed
---
yaml --- r: 4764 b: refs/heads/master c: 206495b h: refs/heads/master v: v3
1 parent 7dc6e3e commit ad0fafa

File tree

2 files changed

+48
-44
lines changed

2 files changed

+48
-44
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: 45706a63bf0d89d5f6ac73d78cdaa66cb408f91b
2+
refs/heads/master: 206495b0a92cfb084b52b92a506d25a756fc9830

trunk/src/comp/middle/resolve.rs

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
import syntax::ast;
33
import syntax::ast::*;
4+
import syntax::codemap;
45
import ast::ident;
56
import ast::fn_ident;
67
import ast::def;
@@ -92,7 +93,7 @@ fn new_ext_hash() -> ext_hash {
9293

9394
tag mod_index_entry {
9495
mie_view_item(@ast::view_item);
95-
mie_import_ident(node_id, syntax::codemap::span);
96+
mie_import_ident(node_id, codemap::span);
9697
mie_item(@ast::item);
9798
mie_native_item(@ast::native_item);
9899
mie_tag_variant(/* tag item */@ast::item, /* variant index */uint);
@@ -246,26 +247,27 @@ fn map_crate(e: &@env, c: &@ast::crate) {
246247
}
247248
}
248249

249-
fn vi_from_to_vi(from_item: &@ast::view_item,
250-
ident: ast::import_ident) -> @ast::view_item {
251-
alt from_item.node {
252-
ast::view_item_import_from(mod_path, idents, _) {
253-
@ast::respan(ident.span,
254-
ast::view_item_import(ident.node.name,
255-
mod_path + ~[ident.node.name],
256-
ident.node.id))
257-
}
258-
}
259-
}
260-
261250
fn resolve_imports(e: &env) {
262251
for each it: @{key: ast::node_id, val: import_state} in e.imports.items()
263252
{
264253
alt it.val {
265-
todo(item, sc) { resolve_import(e, item, sc); }
254+
todo(item, sc) {
255+
alt item.node {
256+
ast::view_item_import(name, ids, id) {
257+
resolve_import(e, local_def(id),
258+
name, ids, item.span, sc);
259+
}
260+
}
261+
}
266262
todo_from(item, ident, sc) {
267-
let vi = vi_from_to_vi(item, ident);
268-
resolve_import(e, vi, sc);
263+
alt item.node {
264+
ast::view_item_import_from(mod_path, idents, _) {
265+
resolve_import(e, local_def(ident.node.id),
266+
ident.node.name,
267+
mod_path + ~[ident.node.name],
268+
ident.span, sc);
269+
}
270+
}
269271
}
270272
resolved(_, _, _) { }
271273
}
@@ -467,59 +469,50 @@ fn resolve_constr(e: @env, id: node_id, c: &@ast::constr, sc: &scopes,
467469
}
468470

469471
// Import resolution
470-
fn resolve_import(e: &env, it: &@ast::view_item, sc_in: &scopes) {
471-
let defid;
472-
let ids;
473-
let name;
474-
alt it.node {
475-
ast::view_item_import(_name, _ids, _id) {
476-
defid = local_def(_id);
477-
ids = _ids;
478-
name = _name;
479-
}
480-
}
481-
e.imports.insert(defid.node, resolving(it.span));
472+
fn resolve_import(e: &env, defid: ast::def_id, name: &ast::ident,
473+
ids: &[ast::ident], sp: &codemap::span, sc_in: &scopes) {
474+
e.imports.insert(defid.node, resolving(sp));
482475
let n_idents = vec::len(ids);
483476
let end_id = ids.(n_idents - 1u);
484477
// Ignore the current scope if this import would shadow itself.
485478
let sc =
486479
if str::eq(name, ids.(0)) { std::list::cdr(sc_in) } else { sc_in };
487480
if n_idents == 1u {
488-
register(e, defid, it.span, end_id, sc_in,
489-
lookup_in_scope(e, sc, it.span, end_id, ns_value),
490-
lookup_in_scope(e, sc, it.span, end_id, ns_type),
491-
lookup_in_scope(e, sc, it.span, end_id, ns_module));
481+
register(e, defid, sp, end_id, sc_in,
482+
lookup_in_scope(e, sc, sp, end_id, ns_value),
483+
lookup_in_scope(e, sc, sp, end_id, ns_type),
484+
lookup_in_scope(e, sc, sp, end_id, ns_module));
492485
remove_if_unresolved(e.imports, defid.node);
493486
} else {
494487
let // FIXME (issue #521)
495488
dcur =
496-
alt lookup_in_scope(e, sc, it.span, ids.(0), ns_module) {
489+
alt lookup_in_scope(e, sc, sp, ids.(0), ns_module) {
497490
some(dcur) { dcur }
498491
none. {
499-
unresolved_err(e, sc, it.span, ids.(0), ns_name(ns_module));
492+
unresolved_err(e, sc, sp, ids.(0), ns_name(ns_module));
500493
remove_if_unresolved(e.imports, defid.node);
501494
ret ()
502495
}
503496
};
504497
let i = 1u;
505498
while true {
506499
if i == n_idents - 1u {
507-
register(e, defid, it.span, end_id, sc_in,
508-
lookup_in_mod(e, dcur, it.span, end_id, ns_value,
500+
register(e, defid, sp, end_id, sc_in,
501+
lookup_in_mod(e, dcur, sp, end_id, ns_value,
509502
outside),
510-
lookup_in_mod(e, dcur, it.span, end_id, ns_type,
503+
lookup_in_mod(e, dcur, sp, end_id, ns_type,
511504
outside),
512-
lookup_in_mod(e, dcur, it.span, end_id, ns_module,
505+
lookup_in_mod(e, dcur, sp, end_id, ns_module,
513506
outside));
514507
remove_if_unresolved(e.imports, defid.node);
515508
break;
516509
} else {
517510
dcur =
518-
alt lookup_in_mod(e, dcur, it.span, ids.(i), ns_module,
511+
alt lookup_in_mod(e, dcur, sp, ids.(i), ns_module,
519512
outside) {
520513
some(dcur) { dcur }
521514
none. {
522-
unresolved_err(e, sc, it.span, ids.(i),
515+
unresolved_err(e, sc, sp, ids.(i),
523516
ns_name(ns_module));
524517
remove_if_unresolved(e.imports, defid.node);
525518
ret () // FIXME (issue #521)
@@ -955,12 +948,23 @@ fn found_view_item(e: &env, vi: @ast::view_item, ns: namespace) ->
955948
fn lookup_import(e: &env, defid: def_id, ns: namespace) -> option::t<def> {
956949
alt e.imports.get(defid.node) {
957950
todo(item, sc) {
958-
resolve_import(e, item, sc);
951+
alt item.node {
952+
ast::view_item_import(name, ids, id) {
953+
resolve_import(e, local_def(id),
954+
name, ids, item.span, sc);
955+
}
956+
}
959957
ret lookup_import(e, defid, ns);
960958
}
961959
todo_from(item, ident, sc) {
962-
let vi = vi_from_to_vi(item, ident);
963-
resolve_import(e, vi, sc);
960+
alt item.node {
961+
ast::view_item_import_from(mod_path, idents, _) {
962+
resolve_import(e, local_def(ident.node.id),
963+
ident.node.name,
964+
mod_path + ~[ident.node.name],
965+
ident.span, sc);
966+
}
967+
}
964968
ret lookup_import(e, defid, ns);
965969
}
966970
resolving(sp) { e.sess.span_err(sp, "cyclic import"); ret none; }

0 commit comments

Comments
 (0)