Skip to content

Commit 94399a6

Browse files
committed
---
yaml --- r: 3249 b: refs/heads/master c: 92a8ae9 h: refs/heads/master i: 3247: b78b945 v: v3
1 parent ca53019 commit 94399a6

File tree

2 files changed

+58
-13
lines changed

2 files changed

+58
-13
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: 4539a2cf7ad99851a165c98ed2f4e4a475cffd7d
2+
refs/heads/master: 92a8ae94b971206bf0502da3dc5f416fcb24cc36

trunk/src/comp/middle/resolve.rs

Lines changed: 57 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ fn resolve_imports(&env e) {
251251
case (resolved(_, _, _)) { }
252252
}
253253
}
254+
e.sess.abort_if_errors();
254255
}
255256

256257
fn resolve_names(&@env e, &@ast::crate c) {
@@ -437,9 +438,18 @@ fn resolve_import(&env e, &@ast::view_item it, &scopes sc) {
437438
lookup_in_scope(e, next_sc, it.span, end_id, ns_value),
438439
lookup_in_scope(e, next_sc, it.span, end_id, ns_type),
439440
lookup_in_scope(e, next_sc, it.span, end_id, ns_module));
441+
remove_if_unresolved(e.imports, defid._1);
440442
} else {
441-
auto dcur =
442-
lookup_in_scope_strict(e, sc, it.span, ids.(0), ns_module);
443+
auto dcur = alt(lookup_in_scope(e, sc, it.span, ids.(0), ns_module)) {
444+
case (some(?dcur)) {
445+
dcur
446+
}
447+
case (none) {
448+
unresolved_err(e, it.span, ids.(0), ns_name(ns_module));
449+
remove_if_unresolved(e.imports, defid._1);
450+
ret () // FIXME (issue #521)
451+
}
452+
};
443453
auto i = 1u;
444454
while (true) {
445455
if (i == n_idents - 1u) {
@@ -450,11 +460,21 @@ fn resolve_import(&env e, &@ast::view_item it, &scopes sc) {
450460
outside),
451461
lookup_in_mod(e, dcur, it.span, end_id, ns_module,
452462
outside));
463+
remove_if_unresolved(e.imports, defid._1);
453464
break;
454465
} else {
455-
dcur =
456-
lookup_in_mod_strict(e, dcur, it.span, ids.(i), ns_module,
457-
outside);
466+
dcur = alt (lookup_in_mod(e, dcur, it.span, ids.(i),
467+
ns_module, outside)) {
468+
case (some(?dcur)) {
469+
dcur
470+
}
471+
case (none) {
472+
unresolved_err(e, it.span, ids.(i),
473+
ns_name(ns_module));
474+
remove_if_unresolved(e.imports, defid._1);
475+
ret () // FIXME (issue #521)
476+
}
477+
};
458478
i += 1u;
459479
}
460480
}
@@ -464,9 +484,24 @@ fn resolve_import(&env e, &@ast::view_item it, &scopes sc) {
464484
&option::t[def] md) {
465485
if (option::is_none(val) && option::is_none(typ) &&
466486
option::is_none(md)) {
467-
unresolved(e, sp, id, "import");
487+
unresolved_err(e, sp, id, "import");
488+
} else {
489+
e.imports.insert(defid._1, resolved(val, typ, md));
490+
}
491+
}
492+
fn remove_if_unresolved(hashmap[ast::def_num, import_state] imports,
493+
ast::def_num def_num) {
494+
// If we couldn't resolve the import, don't leave it in a partially
495+
// resolved state, to avoid having it reported later as a cyclic
496+
// import
497+
if (imports.contains_key(def_num)) {
498+
alt (imports.get(def_num)) {
499+
case (resolving(_)) {
500+
imports.remove(def_num);
501+
}
502+
case (_) { }
503+
}
468504
}
469-
e.imports.insert(defid._1, resolved(val, typ, md));
470505
}
471506
}
472507

@@ -480,10 +515,17 @@ fn ns_name(namespace ns) -> str {
480515
}
481516
}
482517

483-
fn unresolved(&env e, &span sp, &ident id, &str kind) -> ! {
484-
e.sess.span_fatal(sp, "unresolved " + kind + ": " + id);
518+
fn unresolved_err(&env e, &span sp, &ident id, &str kind) {
519+
e.sess.span_err(sp, mk_unresolved_msg(id, kind));
520+
}
521+
522+
fn unresolved_fatal(&env e, &span sp, &ident id, &str kind) -> ! {
523+
e.sess.span_fatal(sp, mk_unresolved_msg(id, kind));
485524
}
486525

526+
fn mk_unresolved_msg(&ident id, &str kind) -> str {
527+
ret #fmt("unresolved %s: %s", kind, id);
528+
}
487529

488530
// Lookup helpers
489531
fn lookup_path_strict(&env e, &scopes sc, &span sp, vec[ident] idents,
@@ -503,7 +545,7 @@ fn lookup_path_strict(&env e, &scopes sc, &span sp, vec[ident] idents,
503545
fn lookup_in_scope_strict(&env e, scopes sc, &span sp, &ident id,
504546
namespace ns) -> def {
505547
alt (lookup_in_scope(e, sc, sp, id, ns)) {
506-
case (none) { unresolved(e, sp, id, ns_name(ns)); }
548+
case (none) { unresolved_fatal(e, sp, id, ns_name(ns)); }
507549
case (some(?d)) { ret d; }
508550
}
509551
}
@@ -756,7 +798,7 @@ fn found_def_item(&@ast::item i, namespace ns) -> option::t[def] {
756798
fn lookup_in_mod_strict(&env e, def m, &span sp, &ident id, namespace ns,
757799
dir dr) -> def {
758800
alt (lookup_in_mod(e, m, sp, id, ns, dr)) {
759-
case (none) { unresolved(e, sp, id, ns_name(ns)); }
801+
case (none) { unresolved_fatal(e, sp, id, ns_name(ns)); }
760802
case (some(?d)) { ret d; }
761803
}
762804
}
@@ -809,7 +851,10 @@ fn lookup_import(&env e, def_id defid, namespace ns) -> option::t[def] {
809851
resolve_import(e, item, sc);
810852
ret lookup_import(e, defid, ns);
811853
}
812-
case (resolving(?sp)) { e.sess.span_fatal(sp, "cyclic import"); }
854+
case (resolving(?sp)) {
855+
e.sess.span_err(sp, "cyclic import");
856+
ret none;
857+
}
813858
case (resolved(?val, ?typ, ?md)) {
814859
ret alt (ns) {
815860
case (ns_value) { val }

0 commit comments

Comments
 (0)