2
2
import syntax:: { ast, ast_util, codemap} ;
3
3
import syntax:: ast:: * ;
4
4
import ast:: { ident, fn_ident, def, def_id, node_id} ;
5
- import syntax:: ast_util:: { local_def, def_id_of_def} ;
5
+ import syntax:: ast_util:: { local_def, def_id_of_def, class_item_ident } ;
6
6
import pat_util:: * ;
7
7
8
8
import front:: attr;
@@ -91,6 +91,8 @@ enum mod_index_entry {
91
91
mie_view_item( ident , node_id , span ) ,
92
92
mie_import_ident( node_id , span ) ,
93
93
mie_item( @ast:: item ) ,
94
+ mie_class_item( node_id , /* parent class name */
95
+ @ast:: class_item ) , /* class member */
94
96
mie_native_item( @ast:: native_item ) ,
95
97
mie_enum_variant( /* variant index */ uint ,
96
98
/*parts of enum item*/ [ variant ] ,
@@ -267,27 +269,30 @@ fn map_crate(e: @env, c: @ast::crate) {
267
269
alt vi. node {
268
270
//if it really is a glob import, that is
269
271
ast:: view_item_import_glob ( path, _) {
270
- let imp = follow_import ( * e, sc, * path, vi. span ) ;
271
- if option:: is_some ( imp) {
272
- let glob = { def: option:: get ( imp) , item: vi} ;
273
- check list:: is_not_empty ( sc) ;
274
- alt list:: head ( sc) {
275
- scope_item ( i) {
276
- e. mod_map . get ( i. id ) . glob_imports += [ glob] ;
277
- }
278
- scope_block ( b, _, _) {
279
- let globs = alt e. block_map . find ( b. node . id ) {
280
- some ( globs) { globs + [ glob] } none { [ glob] }
281
- } ;
282
- e. block_map . insert ( b. node . id , globs) ;
283
- }
284
- scope_crate {
285
- e. mod_map . get ( ast:: crate_node_id) . glob_imports += [ glob] ;
286
- }
287
- _ { e. sess . span_bug ( vi. span , "Unexpected scope in a glob \
288
- import") ; }
272
+ alt follow_import ( * e, sc, * path, vi. span ) {
273
+ some ( imp) {
274
+ let glob = { def: imp, item: vi} ;
275
+ check list:: is_not_empty ( sc) ;
276
+ alt list:: head ( sc) {
277
+ scope_item ( i) {
278
+ e. mod_map . get ( i. id ) . glob_imports += [ glob] ;
279
+ }
280
+ scope_block ( b, _, _) {
281
+ let globs = alt e. block_map . find ( b. node . id ) {
282
+ some ( globs) { globs + [ glob] } none { [ glob] }
283
+ } ;
284
+ e. block_map . insert ( b. node . id , globs) ;
285
+ }
286
+ scope_crate {
287
+ e. mod_map . get ( ast:: crate_node_id) . glob_imports
288
+ += [ glob] ;
289
+ }
290
+ _ { e. sess . span_bug ( vi. span , "Unexpected scope in a \
291
+ glob import") ; }
292
+ }
289
293
}
290
- }
294
+ _ { }
295
+ }
291
296
}
292
297
_ { }
293
298
}
@@ -329,7 +334,10 @@ fn resolve_capture_item(e: @env, sc: scopes, &&cap_item: @ast::capture_item) {
329
334
}
330
335
331
336
fn maybe_insert ( e : @env , id : node_id , def : option < def > ) {
332
- if option:: is_some ( def) { e. def_map . insert ( id, option:: get ( def) ) ; }
337
+ alt def {
338
+ some( df) { e. def_map . insert ( id, df) ; }
339
+ _ { }
340
+ }
333
341
}
334
342
335
343
fn resolve_names ( e : @env , c : @ast:: crate ) {
@@ -401,11 +409,10 @@ fn resolve_names(e: @env, c: @ast::crate) {
401
409
visit:: visit_pat ( pat, sc, v) ;
402
410
alt pat. node {
403
411
ast:: pat_enum ( p, _) {
404
- let fnd = lookup_path_strict ( * e, sc, p. span , p. node ,
405
- ns_val ( ns_any_value) ) ;
406
- alt option:: get ( fnd) {
407
- ast:: def_variant ( did, vid) {
408
- e. def_map . insert ( pat. id , option:: get ( fnd) ) ;
412
+ alt lookup_path_strict ( * e, sc, p. span , p. node ,
413
+ ns_val ( ns_any_value) ) {
414
+ some ( fnd@ast:: def_variant ( _, _) ) {
415
+ e. def_map . insert ( pat. id , fnd) ;
409
416
}
410
417
_ {
411
418
e. sess . span_err ( p. span ,
@@ -417,11 +424,10 @@ fn resolve_names(e: @env, c: @ast::crate) {
417
424
/* Here we determine whether a given pat_ident binds a new
418
425
variable a refers to a nullary enum. */
419
426
ast:: pat_ident ( p, none) {
420
- let fnd = lookup_in_scope ( * e, sc, p. span , path_to_ident ( p) ,
421
- ns_val ( ns_a_enum) ) ;
422
- alt fnd {
423
- some( ast:: def_variant ( did, vid) ) {
424
- e. def_map . insert ( pat. id , ast:: def_variant ( did, vid) ) ;
427
+ alt lookup_in_scope ( * e, sc, p. span , path_to_ident ( p) ,
428
+ ns_val ( ns_a_enum) ) {
429
+ some ( fnd@ast:: def_variant ( _, _) ) {
430
+ e. def_map . insert ( pat. id , fnd) ;
425
431
}
426
432
_ {
427
433
// Binds a var -- nothing needs to be done
@@ -587,16 +593,21 @@ fn follow_import(e: env, sc: scopes, path: [ident], sp: span) ->
587
593
let path_len = vec:: len ( path) ;
588
594
let dcur = lookup_in_scope_strict ( e, sc, sp, path[ 0 ] , ns_module) ;
589
595
let i = 1 u;
590
- while true && option:: is_some ( dcur) {
591
- if i == path_len { break ; }
592
- dcur =
593
- lookup_in_mod_strict ( e, option:: get ( dcur) , sp, path[ i] ,
596
+ while true {
597
+ alt dcur {
598
+ some( dcur_def) {
599
+ if i == path_len { break ; }
600
+ dcur =
601
+ lookup_in_mod_strict ( e, dcur_def, sp, path[ i] ,
594
602
ns_module, outside) ;
595
- i += 1 u;
603
+ i += 1 u;
604
+ }
605
+ _ { break; }
606
+ }
596
607
}
597
608
if i == path_len {
598
- alt option :: get ( dcur) {
599
- ast:: def_mod ( _) | ast:: def_native_mod ( _) { ret dcur; }
609
+ alt dcur {
610
+ some ( ast:: def_mod ( _) ) | some ( ast:: def_native_mod ( _) ) { ret dcur; }
600
611
_ {
601
612
e. sess . span_err ( sp, str:: connect ( path, "::" ) +
602
613
" does not name a module." ) ;
@@ -607,20 +618,16 @@ fn follow_import(e: env, sc: scopes, path: [ident], sp: span) ->
607
618
}
608
619
609
620
fn resolve_constr ( e : @env , c : @ast:: constr , sc : scopes , _v : vt < scopes > ) {
610
- let new_def =
611
- lookup_path_strict ( * e, sc, c. span , c. node . path . node ,
612
- ns_val ( ns_any_value) ) ;
613
- if option:: is_some ( new_def) {
614
- alt option:: get ( new_def) {
615
- ast:: def_fn ( pred_id, ast:: pure_fn) {
616
- e. def_map . insert ( c. node . id , ast:: def_fn ( pred_id, ast:: pure_fn) ) ;
617
- }
618
- _ {
619
- e. sess . span_err ( c. span ,
620
- "Non-predicate in constraint: " +
621
- path_to_str ( c. node . path ) ) ;
622
- }
623
- }
621
+ alt lookup_path_strict ( * e, sc, c. span , c. node . path . node ,
622
+ ns_val ( ns_any_value) ) {
623
+ some ( d@ast:: def_fn ( _, ast:: pure_fn) ) {
624
+ e. def_map . insert ( c. node . id , d) ;
625
+ }
626
+ _ {
627
+ e. sess . span_err ( c. span ,
628
+ "Non-predicate in constraint: " +
629
+ path_to_str ( c. node . path ) ) ;
630
+ }
624
631
}
625
632
}
626
633
@@ -744,7 +751,7 @@ fn ns_name(ns: namespace) -> str {
744
751
ns_a_enum { "enum" }
745
752
}
746
753
}
747
- ns_module { ret "modulename" }
754
+ ns_module { "modulename" }
748
755
}
749
756
}
750
757
@@ -814,18 +821,26 @@ fn lookup_path_strict(e: env, sc: scopes, sp: span, pth: ast::path_,
814
821
815
822
let first_scope = if pth. global { top_scope ( ) } else { sc } ;
816
823
817
- let dcur =
824
+ let dcur_ =
818
825
lookup_in_scope_strict ( e, first_scope, sp, pth. idents [ 0 ] , headns) ;
819
826
820
- let i = 1 u;
821
- while i < n_idents && option:: is_some ( dcur) {
822
- let curns = if n_idents == i + 1 u { ns } else { ns_module } ;
823
- dcur =
824
- lookup_in_mod_strict ( e, option:: get ( dcur) , sp, pth. idents [ i] ,
825
- curns, outside) ;
826
- i += 1 u;
827
+ alt dcur_ {
828
+ none { ret none; }
829
+ some ( dcur__) {
830
+ let i = 1 u;
831
+ let dcur = dcur__;
832
+ while i < n_idents {
833
+ let curns = if n_idents == i + 1 u { ns } else { ns_module } ;
834
+ alt lookup_in_mod_strict ( e, dcur, sp, pth. idents [ i] ,
835
+ curns, outside) {
836
+ none { break; }
837
+ some ( thing) { dcur = thing; }
838
+ }
839
+ i += 1 u;
840
+ }
841
+ ret some( dcur) ;
842
+ }
827
843
}
828
- ret dcur;
829
844
}
830
845
831
846
fn lookup_in_scope_strict ( e : env , sc : scopes , sp : span , name : ident ,
@@ -985,11 +1000,11 @@ fn lookup_in_scope(e: env, sc: scopes, sp: span, name: ident, ns: namespace)
985
1000
alt copy sc {
986
1001
nil { ret none; }
987
1002
cons ( hd, tl) {
988
- let fnd = in_scope ( e, sp, name, hd, ns) ;
989
- if ! is_none ( fnd ) {
990
- let df = option :: get ( fnd ) ;
991
- let local = def_is_local ( df) , self_scope = def_is_self ( df) ;
992
- if left_fn && local || left_fn_level2 && self_scope
1003
+ alt in_scope ( e, sp, name, hd, ns) {
1004
+ some ( df_ ) {
1005
+ let df = df_ ;
1006
+ let local = def_is_local ( df) , self_scope = def_is_self ( df) ;
1007
+ if left_fn && local || left_fn_level2 && self_scope
993
1008
|| scope_is_fn ( hd) && left_fn && def_is_ty_arg ( df) {
994
1009
let msg = alt ns {
995
1010
ns_type {
@@ -1013,12 +1028,13 @@ fn lookup_in_scope(e: env, sc: scopes, sp: span, name: ident, ns: namespace)
1013
1028
i -= 1 u;
1014
1029
df = ast:: def_upvar ( def_id_of_def ( df) , @df,
1015
1030
closing[ i] ) ;
1016
- fnd = some ( df) ;
1017
1031
}
1018
1032
}
1019
- ret fnd ;
1033
+ ret some ( df ) ;
1020
1034
}
1021
- if left_fn {
1035
+ _ { }
1036
+ }
1037
+ if left_fn {
1022
1038
left_fn_level2 = true ;
1023
1039
} else if ns != ns_module {
1024
1040
left_fn = scope_is_fn ( hd) ;
@@ -1193,7 +1209,10 @@ fn found_def_item(i: @ast::item, ns: namespace) -> option<def> {
1193
1209
_ { }
1194
1210
}
1195
1211
}
1196
- _ { }
1212
+ ast:: item_class ( _, _, _, _, _) {
1213
+ fail "class! don't know what to do" ;
1214
+ }
1215
+ ast:: item_impl ( _, _, _, _) { /* ??? */ }
1197
1216
}
1198
1217
ret none;
1199
1218
}
@@ -1220,12 +1239,13 @@ fn lookup_in_mod(e: env, m: def, sp: span, name: ident, ns: namespace,
1220
1239
if defid. node != ast:: crate_node_id {
1221
1240
path = cstore:: get_path ( e. cstore , defid) + path;
1222
1241
}
1223
- let fnd = lookup_external ( e, defid. crate , path, ns) ;
1224
- if !is_none ( fnd) {
1225
- e. ext_cache . insert ( { did: defid, ident: name, ns: ns} ,
1226
- option:: get ( fnd) ) ;
1242
+ alt lookup_external ( e, defid. crate , path, ns) {
1243
+ some ( df) {
1244
+ e. ext_cache . insert ( { did: defid, ident: name, ns: ns} , df) ;
1245
+ ret some( df) ;
1246
+ }
1247
+ _ { ret none; }
1227
1248
}
1228
- ret fnd;
1229
1249
}
1230
1250
alt m {
1231
1251
ast : : def_mod ( defid) {
@@ -1263,7 +1283,7 @@ fn lookup_import(e: env, defid: def_id, ns: namespace) -> option<def> {
1263
1283
e. used_imports . data += [ defid. node ] ;
1264
1284
}
1265
1285
ret alt ns { ns_val( _) { val } ns_type { typ }
1266
- ns_module { md } } ;
1286
+ ns_module { md } } ;
1267
1287
}
1268
1288
is_glob ( _, _, _) {
1269
1289
e. sess . bug ( "lookup_import: can't handle is_glob" ) ;
@@ -1398,6 +1418,18 @@ fn lookup_in_mie(e: env, mie: mod_index_entry, ns: namespace) ->
1398
1418
}
1399
1419
}
1400
1420
}
1421
+ mie_class_item ( parent_id, class_item) {
1422
+ alt class_item. node . decl {
1423
+ instance_var ( _, _, _, id) {
1424
+ ret some ( ast:: def_class_field ( local_def ( parent_id) ,
1425
+ local_def ( id) ) ) ;
1426
+ }
1427
+ class_method ( it) {
1428
+ ret some ( ast:: def_class_method ( local_def ( parent_id) ,
1429
+ local_def ( it. id ) ) ) ;
1430
+ }
1431
+ }
1432
+ }
1401
1433
}
1402
1434
ret none;
1403
1435
}
@@ -1452,8 +1484,21 @@ fn index_mod(md: ast::_mod) -> mod_index {
1452
1484
variant_idx += 1 u;
1453
1485
}
1454
1486
}
1455
- ast:: item_class ( _, items, _, ctor_decl, _) {
1456
- fail "resolve::index_mod: item_class" ;
1487
+ ast:: item_class ( tps, items, ctor_id, ctor_decl, ctor_body) {
1488
+ // add the class name itself
1489
+ add_to_index ( index, it. ident , mie_item ( it) ) ;
1490
+ // add the constructor decl
1491
+ add_to_index ( index, it. ident ,
1492
+ mie_item ( @{ ident: it. ident , attrs: [ ] ,
1493
+ id: ctor_id,
1494
+ node:
1495
+ item_fn ( ctor_decl, tps, ctor_body) ,
1496
+ span: ctor_body. span } ) ) ;
1497
+ // add the members
1498
+ for ci in items {
1499
+ add_to_index ( index, class_item_ident ( ci) ,
1500
+ mie_class_item ( it. id , ci) ) ;
1501
+ }
1457
1502
}
1458
1503
}
1459
1504
}
@@ -1494,11 +1539,13 @@ fn ns_for_def(d: def) -> namespace {
1494
1539
ast : : def_variant ( _, _) { ns_val ( ns_a_enum) }
1495
1540
ast:: def_fn ( _, _) | ast:: def_self ( _) |
1496
1541
ast:: def_const ( _) | ast:: def_arg ( _, _) | ast:: def_local ( _, _) |
1497
- ast:: def_upvar ( _, _, _) | ast:: def_self ( _) { ns_val ( ns_any_value) }
1542
+ ast:: def_upvar ( _, _, _) | ast:: def_self ( _) |
1543
+ ast:: def_class_field ( _, _) | ast:: def_class_method ( _, _)
1544
+ { ns_val ( ns_any_value) }
1498
1545
ast:: def_mod ( _) | ast:: def_native_mod ( _) { ns_module }
1499
1546
ast:: def_ty ( _) | ast:: def_binding ( _) | ast:: def_use ( _) |
1500
- ast:: def_ty_param ( _, _) | ast:: def_prim_ty ( _) { ns_type }
1501
- _ { fail "Dead" ; }
1547
+ ast:: def_ty_param ( _, _) | ast:: def_prim_ty ( _) | ast :: def_class ( _ )
1548
+ { ns_type }
1502
1549
}
1503
1550
}
1504
1551
@@ -1583,6 +1630,7 @@ fn mie_span(mie: mod_index_entry) -> span {
1583
1630
mie_item ( item) { item. span }
1584
1631
mie_enum_variant ( _, _, _, span) { span }
1585
1632
mie_native_item ( item) { item. span }
1633
+ mie_class_item ( _, item) { item. span }
1586
1634
} ;
1587
1635
}
1588
1636
0 commit comments