@@ -34,11 +34,6 @@ type env = @rec(
34
34
mutable int next_crate_num
35
35
) ;
36
36
37
- tag resolve_result {
38
- rr_ok( ast:: def_id) ;
39
- rr_not_found ( ast:: ident) ;
40
- }
41
-
42
37
// Type decoding
43
38
44
39
// Compact string representation for ty::t values. API ty_str & parse_from_str
@@ -282,64 +277,58 @@ fn parse_def_id(vec[u8] buf) -> ast::def_id {
282
277
}
283
278
284
279
fn lookup_hash ( & ebml:: doc d, fn ( vec[ u8 ] ) -> bool eq_fn , uint hash)
285
- -> option :: t [ ebml:: doc ] {
280
+ -> vec [ ebml:: doc ] {
286
281
auto index = ebml:: get_doc ( d, metadata:: tag_index) ;
287
282
auto table = ebml:: get_doc ( index, metadata:: tag_index_table) ;
288
283
289
284
auto hash_pos = table. start + ( hash % 256 u) * 4 u;
290
285
auto pos = ebml:: be_uint_from_bytes ( d. data , hash_pos, 4 u) ;
291
286
auto bucket = ebml:: doc_at ( d. data , pos) ;
292
287
// Awkward logic because we can't ret from foreach yet
293
- auto result = option :: none [ ebml:: doc] ;
288
+ let vec [ ebml:: doc] result = vec ( ) ;
294
289
auto belt = metadata:: tag_index_buckets_bucket_elt;
295
290
for each ( ebml:: doc elt in ebml:: tagged_docs( bucket, belt) ) {
296
- alt ( result) {
297
- case ( option:: none[ ebml:: doc] ) {
298
- auto pos = ebml:: be_uint_from_bytes( elt. data, elt. start, 4 u) ;
299
- if ( eq_fn( _vec:: slice[ u8] ( elt. data, elt. start+4 u, elt. end) ) ) {
300
- result = option:: some[ ebml:: doc]
301
- ( ebml:: doc_at( d. data, pos) ) ;
302
- }
303
- }
304
- case ( _) { }
291
+ auto pos = ebml:: be_uint_from_bytes( elt. data, elt. start, 4 u) ;
292
+ if ( eq_fn( _vec:: slice[ u8] ( elt. data, elt. start+4 u, elt. end) ) ) {
293
+ _vec:: push( result, ebml:: doc_at( d. data, pos) ) ;
305
294
}
306
295
}
307
296
ret result;
308
297
}
309
298
310
299
// Given a path and serialized crate metadata, returns the ID of the
311
300
// definition the path refers to.
312
- fn resolve_path( vec[ ast:: ident] path, vec[ u8] data) -> resolve_result {
301
+ fn resolve_path ( vec[ ast:: ident ] path , vec[ u8] data ) -> vec [ ast :: def_id ] {
313
302
fn eq_item ( vec[ u8] data , str s) -> bool {
314
303
ret _str:: eq ( _str:: unsafe_from_bytes ( data) , s) ;
315
304
}
316
305
auto s = _str:: connect ( path, "::" ) ;
317
306
auto md = ebml:: new_doc ( data) ;
318
307
auto paths = ebml:: get_doc ( md, metadata:: tag_paths) ;
319
308
auto eqer = bind eq_item ( _, s) ;
320
- alt ( lookup_hash( paths, eqer, metadata:: hash_path( s) ) ) {
321
- case ( option:: some[ ebml:: doc] ( ?d) ) {
322
- auto did_doc = ebml:: get_doc( d, metadata:: tag_def_id) ;
323
- ret rr_ok( parse_def_id( ebml:: doc_data( did_doc) ) ) ;
324
- }
325
- case ( option:: none[ ebml:: doc] ) {
326
- ret rr_not_found( s) ;
327
- }
309
+ let vec[ ast:: def_id] result = vec ( ) ;
310
+ for ( ebml:: doc doc in lookup_hash( paths, eqer, metadata:: hash_path( s) ) ) {
311
+ auto did_doc = ebml:: get_doc( doc, metadata:: tag_def_id) ;
312
+ _vec:: push( result, parse_def_id( ebml:: doc_data( did_doc) ) ) ;
328
313
}
314
+ ret result;
329
315
}
330
316
331
317
fn maybe_find_item( int item_id, & ebml:: doc items) -> option:: t[ ebml:: doc] {
332
318
fn eq_item( vec[ u8] bytes, int item_id) -> bool {
333
319
ret ebml:: be_uint_from_bytes( bytes, 0 u, 4 u) as int == item_id;
334
320
}
335
321
auto eqer = bind eq_item( _, item_id) ;
336
- ret lookup_hash( items, eqer, metadata:: hash_def_num( item_id) ) ;
322
+ auto found = lookup_hash( items, eqer, metadata:: hash_def_num( item_id) ) ;
323
+ if ( _vec:: len( found) == 0 u) {
324
+ ret option:: none[ ebml:: doc] ;
325
+ } else {
326
+ ret option:: some[ ebml:: doc] ( found. ( 0 ) ) ;
327
+ }
337
328
}
338
329
339
330
fn find_item( int item_id, & ebml:: doc items) -> ebml:: doc {
340
- alt ( maybe_find_item( item_id, items) ) {
341
- case ( option:: some[ ebml:: doc] ( ?d) ) { ret d; }
342
- }
331
+ ret option:: get( maybe_find_item( item_id, items) ) ;
343
332
}
344
333
345
334
// Looks up an item in the given metadata and returns an ebml doc pointing
@@ -478,67 +467,49 @@ fn read_crates(session::session sess,
478
467
479
468
480
469
fn kind_has_type_params( u8 kind_ch) -> bool {
481
- // FIXME: It'd be great if we had u8 char literals.
482
- if ( kind_ch == ( 'c' as u8 ) ) { ret false ; }
483
- else if ( kind_ch == ( 'f' as u8 ) ) { ret true ; }
484
- else if ( kind_ch == ( 'F' as u8 ) ) { ret true; }
485
- else if ( kind_ch == ( 'y' as u8 ) ) { ret true; }
486
- else if ( kind_ch == ( 'o' as u8 ) ) { ret true; }
487
- else if ( kind_ch == ( 't' as u8 ) ) { ret true; }
488
- else if ( kind_ch == ( 'T' as u8 ) ) { ret false; }
489
- else if ( kind_ch == ( 'm' as u8 ) ) { ret false; }
490
- else if ( kind_ch == ( 'n' as u8 ) ) { ret false; }
491
- else if ( kind_ch == ( 'v' as u8 ) ) { ret true; }
492
- else {
493
- log_err #fmt( "kind_has_type_params(): unknown kind char: %d" ,
494
- kind_ch as int) ;
495
- fail;
496
- }
470
+ ret alt ( kind_ch as char ) {
471
+ case ( 'c' ) { false } case ( 'f' ) { true } case ( 'F' ) { true }
472
+ case ( 'y' ) { true } case ( 'o' ) { true } case ( 't' ) { true }
473
+ case ( 'T' ) { false } case ( 'm' ) { false } case ( 'n' ) { false }
474
+ case ( 'v' ) { true }
475
+ } ;
497
476
}
498
477
499
-
500
478
// Crate metadata queries
501
479
502
- fn lookup_def ( session:: session sess, int cnum, vec[ ast:: ident] path)
503
- -> option :: t [ ast:: def] {
480
+ fn lookup_defs ( session:: session sess, int cnum, vec[ ast:: ident] path)
481
+ -> vec [ ast:: def] {
504
482
auto data = sess. get_external_crate( cnum) . data;
505
483
506
- auto did;
507
- alt ( resolve_path( path, data) ) {
508
- case ( rr_ok( ?di) ) { did = di; }
509
- case ( rr_not_found( ?name) ) {
510
- ret none[ ast:: def] ;
511
- }
512
- }
484
+ ret _vec:: map( bind lookup_def( cnum, data, _) ,
485
+ resolve_path( path, data) ) ;
486
+ }
513
487
488
+ // FIXME doesn't yet handle re-exported externals
489
+ fn lookup_def( int cnum, vec[ u8] data, & ast:: def_id did) -> ast:: def {
514
490
auto item = lookup_item( did. _1, data) ;
515
491
auto kind_ch = item_kind( item) ;
516
492
517
493
did = tup( cnum, did. _1) ;
518
494
519
- // FIXME: It'd be great if we had u8 char literals.
520
- auto def;
521
- if ( kind_ch == ( 'c' as u8 ) ) { def = ast:: def_const( did) ; }
522
- else if ( kind_ch == ( 'f' as u8 ) ) { def = ast:: def_fn( did) ; }
523
- else if ( kind_ch == ( 'F' as u8 ) ) { def = ast:: def_native_fn( did) ; }
524
- else if ( kind_ch == ( 'y' as u8 ) ) { def = ast:: def_ty( did) ; }
525
- else if ( kind_ch == ( 'o' as u8 ) ) { def = ast:: def_obj( did) ; }
526
- else if ( kind_ch == ( 'T' as u8 ) ) { def = ast:: def_native_ty( did) ; }
527
- else if ( kind_ch == ( 't' as u8 ) ) {
495
+ auto def = alt ( kind_ch as char ) {
496
+ case ( 'c' ) { ast:: def_const( did) }
497
+ case ( 'f' ) { ast:: def_fn( did) }
498
+ case ( 'F' ) { ast:: def_native_fn( did) }
499
+ case ( 'y' ) { ast:: def_ty( did) }
500
+ case ( 'o' ) { ast:: def_obj( did) }
501
+ case ( 'T' ) { ast:: def_native_ty( did) }
528
502
// We treat references to tags as references to types.
529
- def = ast:: def_ty( did) ;
530
- } else if ( kind_ch == ( 'm' as u8 ) ) { def = ast:: def_mod( did) ; }
531
- else if ( kind_ch == ( 'n' as u8 ) ) { def = ast:: def_native_mod( did) ; }
532
- else if ( kind_ch == ( 'v' as u8 ) ) {
533
- auto tid = variant_tag_id( item) ;
534
- tid = tup( cnum, tid. _1) ;
535
- def = ast:: def_variant( tid, did) ;
536
- } else {
537
- log_err #fmt( "lookup_def(): unknown kind char: %d" , kind_ch as int) ;
538
- fail;
539
- }
540
-
541
- ret some[ ast:: def] ( def) ;
503
+ case ( 't' ) { ast:: def_ty( did) }
504
+ case ( 'm' ) { ast:: def_mod( did) }
505
+ case ( 'n' ) { ast:: def_native_mod( did) }
506
+ case ( 'v' ) {
507
+ auto tid = variant_tag_id( item) ;
508
+ tid = tup( cnum, tid. _1) ;
509
+ ast:: def_variant( tid, did)
510
+ }
511
+ } ;
512
+ ret def;
542
513
}
543
514
544
515
fn get_type( session:: session sess, ty:: ctxt tcx, ast:: def_id def)
@@ -563,8 +534,7 @@ fn get_type(session::session sess, ty::ctxt tcx, ast::def_id def)
563
534
fn get_symbol( session:: session sess, ast:: def_id def) -> str {
564
535
auto external_crate_id = def. _0;
565
536
auto data = sess. get_external_crate( external_crate_id) . data;
566
- auto item = lookup_item( def. _1, data) ;
567
- ret item_symbol( item) ;
537
+ ret item_symbol( lookup_item( def. _1, data) ) ;
568
538
}
569
539
570
540
fn get_tag_variants( session:: session sess, ty:: ctxt tcx, ast:: def_id def)
@@ -636,9 +606,8 @@ fn list_crate_metadata(vec[u8] bytes, io::writer out) {
636
606
}
637
607
638
608
fn describe_def ( & ebml:: doc items , ast:: def_id id) -> str {
639
- if ( id. _0 != 0 ) { ret "external" ; }
640
- auto item = find_item( id. _1, items) ;
641
- ret item_kind_to_str( item_kind( item) ) ;
609
+ if ( id. _0 != 0 ) { ret "external" ; }
610
+ ret item_kind_to_str ( item_kind ( find_item ( id. _1 , items) ) ) ;
642
611
}
643
612
644
613
fn item_kind_to_str ( u8 kind ) -> str {
0 commit comments