@@ -114,22 +114,25 @@ fn visit_crate(e: &Env, c: &ast::Crate) {
114
114
}
115
115
}
116
116
117
- fn visit_view_item ( e : & mut Env , i : & ast:: ViewItem ) {
118
- let should_load = i. attrs . iter ( ) . all ( |attr| {
117
+ fn should_link ( i : & ast:: ViewItem ) -> bool {
118
+ i. attrs . iter ( ) . all ( |attr| {
119
119
attr. name ( ) . get ( ) != "phase" ||
120
120
attr. meta_item_list ( ) . map_or ( false , |phases| {
121
121
attr:: contains_name ( phases. as_slice ( ) , "link" )
122
122
} )
123
- } ) ;
123
+ } )
124
+ }
124
125
125
- if !should_load {
126
+ fn visit_view_item ( e : & mut Env , i : & ast:: ViewItem ) {
127
+ if !should_link ( i) {
126
128
return ;
127
129
}
128
130
129
131
match extract_crate_info ( e, i) {
130
132
Some ( info) => {
131
- let cnum = resolve_crate ( e, & None , info. ident , & info. crate_id , None ,
132
- i. span ) ;
133
+ let ( cnum, _, _) = resolve_crate ( e, & None , info. ident ,
134
+ & info. crate_id , None , true ,
135
+ i. span ) ;
133
136
e. sess . cstore . add_extern_mod_stmt_cnum ( info. id , cnum) ;
134
137
}
135
138
None => ( )
@@ -140,6 +143,7 @@ struct CrateInfo {
140
143
ident : ~str ,
141
144
crate_id : CrateId ,
142
145
id : ast:: NodeId ,
146
+ should_link : bool ,
143
147
}
144
148
145
149
fn extract_crate_info ( e : & Env , i : & ast:: ViewItem ) -> Option < CrateInfo > {
@@ -165,6 +169,7 @@ fn extract_crate_info(e: &Env, i: &ast::ViewItem) -> Option<CrateInfo> {
165
169
ident : ident. get ( ) . to_str ( ) ,
166
170
crate_id : crate_id,
167
171
id : id,
172
+ should_link : should_link ( i) ,
168
173
} )
169
174
}
170
175
_ => None
@@ -274,8 +279,10 @@ fn resolve_crate<'a>(e: &mut Env,
274
279
ident : & str ,
275
280
crate_id : & CrateId ,
276
281
hash : Option < & Svh > ,
282
+ should_link : bool ,
277
283
span : Span )
278
- -> ast:: CrateNum {
284
+ -> ( ast:: CrateNum , @cstore:: crate_metadata ,
285
+ cstore:: CrateSource ) {
279
286
match existing_match ( e, crate_id, hash) {
280
287
None => {
281
288
let id_hash = link:: crate_id_hash ( crate_id) ;
@@ -312,8 +319,11 @@ fn resolve_crate<'a>(e: &mut Env,
312
319
let root = if root. is_some ( ) { root } else { & crate_paths } ;
313
320
314
321
// Now resolve the crates referenced by this crate
315
- let cnum_map = resolve_crate_deps ( e, root, metadata. as_slice ( ) ,
316
- span) ;
322
+ let cnum_map = if should_link {
323
+ resolve_crate_deps ( e, root, metadata. as_slice ( ) , span)
324
+ } else {
325
+ @RefCell :: new ( HashMap :: new ( ) )
326
+ } ;
317
327
318
328
let cmeta = @cstore:: crate_metadata {
319
329
name : load_ctxt. crate_id . name . to_owned ( ) ,
@@ -323,15 +333,21 @@ fn resolve_crate<'a>(e: &mut Env,
323
333
span : span,
324
334
} ;
325
335
326
- e. sess . cstore . set_crate_data ( cnum, cmeta) ;
327
- e. sess . cstore . add_used_crate_source ( cstore:: CrateSource {
336
+ let source = cstore:: CrateSource {
328
337
dylib : dylib,
329
338
rlib : rlib,
330
339
cnum : cnum,
331
- } ) ;
332
- cnum
340
+ } ;
341
+
342
+ if should_link {
343
+ e. sess . cstore . set_crate_data ( cnum, cmeta) ;
344
+ e. sess . cstore . add_used_crate_source ( source. clone ( ) ) ;
345
+ }
346
+ ( cnum, cmeta, source)
333
347
}
334
- Some ( cnum) => cnum
348
+ Some ( cnum) => ( cnum,
349
+ e. sess . cstore . get_crate_data ( cnum) ,
350
+ e. sess . cstore . get_used_crate_source ( cnum) . unwrap ( ) )
335
351
}
336
352
}
337
353
@@ -348,11 +364,12 @@ fn resolve_crate_deps(e: &mut Env,
348
364
for dep in r. iter ( ) {
349
365
let extrn_cnum = dep. cnum ;
350
366
debug ! ( "resolving dep crate {} hash: `{}`" , dep. crate_id, dep. hash) ;
351
- let local_cnum = resolve_crate ( e, root,
352
- dep. crate_id . name . as_slice ( ) ,
353
- & dep. crate_id ,
354
- Some ( & dep. hash ) ,
355
- span) ;
367
+ let ( local_cnum, _, _) = resolve_crate ( e, root,
368
+ dep. crate_id . name . as_slice ( ) ,
369
+ & dep. crate_id ,
370
+ Some ( & dep. hash ) ,
371
+ true ,
372
+ span) ;
356
373
cnum_map. insert ( extrn_cnum, local_cnum) ;
357
374
}
358
375
return @RefCell :: new ( cnum_map) ;
@@ -380,23 +397,17 @@ impl<'a> Loader<'a> {
380
397
impl < ' a > CrateLoader for Loader < ' a > {
381
398
fn load_crate ( & mut self , krate : & ast:: ViewItem ) -> MacroCrate {
382
399
let info = extract_crate_info ( & self . env , krate) . unwrap ( ) ;
383
- let cnum = resolve_crate ( & mut self . env , & None , info. ident ,
384
- & info. crate_id , None , krate. span ) ;
385
- let library = self . env . sess . cstore . get_used_crate_source ( cnum) . unwrap ( ) ;
400
+ let ( cnum, data, library) = resolve_crate ( & mut self . env , & None ,
401
+ info. ident , & info. crate_id ,
402
+ None , true , krate. span ) ;
403
+ let macros = decoder:: get_exported_macros ( data) ;
404
+ let cstore = & self . env . sess . cstore ;
405
+ let registrar = csearch:: get_macro_registrar_fn ( cstore, cnum)
406
+ . map ( |did| csearch:: get_symbol ( cstore, did) ) ;
386
407
MacroCrate {
387
408
lib : library. dylib ,
388
- cnum : cnum,
409
+ macros : macros. move_iter ( ) . collect ( ) ,
410
+ registrar_symbol : registrar,
389
411
}
390
412
}
391
-
392
- fn get_exported_macros ( & mut self , cnum : ast:: CrateNum ) -> Vec < ~str > {
393
- csearch:: get_exported_macros ( & self . env . sess . cstore , cnum) . move_iter ( )
394
- . collect ( )
395
- }
396
-
397
- fn get_registrar_symbol ( & mut self , cnum : ast:: CrateNum ) -> Option < ~str > {
398
- let cstore = & self . env . sess . cstore ;
399
- csearch:: get_macro_registrar_fn ( cstore, cnum)
400
- . map ( |did| csearch:: get_symbol ( cstore, did) )
401
- }
402
413
}
0 commit comments