@@ -251,6 +251,7 @@ fn resolve_imports(&env e) {
251
251
case ( resolved ( _, _, _) ) { }
252
252
}
253
253
}
254
+ e. sess . abort_if_errors ( ) ;
254
255
}
255
256
256
257
fn resolve_names ( & @env e , & @ast:: crate c) {
@@ -437,9 +438,18 @@ fn resolve_import(&env e, &@ast::view_item it, &scopes sc) {
437
438
lookup_in_scope ( e, next_sc, it. span , end_id, ns_value) ,
438
439
lookup_in_scope ( e, next_sc, it. span , end_id, ns_type) ,
439
440
lookup_in_scope ( e, next_sc, it. span , end_id, ns_module) ) ;
441
+ remove_if_unresolved ( e. imports , defid. _1 ) ;
440
442
} 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
+ } ;
443
453
auto i = 1 u;
444
454
while ( true ) {
445
455
if ( i == n_idents - 1 u) {
@@ -450,11 +460,21 @@ fn resolve_import(&env e, &@ast::view_item it, &scopes sc) {
450
460
outside) ,
451
461
lookup_in_mod ( e, dcur, it. span , end_id, ns_module,
452
462
outside) ) ;
463
+ remove_if_unresolved ( e. imports , defid. _1 ) ;
453
464
break ;
454
465
} 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
+ } ;
458
478
i += 1 u;
459
479
}
460
480
}
@@ -464,9 +484,24 @@ fn resolve_import(&env e, &@ast::view_item it, &scopes sc) {
464
484
& option:: t[ def] md ) {
465
485
if ( option:: is_none ( val) && option:: is_none ( typ) &&
466
486
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
+ }
468
504
}
469
- e. imports . insert ( defid. _1 , resolved ( val, typ, md) ) ;
470
505
}
471
506
}
472
507
@@ -480,10 +515,17 @@ fn ns_name(namespace ns) -> str {
480
515
}
481
516
}
482
517
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) ) ;
485
524
}
486
525
526
+ fn mk_unresolved_msg ( & ident id, & str kind ) -> str {
527
+ ret #fmt( "unresolved %s: %s" , kind, id) ;
528
+ }
487
529
488
530
// Lookup helpers
489
531
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,
503
545
fn lookup_in_scope_strict ( & env e, scopes sc, & span sp, & ident id,
504
546
namespace ns) -> def {
505
547
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) ) ; }
507
549
case ( some ( ?d) ) { ret d; }
508
550
}
509
551
}
@@ -756,7 +798,7 @@ fn found_def_item(&@ast::item i, namespace ns) -> option::t[def] {
756
798
fn lookup_in_mod_strict( & env e, def m, & span sp, & ident id, namespace ns,
757
799
dir dr) -> def {
758
800
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) ) ; }
760
802
case ( some( ?d) ) { ret d; }
761
803
}
762
804
}
@@ -809,7 +851,10 @@ fn lookup_import(&env e, def_id defid, namespace ns) -> option::t[def] {
809
851
resolve_import( e, item, sc) ;
810
852
ret lookup_import( e, defid, ns) ;
811
853
}
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
+ }
813
858
case ( resolved( ?val, ?typ, ?md) ) {
814
859
ret alt ( ns) {
815
860
case ( ns_value) { val }
0 commit comments