|
1 | 1 |
|
2 | 2 | import syntax::ast;
|
3 | 3 | import syntax::ast::*;
|
| 4 | +import syntax::codemap; |
4 | 5 | import ast::ident;
|
5 | 6 | import ast::fn_ident;
|
6 | 7 | import ast::def;
|
@@ -92,7 +93,7 @@ fn new_ext_hash() -> ext_hash {
|
92 | 93 |
|
93 | 94 | tag mod_index_entry {
|
94 | 95 | mie_view_item(@ast::view_item);
|
95 |
| - mie_import_ident(node_id, syntax::codemap::span); |
| 96 | + mie_import_ident(node_id, codemap::span); |
96 | 97 | mie_item(@ast::item);
|
97 | 98 | mie_native_item(@ast::native_item);
|
98 | 99 | mie_tag_variant(/* tag item */@ast::item, /* variant index */uint);
|
@@ -246,26 +247,27 @@ fn map_crate(e: &@env, c: &@ast::crate) {
|
246 | 247 | }
|
247 | 248 | }
|
248 | 249 |
|
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 |
| - |
261 | 250 | fn resolve_imports(e: &env) {
|
262 | 251 | for each it: @{key: ast::node_id, val: import_state} in e.imports.items()
|
263 | 252 | {
|
264 | 253 | 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 | + } |
266 | 262 | 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 | + } |
269 | 271 | }
|
270 | 272 | resolved(_, _, _) { }
|
271 | 273 | }
|
@@ -467,59 +469,50 @@ fn resolve_constr(e: @env, id: node_id, c: &@ast::constr, sc: &scopes,
|
467 | 469 | }
|
468 | 470 |
|
469 | 471 | // 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)); |
482 | 475 | let n_idents = vec::len(ids);
|
483 | 476 | let end_id = ids.(n_idents - 1u);
|
484 | 477 | // Ignore the current scope if this import would shadow itself.
|
485 | 478 | let sc =
|
486 | 479 | if str::eq(name, ids.(0)) { std::list::cdr(sc_in) } else { sc_in };
|
487 | 480 | 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)); |
492 | 485 | remove_if_unresolved(e.imports, defid.node);
|
493 | 486 | } else {
|
494 | 487 | let // FIXME (issue #521)
|
495 | 488 | 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) { |
497 | 490 | some(dcur) { dcur }
|
498 | 491 | 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)); |
500 | 493 | remove_if_unresolved(e.imports, defid.node);
|
501 | 494 | ret ()
|
502 | 495 | }
|
503 | 496 | };
|
504 | 497 | let i = 1u;
|
505 | 498 | while true {
|
506 | 499 | 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, |
509 | 502 | outside),
|
510 |
| - lookup_in_mod(e, dcur, it.span, end_id, ns_type, |
| 503 | + lookup_in_mod(e, dcur, sp, end_id, ns_type, |
511 | 504 | outside),
|
512 |
| - lookup_in_mod(e, dcur, it.span, end_id, ns_module, |
| 505 | + lookup_in_mod(e, dcur, sp, end_id, ns_module, |
513 | 506 | outside));
|
514 | 507 | remove_if_unresolved(e.imports, defid.node);
|
515 | 508 | break;
|
516 | 509 | } else {
|
517 | 510 | 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, |
519 | 512 | outside) {
|
520 | 513 | some(dcur) { dcur }
|
521 | 514 | none. {
|
522 |
| - unresolved_err(e, sc, it.span, ids.(i), |
| 515 | + unresolved_err(e, sc, sp, ids.(i), |
523 | 516 | ns_name(ns_module));
|
524 | 517 | remove_if_unresolved(e.imports, defid.node);
|
525 | 518 | ret () // FIXME (issue #521)
|
@@ -955,12 +948,23 @@ fn found_view_item(e: &env, vi: @ast::view_item, ns: namespace) ->
|
955 | 948 | fn lookup_import(e: &env, defid: def_id, ns: namespace) -> option::t<def> {
|
956 | 949 | alt e.imports.get(defid.node) {
|
957 | 950 | 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 | + } |
959 | 957 | ret lookup_import(e, defid, ns);
|
960 | 958 | }
|
961 | 959 | 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 | + } |
964 | 968 | ret lookup_import(e, defid, ns);
|
965 | 969 | }
|
966 | 970 | resolving(sp) { e.sess.span_err(sp, "cyclic import"); ret none; }
|
|
0 commit comments