@@ -24,7 +24,7 @@ use syntax::ast;
24
24
use syntax:: abi;
25
25
use syntax:: attr;
26
26
use syntax:: attr:: AttrMetaMethods ;
27
- use syntax:: codemap:: { Span , DUMMY_SP } ;
27
+ use syntax:: codemap:: { Span } ;
28
28
use syntax:: diagnostic:: SpanHandler ;
29
29
use syntax:: ext:: base:: { CrateLoader , MacroCrate } ;
30
30
use syntax:: parse:: token:: { IdentInterner , InternedString } ;
@@ -147,6 +147,7 @@ fn visit_view_item(e: &mut Env, i: &ast::ViewItem) {
147
147
match extract_crate_info ( i) {
148
148
Some ( info) => {
149
149
let cnum = resolve_crate ( e,
150
+ None ,
150
151
info. ident . clone ( ) ,
151
152
info. name . clone ( ) ,
152
153
info. version . clone ( ) ,
@@ -299,6 +300,7 @@ fn existing_match(e: &Env, name: &str, version: &str, hash: &str) -> Option<ast:
299
300
}
300
301
301
302
fn resolve_crate ( e : & mut Env ,
303
+ root_ident : Option < ~str > ,
302
304
ident : ~str ,
303
305
name : ~str ,
304
306
version : ~str ,
@@ -319,7 +321,7 @@ fn resolve_crate(e: &mut Env,
319
321
} ;
320
322
let loader:: Library {
321
323
dylib, rlib, metadata
322
- } = load_ctxt. load_library_crate ( ) ;
324
+ } = load_ctxt. load_library_crate ( root_ident . clone ( ) ) ;
323
325
324
326
let attrs = decoder:: get_crate_attributes ( metadata. as_slice ( ) ) ;
325
327
let crateid = attr:: find_crateid ( attrs) . unwrap ( ) ;
@@ -338,8 +340,17 @@ fn resolve_crate(e: &mut Env,
338
340
}
339
341
e. next_crate_num += 1 ;
340
342
343
+ // Maintain a reference to the top most crate.
344
+ let root_crate = match root_ident {
345
+ Some ( c) => c,
346
+ None => load_ctxt. ident . clone ( )
347
+ } ;
348
+
341
349
// Now resolve the crates referenced by this crate
342
- let cnum_map = resolve_crate_deps ( e, metadata. as_slice ( ) ) ;
350
+ let cnum_map = resolve_crate_deps ( e,
351
+ Some ( root_crate) ,
352
+ metadata. as_slice ( ) ,
353
+ span) ;
343
354
344
355
let cmeta = @cstore:: crate_metadata {
345
356
name : load_ctxt. name ,
@@ -364,7 +375,10 @@ fn resolve_crate(e: &mut Env,
364
375
}
365
376
366
377
// Go through the crate metadata and load any crates that it references
367
- fn resolve_crate_deps ( e : & mut Env , cdata : & [ u8 ] ) -> cstore:: cnum_map {
378
+ fn resolve_crate_deps ( e : & mut Env ,
379
+ root_ident : Option < ~str > ,
380
+ cdata : & [ u8 ] , span : Span )
381
+ -> cstore:: cnum_map {
368
382
debug ! ( "resolving deps of external crate" ) ;
369
383
// The map from crate numbers in the crate we're resolving to local crate
370
384
// numbers
@@ -387,15 +401,13 @@ fn resolve_crate_deps(e: &mut Env, cdata: &[u8]) -> cstore::cnum_map {
387
401
None => {
388
402
debug ! ( "need to load it" ) ;
389
403
// This is a new one so we've got to load it
390
- // FIXME (#2404): Need better error reporting than just a bogus
391
- // span.
392
- let fake_span = DUMMY_SP ;
393
404
let local_cnum = resolve_crate ( e,
405
+ root_ident. clone ( ) ,
394
406
cname_str. get ( ) . to_str ( ) ,
395
407
cname_str. get ( ) . to_str ( ) ,
396
408
dep. vers . clone ( ) ,
397
409
dep. hash . clone ( ) ,
398
- fake_span ) ;
410
+ span ) ;
399
411
cnum_map. insert ( extrn_cnum, local_cnum) ;
400
412
}
401
413
}
@@ -427,6 +439,7 @@ impl CrateLoader for Loader {
427
439
fn load_crate ( & mut self , krate : & ast:: ViewItem ) -> MacroCrate {
428
440
let info = extract_crate_info ( krate) . unwrap ( ) ;
429
441
let cnum = resolve_crate ( & mut self . env ,
442
+ None ,
430
443
info. ident . clone ( ) ,
431
444
info. name . clone ( ) ,
432
445
info. version . clone ( ) ,
0 commit comments